🔧 ESP32-C6 实战:用 HC-SR501 打造智能人体感应灯(附完整代码)
在物联网项目中,人体感应控制是非常基础且实用的功能,比如自动感应灯、智能门禁提醒等。今天就带大家从零开始,用 ESP32-C6 WROOM-1 主控板搭配 HC-SR501 人体红外传感器,实现 “人来灯亮,人走灯灭” 的智能效果,全程干货,新手也能轻松上手!
📦 所需硬件清单
主控板:ESP32-C6 WROOM-1(性能强,支持 WiFi,适合物联网扩展)
传感器:HC-SR501 人体红外传感器(检测人体移动,灵敏度可调节)
执行元件:LED 灯(普通直插或贴片均可)
辅助元件:220Ω 限流电阻(保护 LED 和 GPIO 引脚)
连接线:杜邦线若干
电源:5V USB 电源或电池模块
🔌 硬件接线指南(超详细)
接线是项目成功的关键,大家一定要对照清楚,避免接错烧毁元件:
| 元件 | 引脚 | ESP32-C6 对应引脚 | 备注说明 |
|---|---|---|---|
| HC-SR501 | VCC | 5V 或 3.3V | 多数模块兼容两种电压 |
| HC-SR501 | GND | GND | 共地是电路稳定的前提 |
| HC-SR501 | OUT | GPIO20 | 传感器信号输出脚 |
| LED 灯 | 正极(长脚) | GPIO18(经电阻) | 必须串联 220Ω 限流电阻 |
| LED 灯 | 负极(短脚) | GND | 直接接地即可 ⚠️ 重要提醒:LED 灯的正极一定要串联限流电阻,否则过高的电流会烧毁 ESP32-C6 的 GPIO 引脚,也可能直接烧坏 LED 灯。 |
🚀 Arduino IDE 代码实现(完整可直接上传)
首先确保你的 Arduino IDE 已经安装了 ESP32-C6 的开发板支持(在 Boards Manager 中搜索 “ESP32”,安装最新版本),然后复制以下代码,修改引脚定义(如果你的接线和本文不同),即可直接上传。
// 引脚定义
#define PIR_SENSOR_PIN 20 // HC-SR501的OUT引脚连接到ESP32-C6的GPIO20
#define LED_PIN 18 // LED的控制引脚连接到ESP32-C6的GPIO18
// 状态变量
bool motionDetected = false; // 检测到运动的状态标记
unsigned long lastMotionTime = 0; // 最后一次检测到运动的时间戳
const unsigned long lightOffDelay = 5000; // 人离开后延迟关灯时间(5000毫秒=5秒)
void setup() {
// 初始化引脚模式
pinMode(PIR_SENSOR_PIN, INPUT); // PIR传感器设为输入模式
pinMode(LED_PIN, OUTPUT); // LED设为输出模式
// 初始化串口通信(用于调试,波特率115200)
Serial.begin(115200);
// 初始状态关闭LED
digitalWrite(LED_PIN, LOW);
// 系统启动提示
Serial.println("✨ 人体感应灯系统启动中...");
delay(2000); // 等待PIR传感器预热稳定(关键步骤)
Serial.println("✅ 系统就绪,等待人体感应...");
}
void loop() {
// 实时读取PIR传感器的状态(高电平=检测到人体,低电平=无人体)
motionDetected = digitalRead(PIR_SENSOR_PIN);
// 检测到人体活动时
if (motionDetected) {
digitalWrite(LED_PIN, HIGH); // 点亮LED灯
lastMotionTime = millis(); // 更新最后一次检测到运动的时间
Serial.println("🔆 检测到人体活动,LED已开启");
} else {
// 未检测到人体时,判断是否超过延迟时间
if (millis() - lastMotionTime > lightOffDelay) {
digitalWrite(LED_PIN, LOW); // 超过延迟,关闭LED
Serial.println("🌙 未检测到人体活动,LED已关闭");
}
}
delay(100); // 短暂延迟,避免频繁检测导致CPU占用过高
}
📝 代码核心逻辑解析
- 引脚初始化:明确 PIR 传感器为输入模式,LED 为输出模式,确保硬件能正常通信。
- 传感器预热:HC-SR501 上电后需要 2 秒左右的预热时间,这段时间内检测结果不稳定,所以在 setup 函数中加入延迟。
- 实时检测:在 loop 函数中不断读取 PIR 传感器的状态,一旦检测到高电平(人体移动),立即点亮 LED 并记录当前时间。
- 延迟关灯:当传感器检测不到人体时,并非立即关灯,而是等待设定的延迟时间(默认 5 秒),避免人短暂离开导致灯频繁开关。
- 调试信息:通过串口输出状态信息,方便大家排查问题(比如传感器是否正常工作、LED 是否响应)。
⚙️ 优化与扩展建议
- 调节灵敏度:HC-SR501 模块上有两个电位器,一个调节感应距离(最远可达 7 米),另一个调节持续触发时间,可根据实际场景手动调节。
- 修改延迟时间:代码中的
lightOffDelay变量可直接修改,比如改为 10000(10 秒)或 3000(3 秒),适配不同场景。 - 添加 WiFi 功能:ESP32-C6 支持 WiFi,可添加 MQTT 通信代码,将感应状态上传到物联网平台(如 Home Assistant),实现远程监控。
- 替换执行元件:将 LED 换成继电器模块,可控制更大功率的设备(如台灯、排风扇),打造真正的智能家电控制。
🚨 常见问题排查
- LED 不亮:检查接线是否正确,限流电阻是否串联;用串口监视器查看是否有 “检测到人体活动” 的提示,判断传感器是否工作。
- 灯一直亮:可能是 PIR 传感器被遮挡或处于不稳定环境(如风扇直吹),尝试更换安装位置;也可检查模块上的电位器是否调节不当。
- 检测灵敏度低:旋转 HC-SR501 上的灵敏度电位器(通常标注 “SENS”),顺时针旋转可增加感应距离。
🌟 总结
这个项目难度较低,非常适合物联网新手入门,既能熟悉 ESP32-C6 的基本用法,又能掌握 HC-SR501 传感器的工作原理。通过简单的代码和接线,就能实现实用的智能功能,大家可以根据自己的需求进行扩展,打造更多有趣的物联网项目!
如果在实践过程中有任何问题,欢迎在评论区留言交流,祝大家项目顺利!🎉

