ESP8266 NodeMCU通过WiFiClient向URL发送DHT11数据时频繁WDT复位问题求助
ESP8266 NodeMCU通过WiFiClient向URL发送DHT11数据时频繁WDT复位问题求助
兄弟,我仔细看了你的代码和遇到的问题,频繁出现的wdt reset(看门狗复位)是ESP8266常见的稳定性问题,主要原因是系统长时间阻塞或者内存资源不足,咱们一步步来排查解决:
一、先修正代码里的低级错误
你代码里把DHT11的温湿度数据搞反了!这不仅会导致数据错误,还可能在某些异常场景下引发系统不稳定:
// 原错误代码: humidityData = DHT.temperature; temperatureData = DHT.humidity; // 修正后: humidityData = DHT.humidity; temperatureData = DHT.temperature;
二、移除未使用的库,释放内存
你的代码里包含了一堆根本没用到的库(ESP8266WebServer.h、ESP8266mDNS.h、SPI.h、MFRC522.h),这些库会占用宝贵的RAM和Flash空间,直接导致系统稳定性下降,触发看门狗复位。把这些没用的#include删掉:
// 只保留需要的库: #include <dht.h> #include <ESP8266WiFi.h> #include <WiFiClient.h>
三、优化WiFi连接逻辑,避免无限阻塞
原代码里的WiFi连接是无限循环,如果WiFi信号差或者配置错误,会一直卡在while里阻塞主线程,直接触发看门狗。给连接加超时限制,超过次数就重启模块:
void setup() { Serial.begin(115200); delay(10); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); int wifiAttempts = 0; const int maxAttempts = 10; // 最多尝试10次 while (WiFi.status() != WL_CONNECTED && wifiAttempts < maxAttempts) { delay(500); Serial.print("."); wifiAttempts++; } if(WiFi.status() != WL_CONNECTED){ Serial.println("\nWiFi连接失败,即将重启模块"); ESP.restart(); // 重启尝试重新连接 } Serial.println(""); Serial.println("WiFi connected"); Serial.print("本地IP:"); Serial.println(WiFi.localIP()); }
四、修复HTTP请求格式,优化客户端连接
你的HTTP请求格式有问题,而且client.connect默认超时时间太长,容易阻塞触发看门狗:
- HTTP请求的路径必须是绝对路径(不能带
localhost),Host字段要填服务器的实际IP - 给
client.connect设置超时时间,避免长时间阻塞 - 发送完请求后要关闭客户端连接,避免资源泄漏
修改后的Sending_To_phpmyadmindatabase函数:
void Sending_To_phpmyadmindatabase() { // 设置5秒连接超时,避免长时间阻塞 if (client.connect(server, 80, 5000)) { Serial.println("已连接到服务器"); // 组装正确的HTTP GET请求 String request = "GET /michael/dht11.php?humidity=" + String(humidityData) + "&temperature=" + String(temperatureData) + " HTTP/1.1\r\n"; request += "Host: " + String(server) + "\r\n"; // 用server变量的IP作为Host request += "Connection: close\r\n\r\n"; Serial.print("发送请求:"); Serial.println(request); client.print(request); // 读取服务器响应(可选,避免客户端资源占用) while(client.connected()){ if(client.available()){ String line = client.readStringUntil('\n'); Serial.println(line); } } // 关闭客户端连接 client.stop(); Serial.println("连接已关闭"); } else { // 连接失败时也要确保客户端关闭 if(client.connected()){ client.stop(); } Serial.println("服务器连接失败"); } }
五、优化DHT11读取逻辑,确保数据有效
添加DHT11读取结果的校验,避免无效数据导致后续逻辑异常:
void loop() { ESP.wdtFeed(); // 手动喂看门狗,防止短暂阻塞触发复位 int chk = DHT.read11(DHTPIN); if(chk == DHTLIB_OK){ humidityData = DHT.humidity; temperatureData = DHT.temperature; Serial.print("采集到数据:温度="); Serial.print(temperatureData); Serial.print("℃,湿度="); Serial.print(humidityData); Serial.println("%"); Sending_To_phpmyadmindatabase(); } else { Serial.print("DHT11读取失败,错误码:"); Serial.println(chk); } delay(30000); }
六、硬件检查
确保DHT11的接线正确:
- VCC接3.3V(ESP8266是3.3V电平,不要接5V)
- GND接模块GND
- DATA引脚接GPIO2(NodeMCU的D4引脚)
- 最好在DATA和VCC之间加一个10K的上拉电阻,提升数据读取稳定性
按照以上步骤优化后,应该能解决看门狗复位的问题,同时也能保证数据发送的正确性。
备注:内容来源于stack exchange,提问作者XmlShark
相关产品推荐
相关产品推荐

