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

Arduino智能手表项目中DHT11传感器温湿度显示NAN求助

解决DHT11输出NaN问题的排查与修复方案

硬件排查步骤

  • 确认DHT11接线正确性:VCC接5V(DHT11不兼容3.3V),GND接Arduino GND,DATA引脚接引脚2;必须在DATA与VCC之间串联10K上拉电阻(部分集成模块自带,裸传感器需额外添加)。
  • 用万用表检测DHT11供电电压,确保稳定在5V±0.2V范围内,电压不足会导致传感器无法正常输出数据。
  • 更换DHT11传感器测试,这类低成本传感器故障率较高,硬件损坏是常见原因。

软件修改建议

  1. 移除冲突库:代码中同时引入DHT.h和DHT_U.h会导致库冲突,仅保留DHT.h即可。
  2. 添加数据有效性校验:读取数据后检查是否为NaN,同时通过串口输出状态信息,便于排查问题。
  3. 增加采样间隔:DHT11要求至少2秒的采样间隔,频繁读取会导致传感器无响应。

修改后的代码:

#include <DHT.h>
#include <Wire.h>
#include <Adafruit_SH1106.h>

#define OLED_RESET 4
Adafruit_SH1106 display(OLED_RESET);

#define DHT_TYPE DHT11
#define DHT_PIN 2
DHT HT(DHT_PIN, DHT_TYPE);
float humi;
float tempC;
float tempF;

int current_menu;
int menu_knob_state;

void setup()
{
  Serial.begin(9600);
  display.begin(SH1106_SWITCHCAPVCC, 0x3C);
 
  display.display();
  display.clearDisplay();

  HT.begin();
}

void mainmenu()
{ 
  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.setTextColor(BLACK, WHITE);
  display.print("Archimedes V1 - Menu ");
  display.setTextSize(2);
  display.setCursor(15, 20);
  display.setTextColor(WHITE);
  display.print("12:00:00");
  display.setTextSize(1);
  display.setCursor(35, 40);
  display.setTextColor(WHITE);
  display.print("01/01/1900");
  display.display();
}

void tempmenu(float tempC, float tempF, float humi){

  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.setTextColor(BLACK, WHITE);
  display.print("Archimedes V1 - Temp.");
  display.setTextSize(2);
  display.setCursor(3, 20);
  display.setTextColor(WHITE);
  
  // 校验温度数据,无效时显示错误
  if(isnan(tempF)){
    display.print("Err");
  } else {
    display.print(tempF);
    display.setCursor(40, 20);
    display.print("F");
  }
  
  display.setCursor(73, 20);
  if(isnan(tempC)){
    display.print("Err");
  } else {
    display.print(tempC);
    display.setCursor(110, 20);
    display.print("C");
  }
  
  display.setTextSize(1);
  display.setCursor(20, 40);
  display.print("Humidity:");
  display.setCursor(80, 40);
  if(isnan(humi)){
    display.print("Err");
  } else {
    display.print(humi);
    display.print("%");
  }
  display.display();
}

void loop()
{
  menu_knob_state = analogRead(A0);
  Serial.println(menu_knob_state);

  // 每2秒读取一次数据
  static unsigned long lastReadTime = 0;
  if(millis() - lastReadTime >= 2000){
    lastReadTime = millis();
    humi = HT.readHumidity();
    tempC = HT.readTemperature();
    tempF = HT.readTemperature(true);
    
    // 串口输出读取状态
    if(isnan(humi) || isnan(tempC)){
      Serial.println("读取DHT11数据失败");
    } else {
      Serial.print("湿度: ");
      Serial.print(humi);
      Serial.print("% 温度: ");
      Serial.print(tempC);
      Serial.print("C ");
      Serial.print(tempF);
      Serial.println("F");
    }
  }
  
  if(menu_knob_state <= 256){
    current_menu = 0;
    mainmenu();
  } else {
    current_menu=1;
    tempmenu(tempC, tempF, humi);
  }
  
  // 避免频繁刷新OLED,添加短延迟
  delay(50);
} 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:56:09