ESP32 Arduino项目:夜间断电后LED无法自动恢复点亮问题求助
问题分析
你现在的代码逻辑是只在19:00:00和06:00:00这两个精确到秒的时间点执行开关灯操作。一旦夜间断电重启,设备错过了19:00的触发时刻,就不会主动判断当前是否处于夜间时段,自然不会点亮LED,只会等第二天6:00执行关灯动作。
修复方案
核心思路是每次获取到NTP时间后,直接判断当前是否在「19:00-次日06:00」区间内,实时同步LED状态,而不是只依赖整点触发。修改后的完整代码如下:
#include <NTPClient.h> #include <WiFiUdp.h> #include <WiFi.h> #define LED 2 #define command 4 #define sensor 19 const char* ssid = "SSID_NETWORK"; const char* password = "PASS_NETWORK"; WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "pool.ntp.org"); // 根据当前时间设置LED和传感器状态 void setNightModeState() { int currentHour = timeClient.getHours(); // 判断是否处于夜间时段:19点到23点,或者0点到5点 bool isNightTime = (currentHour >= 19 && currentHour <= 23) || (currentHour >= 0 && currentHour < 6); if (isNightTime) { digitalWrite(LED, HIGH); digitalWrite(sensor, HIGH); } else { digitalWrite(LED, LOW); digitalWrite(sensor, LOW); } } void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Conectando ao WiFi..."); } Serial.println("Conectado ao WiFi."); digitalWrite(LED, HIGH); delay(100); digitalWrite(LED, LOW); timeClient.begin(); timeClient.setTimeOffset(-3 * 3600); // 巴西时区GMT-3 // 等待NTP时间同步完成 while(!timeClient.update()) { timeClient.forceUpdate(); delay(1000); Serial.println("Sincronizando horário NTP..."); } pinMode (LED, OUTPUT); pinMode (sensor, OUTPUT); pinMode (command, OUTPUT); // 初始化时立即设置正确的夜间模式状态 setNightModeState(); } void loop() { // 每10秒更新一次时间并检查状态(避免过于频繁) if(timeClient.update()) { Serial.println(timeClient.getFormattedTime()); setNightModeState(); } delay(10000); // 10秒延迟,减少资源消耗 }
关键改动说明
- 封装状态设置逻辑:新增
setNightModeState函数,把时段判断和硬件状态设置整合在一起,代码更简洁易维护 - 强制NTP同步:初始化阶段等待时间同步完成,避免设备重启后因时间未就绪导致状态错误
- 实时时段判断:不再依赖精确整点触发,只要当前时间在夜间区间,就保持LED点亮;反之则关闭,彻底解决重启后不亮灯的问题
- 优化资源占用:把原有的100毫秒延迟改为10秒,减少串口打印和NTP请求频率,降低ESP32的资源消耗
内容的提问来源于stack exchange,提问作者Bruno Barreto
相关产品推荐
相关产品推荐

