You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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默认超时时间太长,容易阻塞触发看门狗:

  1. HTTP请求的路径必须是绝对路径(不能带localhost),Host字段要填服务器的实际IP
  2. 给client.connect设置超时时间,避免长时间阻塞
  3. 发送完请求后要关闭客户端连接,避免资源泄漏

修改后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 13:17:44