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

ESP32搭配DHT11使用DHT_nonblocking库无有效数据输出问题

解决DHT_nonblocking集成到ESP32异步Web服务器的温湿度数据异常问题

问题根源

DHT_nonblocking是非阻塞式采样库,它不像传统DHT库那样单次调用就读取数据,而是需要在主循环里持续调用dht.tick(),由库自己判断合适的时机完成传感器采样和解析。如果你的异步Web服务器代码里没做好这个调用逻辑,或者在回调里错误地读取数据,就会导致数据一直停留在初始的0或空值。

具体修复方案

1. 全局变量正确声明

把传感器实例和温湿度变量设为全局,保证Web服务器的回调能拿到最新数据:

#include <Arduino.h>
#include <WiFi.h>
#include <AsyncWebServer.h>
#include <DHT_nonblocking.h>

#define DHT_TYPE DHT_TYPE_11
#define DHT_PIN 27

// 全局传感器实例
DHT_nonblocking dht_sensor(DHT_PIN, DHT_TYPE);

// 存储最新采样的温湿度
float current_temp = 0.0f;
float current_humidity = 0.0f;

const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
AsyncWebServer server(80);

2. 主循环必须持续调用tick()

在loop()里一定要不停调用tick(),并且在传感器返回有效数据时更新全局变量:

void loop() {
  // 这行是核心,必须一直调用,不能丢
  dht_sensor.tick();

  // 检查传感器状态,只有成功读取时才更新变量
  if (dht_sensor.getStatus() == DHT_OK) {
    current_temp = dht_sensor.getTemperature();
    current_humidity = dht_sensor.getHumidity();
    // 可选:串口打印验证数据
    // Serial.print("Temp: "); Serial.print(current_temp);
    // Serial.print("°C | Humidity: "); Serial.print(current_humidity); Serial.println("%");
  }

  // 异步Web服务器不需要手动调用handleClient(),框架会自动处理
}

3. Web回调直接用全局变量

绝对不要在Web请求的回调里去调用传感器读取方法,直接用已经更新好的全局变量构造响应:

void setup() {
  Serial.begin(115200);

  // 连接WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("连接WiFi中...");
  }
  Serial.println("WiFi已连接");

  // 配置根路由的响应
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    String html = "<html><body>";
    html += "<h1>温湿度监测</h1>";
    html += "<p>当前温度: " + String(current_temp) + " °C</p>";
    html += "<p>当前湿度: " + String(current_humidity) + " %</p>";
    html += "</body></html>";
    request->send(200, "text/html", html);
  });

  server.begin();
}

4. 避开这些坑

  • 别在Web回调里操作传感器:异步回调的执行时机不固定,会打乱DHT_nonblocking的采样节奏,导致数据出错。
  • 不要省略tick()调用:这是库更新数据的唯一途径,主循环里必须保证它被持续执行,哪怕其他逻辑占了时间,也要留时间给它。
  • 确认库版本:用适配ESP32的DHT_nonblocking版本,旧版本可能有兼容性问题。

验证步骤

  1. 上传代码后打开串口监视器,确认能看到温湿度数据正常打印(如果开了串口输出)。
  2. 访问ESP32的IP地址,Web页面上的数值应该和串口一致,且能定期更新。

内容的提问来源于stack exchange,提问作者Shrest Burra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:52:40