ESP32教程22/55 - 使用LED Arduino感受光线 | SunFounder的ESP32物联网学习套件
在本教程中,我们将探讨如何使用ESP32微控制器配合光敏电阻(LDR)来测量光照强度。通过读取LDR的电阻值,我们可以触发相应操作,例如当光照水平超过某个阈值时打开蜂鸣器。本项目将演示光照水平与ESP32模拟读取功能之间的交互,使我们能够根据环境光创建响应式应用。(视频中5:30处)
硬件说明
本项目中使用的主要组件包括ESP32微控制器、一个LDR和一个10 kΩ电阻。LDR会根据照射到其表面的光照强度改变电阻值:光照越强,电阻越低;光照越弱,电阻越高。这一特性使我们能够通过将LDR与电阻以分压配置连接来测量不同的光照水平。
ESP32微控制器内置Wi-Fi和蓝牙功能,非常适合物联网项目。它有多个模拟引脚,可以读取不同的电压水平,我们将利用这些引脚来监测LDR两端的电压。该电压将被转换为ESP32可以处理的模拟值,并用于触发诸如激活蜂鸣器之类的操作。
数据手册详情
| 制造商 | 乐鑫科技 |
| 型号 | ESP32 |
| 逻辑/IO电压 | 3.3 V |
| 供电电压 | 3.0 - 3.6 V |
| 输出电流(每个GPIO) | 最大40 mA |
| PWM频率建议 | 1 kHz - 40 kHz |
| 输入逻辑阈值 | 高电平:最低2.0 V,低电平:最高0.8 V |
| 压降 / RDS(on) / 饱和 | 最大0.3 V |
| 热限制 | -40 °C 至 125 °C |
| 封装 | QFN48 |
| 备注 / 变体 | 支持多种Wi-Fi和蓝牙协议 |
- 使用一个10 kΩ电阻与LDR串联进行分压。
- 确保ESP32以3.3 V供电,以免损坏。
- 正确连接LDR和电阻以测量光照强度。
- 如有需要,可使用去耦电容来稳定电源。
- 检查模拟读取值,确保其在预期范围内。
接线说明
ESP32-22_light_sensor-wiring
要将LDR和电阻连接到ESP32,首先将LDR的一个端子连接到ESP32上的3.3 V电源引脚。LDR的另一个端子应连接到10 kΩ电阻的一个端子。将电阻的另一个端子连接到地线。
接下来,从LDR和电阻之间的连接点引出一根跳线,连接到ESP32上的35号引脚。这种设置构成了一个分压器,使ESP32能够根据照射到LDR上的光照强度读取变化的电压。确保所有连接牢固,并且LDR放置在能够准确感应光照变化的位置。
代码示例与讲解
在代码中,我们首先初始化串口通信以监测LDR的读数。这里的关键标识符是analogValue,它存储来自35号引脚的读数。
void setup() {
Serial.begin(115200);
}
void loop() {
int analogValue = analogRead(35);
Serial.printf("ADC analog value = %d\n",analogValue);
delay(100);
}
这段代码以115200的波特率初始化串口监视器,并持续读取35号引脚的模拟值。该值被打印到串口监视器上,使我们能够观察它如何随光照水平的变化而变化。
当光照强度变化时,LDR的电阻会随之改变,因此ESP32读取到的电压也会变化,从而反映光照条件(视频中12:45处)。
演示 / 预期效果
当你运行程序并观察串口监视器时,应该会看到ADC analog value根据环境光照条件波动。当你遮住LDR时,该值应增大,表示电阻增大;而将其暴露在强光下时,该值会显著降低。这种行为可用于根据预设阈值触发蜂鸣器或其他操作。
如果读数没有按预期变化,请检查接线问题,确保LDR没有悬空,并确认ESP32供电正常。这将有助于避免常见错误并确保平稳运行(视频中15:30处)。
视频时间戳
- 00:00 开始
-
1:48 LDR介绍
-
8:33 接线说明
-
11:07 Arduino代码讲解
-
13:07 在Arduino IDE中选择ESP32开发板和COM端口
-
14:49 读取值演示
-
17:24 理解白天和夜晚的值
-
18:47 DAC值与电压读取
图像
ESP32-22_light_sensor
ESP32-22_light_sensor-wiring
ESP32-22_light_sensor-wiring
821-ESP32 Tutorial 22/55- Arduino code for Light dependant resistor
语言: C++
void setup() {
// 以115200比特每秒初始化串行通信:
Serial.begin(115200);
}
void loop() {
// 读取模拟值
int analogValue = analogRead(35);
// 打印您读取的值:
Serial.printf("ADC analog value = %d\n",analogValue);
delay(100); // 在串口之间读取时延,以确保读取清晰
}