首页 文章

从DHT-11传感器获取NAN读数

提问于
浏览
3

我试图从带有arduino uno R3的DHT-11传感器读取温度和湿度

#include <DHT.h>
#include <LiquidCrystal.h>

#define DHTPIN A3
#define DHTTYPE DHT11

DHT dht(DHTPIN,DHTTYPE);
LiquidCrystal lcd(5,8,9,10,11,12);

String hum="Humidity:";
String temptext="Temp:";

void setup() {

    Serial.begin(9600);
    lcd.clear();
    lcd.begin(16,2);
    dht.begin();
}

void loop() {

    float humidity = dht.readHumidity();
    delay(500);
    float temp = dht.readTemperature();
    delay(500);
      Serial.println(hum+humidity);
      Serial.println(temptext+temp);
      lcd.clear();
      lcd.print(hum + humidity);
      lcd.setCursor(0,2);
      lcd.print(temptext+temp);
      delay (5000);


}

我确信我的接线是正确的 . 除了NAN之外,DHT-11只能报告什么?可能会被打破(我刚打开它)?

3 回答

  • 0

    NaN代表“不是数字” . 有时传感器无法读取并为您提供nan值 . 你不能对它做任何事情,但在DHT.h库中有一个叫做isnan()的函数 . 因此,如果存储了最后一个正确的值,则可以创建备份变量 . 然后你可以检查你的传感器是否读为nan,如果是,你可以打印出备份变量:

    float temperature;
    float bTemperature;
    
    temperature = dht.readTemperature();
    
    if(!isnan(temperature)){
      bTemperature = temperature;
      Serial.println(temperature);
    
    }
    else{
      Serial.println(bTemperature);
    }
    
  • 1

    相反的顺序:

    问:可能会被打破吗?

    答:不太可能 . 我唯一一次变坏的是当我将电压向后连接太久时 . 如果它只是短暂的一段时间它可以幸存下来 . 但是当它太长时间它就融化了 .

    问:看到NaN的可能原因是什么?

    答:可能的原因:

    1)您正在使用模拟引脚接收数字信号 .

    2)电线松动

    我经常运行几个有2个或3个DHT-22的传感站,我使用数字引脚 . 其中一些距离Arduino有20英尺 .

    但如果电线松动我肯定会看到0.00 .

    这是一个问答,我问如何处理这些问题:gnuplot: Faulty sensor sometimes reading 0.00 - how to convert them to missing?

    当然传感器并没有真正的故障 . 我总是拉着电线然后松开了 . 与任何引脚失去接触总是给出0.00读数 .

    So switch it over to a digital pin and see how it acts.

    这是我的代码:

    在setup()之前,执行以下操作:

    //     2 devices:  Input pins D2 and D5
    #include <Adafruit_Sensor.h>
    #include "DHT.h"
    #define DHTPIN 2    
    #define DHTTYPE DHT22
    DHT dht(DHTPIN, DHTTYPE);
    #define DHT2PIN 5 
    #define DHT2TYPE DHT22
    DHT dht2(DHT2PIN, DHT2TYPE);
    

    然后

    void loop() {
      float h = dht.readHumidity();
      float t = dht.readTemperature();
      float df = t*(9.0/5.0)+32;
      if (isnan(h) || isnan(t)) { h=0; df=0; }
      float h2 = dht2.readHumidity();
      float t2 = dht2.readTemperature();
      float df2 = t2*(9.0/5.0)+32;
      if (isnan(h2) || isnan(t2)) { h2=0; df2=0; }
      Serial.print(h);  Serial.print("\t");
      Serial.print(df);  Serial.print("\t");
      Serial.print(h2);  Serial.print("\t");
      Serial.println(df2);
      delay(30000);
      }
    
  • 2

    我第一次使用DHT11一切都很顺利 . 我尝试了DHT11用于另一个应用程序,我遇到了这个问题,我的LCD1602和串行监视器上的 nan . 我认为这是DHT11有缺陷,所以我重新加载我的旧程序来测试DHT11 . 该程序在新的DHT11上运行良好,因此它不是DHT11 . 所以我再次尝试了我的新程序,仍有 nan 读数......

    我发现,如果你要求2个或更多读数太快(在我的情况下,我只是要求温度),两个 dht.getTemperature(); 或两个 dht.readTemperature(); 之间没有延迟,具体取决于你使用的是哪个库,第二个和下面的读数将是给你一个 nan (非数字)值,直到它再次回到想要的读数,依此类推 . 所以我在读数之间放了2秒( delay(2000); )的延迟,它解决了我的问题 .

    我希望这可以帮到你! :)

相关问题