ESP32教程31/55 - 带避障功能的LED灯带项目 | SunFounder的ESP32物联网学习套件
在本教程中,我们将使用ESP32微控制器和WS2812 LED灯带创建一个项目,该项目可以根据障碍物检测改变其方向。当LED灯带向前移动时,它会显示随机颜色,而在检测到障碍物时,它会切换为预设颜色并反转方向。该项目展示了ESP32与红外避障传感器结合使用的能力。
在整个教程中,我们将介绍所需的硬件组件、接线说明以及实现该项目所需的代码。如需更直观的解释,请务必观看下方链接的视频(视频中00:00处)。
硬件说明
该项目需要多个组件,包括ESP32微控制器、WS2812 LED灯带和红外避障传感器。ESP32是一款功能强大的微控制器,内置Wi-Fi和蓝牙,非常适合物联网应用。WS2812 LED灯带是可编程RGB LED灯带,允许对每个LED进行单独控制,使我们能够创建动态照明效果。
红外避障传感器通过发射红外光并检测附近物体的反射来工作。当检测到障碍物时,传感器的输出状态会改变,使ESP32能够相应地响应,从而改变LED灯带的行为。
数据手册详情
| 制造商 | WS2812B |
|---|---|
| 零件编号 | WS2812B |
| 逻辑/IO电压 | 3.3 V(典型值) |
| 电源电压 | 5 V(典型值) |
| 输出电流(每通道) | 20 mA(最大值) |
| 峰值电流(每通道) | 60 mA(最大值) |
| PWM频率指导 | 400 Hz(典型值) |
| 输入逻辑阈值 | 0.3 Vcc(高电平),0.1 Vcc(低电平) |
| 压降 / RDS(on) / 饱和 | 1.2 V(最大值) |
| 热限制 | 85 °C(最大值) |
| 封装 | 表面贴装 |
| 备注 / 变体 | 有多种长度和密度可选 |
- 确保LED灯带使用5 V电源供电,以获得最佳性能。
- 在数据引脚上使用合适的电阻,以防止信号完整性问题。
- 注意输出电流限制,避免过热。
- 正确解耦电源,以防止电压尖峰。
- 仔细调整红外传感器,以达到所需的检测范围。
接线说明

要连接组件,首先从红外避障传感器开始。将传感器的输出引脚连接到ESP32上的引脚25。中间引脚应连接到地线,最后一个引脚(VCC)应连接到3.3 V电源。
接下来,对于WS2812 LED灯带,将数据引脚(通常是黄色线)连接到ESP32上的引脚14。红色线应连接到5 V电源,黑色线应连接到地线。确保所有连接都牢固,以防止线路松动。
代码示例与讲解
以下是运行此项目的代码简要概述。首先,我们定义LED灯带中的像素数量以及用于通信的数据引脚:
#define NUM_PIXELS 8
#define DATA_PIN 14
在setup()函数中,我们初始化LED灯带和红外传感器:
void setup() {
pixels.begin();
pinMode(AVOID_PIN, INPUT_PULLUP);
uint32_t color = pixels.Color(random(256), random(256), random(256));
pixels.fill(color);
pixels.show();
}
在loop()函数中,我们检查是否检测到障碍物,并相应地控制LED灯带:
if (avoid_value) {
for (int i = 0; i < NUM_PIXELS; i++) {
pixels.setPixelColor(i, color);
pixels.show();
pixels.setPixelColor(i, 0);
delay(100);
}
} else {
for (int i = NUM_PIXELS - 1; i >= 0; i--) {
pixels.setPixelColor(i, color);
pixels.show();
pixels.setPixelColor(i, 0);
delay(100);
}
}
这段代码使LED灯带在向前移动时显示随机颜色,并在检测到障碍物时改变方向。完整代码加载在文章下方,请务必查看以获取所有细节。
演示 / 预期效果
当设置完成并上传代码后,LED灯带应开始向前移动并显示随机颜色。当检测到障碍物时,灯带将切换为预设颜色(如绿色)并反转方向。如果移除障碍物,灯带将恢复向前移动并显示随机颜色。请注意,红外传感器的检测范围可能因所使用的电源而异(视频中10:30处)。
视频时间戳
- 00:00 开始
- 2:14 项目介绍
- 4:58 接线说明
- 7:41 调整避障传感器
- 10:03 Arduino代码说明
- 15:40 在Arduino IDE中选择ESP32开发板和COM端口
- 17:22 项目1:演示
- 18:17 更改返回颜色
#include <Adafruit_NeoPixel.h>
// 设置运行灯的像素数量
#define NUM_PIXELS 8
// 设置RGB LED灯带的数据引脚
#define DATA_PIN 14
// 初始化 RGB LED 灯带对象
Adafruit_NeoPixel pixels(NUM_PIXELS, DATA_PIN, NEO_GRB + NEO_KHZ800);
// 初始化避让传感器
#define AVOID_PIN 25
void setup() {
// 初始化RGB LED灯带
pixels.begin();
// 初始化避让传感器
pinMode(AVOID_PIN, INPUT_PULLUP);
// 设置初始 LED 颜色
uint32_t color = pixels.Color(random(256), random(256), random(256));
pixels.fill(color);
pixels.show();
}
void loop() {
// 从红外传感器读取输入
bool avoid_value = digitalRead(AVOID_PIN);
// 为当前像素生成一种随机颜色
uint32_t color = pixels.Color(random(256), random(256), random(256));
// 如果未检测到障碍物
if (avoid_value) {
for (int i = 0; i < NUM_PIXELS; i++) {
// 用随机颜色点亮当前像素
pixels.setPixelColor(i, color);
// 更新RGB LED灯带显示器
pixels.show();
// 关闭当前像素
pixels.setPixelColor(i, 0);
delay(100);
}
}
// 如果检测到障碍物,请改变LED灯带的方向。
else {
for (int i = NUM_PIXELS - 1; i >= 0; i--) {
pixels.setPixelColor(i, color);
pixels.show();
pixels.setPixelColor(i, 0);
delay(100);
}
}
}
Common Course Links
Common Course Files
资源与参考
-
文档ESP32教程 31/55 - SunFounder流光文档页面docs.sunfounder.com
文件📁
没有可用的文件。