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

时间:2016-11-29 20:06:44

标签: arduino sensor arduino-uno

我正试图用带有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只能报告什么?可能会被打破(我只是打开包装)?

10 个答案:

答案 0 :(得分:2)

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 :(得分:1)

逆序:

问:可能会被打破吗?

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

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

答:可能的原因:

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

2)电线松动

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

但如果电线松动我肯定能看到0.00。

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

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

然后将其切换到数字引脚,看看它是如何起作用的。

这是我的代码:

在安装()之前,请执行以下操作:

//     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 :(得分:1)

这是我的工作代码。希望它可以帮助某人。

#include <DHT.h>
#define DHT11PIN 3
#define DHTTYPE DHT11

DHT dht(DHT11PIN, DHTTYPE);
float h,tc,tf;

void setup()
{
  delay(200);
  Serial.begin(9600);
  dht.begin();
  delay(1000);
  Serial.println("DHT11 Temperature and Humidity ");
}

void loop()
{
  delay(5000);
  h = dht.readHumidity();
  tc = dht.readTemperature();
  tf = dht.readTemperature(true);
  
  Serial.print('\n');
  Serial.print("Humidity = ");
  Serial.print(h);
  Serial.print("%,  ");
  Serial.print("Temperature = ");
  Serial.print(tc);
  Serial.print("°C, ");
  Serial.print(tf);
  Serial.println("°F");
}

答案 3 :(得分:0)

我第一次使用DHT11时一切都很好。我尝试将DHT11用于其他应用程序,但在LCD1602和串行监视器上遇到了问题nan。我以为是DHT11有缺陷,所以我重新加载了旧程序以测试DHT11。该程序在新的DHT11上运行良好,因此不是DHT11。所以我再次尝试了我的新程序,仍然有nan的读数...

我发现,如果您要求2个或更多读数太快(以我为例,我只是在询问温度),而没有两个dht.getTemperature();或两个dht.readTemperature();之间的延迟,这取决于您使用的是哪个库正在使用时,第二个及以下读数将为您提供一个nan(不是数字)值,直到再次返回所需的读数,依此类推。因此,我在两次读取之间延迟了2秒(delay(2000);),这解决了我的问题。

我希望这可以对您有所帮助! :)

答案 4 :(得分:0)

我在这里没有看到的是第二种选择。这是由代码本身禁止的。

在使用Setup并有时连接DHT11单元时,代码

int chk = dht.read(DHTPIN);
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();

因为我确实在代码后面阅读了温度和湿度。总是读一本书。第二读给了我

nan

通过记录第一行,所有阅读情况都很好。因此,代码中有些东西会导致此问题。

答案 5 :(得分:0)

解决NAN问题的最简单方法是将库文件字母从大写字母更改为小写字母 DHT.h到dht.h

答案 6 :(得分:0)

您应该检查DHTTYPE,并确保在代码中使用正确的类型。 有DHT11DHT22DHT21

答案 7 :(得分:0)

我通过在读取温度和湿度之间放置10ms的延迟来解决了这个问题:

void loop()
{
  float h = dht.readHumidity();
  delay(10);
  float t = dht.readTemperature();

  Serial.print('\n');
  Serial.print("Current humidity = ");
  Serial.print(h);
  Serial.print("%  ");
  Serial.print("temperature = ");
  Serial.print(t); 
  delay(1000);
}

答案 8 :(得分:0)

使用这个:https://esp8266-shop.com/sensors/measure-temperature-and-humidity-with-dht22-and-esp8266/

记得改dht.setup(5, DHTesp::DHT22);到 dht.setup(5, DHTesp::DHT11);

答案 9 :(得分:0)

尝试检查您的原理图和接线。我将 Vcc 引脚与一个与 5V 电源串联的电阻器连接起来(我认为这是出于保护目的)。移除电阻器解决了我的问题。