### 4.3.9 光敏传感器

#### 4.3.9.1 简介

本教程将为您详细介绍光敏传感器的使用方法和应用技巧。光敏传感器是一种能够检测环境光强度的电子元件，常用于自动照明控制、光强监测和节能系统。教程内容包括光敏传感器的工作原理、类型（如光敏电阻、光电二极管）、电路连接方法以及如何通过微控制器（如ESP32）读取光强数据。您将学习如何编写代码来获取实时光强值，并根据光强变化触发相应的控制动作，如自动开关灯、调节屏幕亮度等。无论您是电子初学者还是有经验的开发者，本教程都将帮助您掌握光敏传感器的应用，为您的项目增添智能的光感应功能。

#### 4.3.9.2 元件知识

![Img](../media/cou2.png)

**光敏传感器:** 也称光电传感器，是利用光电器件把光信号转换成电信号的一种传感器。其中最核心的是传感器模块上有一颗光敏电阻。光敏电阻是利用硫化镉或硒化镉等半导体材料的光电导效应制成的一种电阻值随入射光的强弱而改变的电阻器。

**原理图：**

![Img](../media/couy21.png)

当没有光照射时，电阻大小约为0.5 MΩ，光敏电阻的信号端（2脚）检测的电压接近0。当光照到光敏电阻时，随着光照强度增大，光敏电阻的阻值越来越小，VCC电压从光敏电阻通过的电压就越大，所以信号端S能检测到的电压也越来越大。

**参数：**

- 工作电压: DC 3.3V~5V
- 工作电流: (Max)0.2mA@5V
- 最大功率: 0.001W
- 光谱峰值: 540nm
- 亮电阻(10lux): 5~10KΩ
- 暗电阻: 0.5MΩ

#### 4.3.9.3 接线图

- **光敏传感器的S引脚连接到io34**

⚠️ **特别注意：智慧农场已经组装好了，这里不需要把光敏传感器拆下来又重新组装和接线，这里再次提供接线图，是为了方便您编写代码！**

![Img](../media/couj21.png)

#### 4.3.9.4 实验代码

代码文件在`Arduino_代码`文件夹中，代码文件为`4_3_9_Photoresistor`，如下图所示：

![Img](../media/couj11.png)

鼠标双击`4_3_9_Photoresistor.ino`即可在Arduino IDE中打开。

```c++
/*
 * 文件名 : Photoresistor
 * 功能   : 读取光敏传感器的值
 * 编译IDE：ARDUINO 2.3.6
 * 作者   : https://www.keyesrobot.cn/
*/

const int Photoresistor_Pin = 34;   //光敏电阻的引脚定义为GPIO34

void setup() {
  //初始化串口
  Serial.begin(9600);
  //设置光敏引脚为输入模式
  pinMode(Photoresistor_Pin,INPUT);
}

void loop() {
  //读取光敏传感器的值
  int ReadValue = analogRead(Photoresistor_Pin);
  //打印值，注意：ESP32开发板是12-bit的ADC，读取到的值范围：0~4095
  Serial.print("Photoresistor value: ");
  Serial.println(ReadValue);
  delay(500);
}
```

#### 4.3.9.5 实验结果

按照接线图接好线，外接电源，选择好正确的开发板板型（ESP32 Dev Module）和 适当的串口端口（COMxx），然后单击按钮![Img](../media/cou0.png)上传代码。上传代码成功后，单击Arduino IDE右上角的![Sarial](../media/Sarial.png)打开串口监视器窗口并设置串口波特率为`9600`，即可通过串口打印窗口查看光敏传感器的模拟值，光线越亮模拟值越高，光线越暗模拟值越低，用手遮住光线模拟环境光线变暗。 

![Img](../media/Photor-1.jpg)

**串口现象图：**

![Img](../media/Photordata.png)

#### 4.3.9.6 代码说明

（1）.  定义光敏传感器的模拟管脚为GPIO34。

```c++
const int Photoresistor_Pin = 34;   //定义光敏传感器引脚
```

（2）. 在`setup()`函数中，设置串口波特率，并且将光敏传感器引脚设置为输入模式。

```c++
void setup() {
  //初始化串口
  Serial.begin(9600);
  //设置光敏引脚为输入模式
  pinMode(Photoresistor_Pin,INPUT);
}
```

（3）. 在`loop()`函数中，从光敏传感器指定的模拟引脚读取模拟值。为了兼容ESP32 主控板，设置 `analogRead()` 的分辨率为 12 位。从指定的模拟引脚 Photoresistor_Pin 读取光敏传感器的模拟信号，模拟信号的范围：0 ~ 4095，并且在串口监视器窗口打印模拟信号。

```c++
void loop() {
  //读取光敏传感器的值
  int ReadValue = analogRead(Photoresistor_Pin);
  //打印值，注意：ESP32开发板是12-bit的ADC，读取到的值范围：0~4095
  Serial.print("Photoresistor value: ");
  Serial.println(ReadValue);
  delay(500);
}
```

详细了解请参考链接：[https://docs.arduino.cc/language-reference/en/functions/analog-io/analogRead/](https://docs.arduino.cc/language-reference/en/functions/analog-io/analogRead/) 。