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

问题描述 投票:0回答:12

我正在尝试使用 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);


}

我确信我的接线是正确的。 DHT-11 仅报告 NAN 的可能原因是什么?会不会坏了(我刚拆开包装)?

arduino sensors arduino-uno
12个回答
6
投票

相反顺序:

问:会不会坏了?

答:不太可能。我唯一一次出现故障是当我反向连接电压太长时间时。如果只是一小会儿的话,还能活下来就好了。但时间太长,东西就融化了。

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

答:可能的原因:

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

2) 电线松动

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

但是如果电线松动,我肯定可以看到 0.00。

这里有一个问答,我询问如何处理这些问题:gnuplot:故障传感器有时读数为 0.00 - 如何将它们转换为缺失?

当然,传感器并不是真的有故障。总是我拉了一根电线,它就松了。与任何引脚失去接触总会给出 0.00 读数。

因此将其切换到数字引脚,看看它的作用如何。

这是我的代码:

在 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
投票

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);
}

2
投票

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

#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");
}

1
投票

我第一次使用 DHT11 一切都很顺利。我尝试将 DHT11 用于另一个应用程序,但遇到了这个问题,即 LCD1602 和串行监视器上的

nan
。我以为是DHT11有缺陷,所以我重新加载了我的旧程序来测试DHT11。该程序在新的 DHT11 上运行良好,因此它不是 DHT11。所以我再次尝试了我的新程序,读数仍然是
nan
......

我发现,如果您太快询问 2 个或更多读数(在我的情况下,我只是询问温度),而在两个

dht.getTemperature();
或两个
dht.readTemperature();
之间没有延迟,具体取决于您使用的库,第二个以下读数将为您提供
nan
(不是数字)值,直到再次返回所需读数,依此类推。所以我在读数之间延迟了 2 秒 (
delay(2000);
),它解决了我的问题。

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


1
投票

您应该检查

DHTTYPE
并确保您在代码中使用正确的类型。 有
DHT11
DHT22
DHT21


1
投票

我在项目中通过在读取温度和湿度之间延迟 10 毫秒解决了这个问题:

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);
}

1
投票

确保您有:

dht.begin();

否则你将得到 NaN 和随机输出。


0
投票

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

使用时设置并连接 DHT11 装置,有时当代码

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

因为我确实在代码后面读取了温度和湿度。读一读总是可以的。第二次阅读给了我

nan

通过复习第一行,所有阅读都进展顺利。所以代码中有一些东西导致了这个问题。


0
投票

使用此:https://esp8266-shop.com/sensors/measure-Temperature-and-humidity-with-dht22-and-esp8266/

只需记住更改 dht.setup(5, DHTesp::DHT22);到 dht.setup(5, DHTesp::DHT11);


0
投票

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


0
投票

我尝试了上述方法来解决“NaN”问题,但我继续得到相同的读数。有没有什么解决办法。 这是我使用的代码。

#include <DHT.h>

#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 setup() {
  
  Serial.begin(9600);
  Serial.println("DHT11 Serial");

 
  dht.begin();

}

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);
}

但是我一直在找南 串行监视器输出


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.