【问题标题】:Getting NAN-Readings from DHT-11 Sensor从 DHT-11 传感器获取 NAN 读数
【发布时间】:2017-04-13 23:31:36
【问题描述】:

我正在尝试从带有 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 的可能原因是什么?会不会坏了(我刚拆包)?

【问题讨论】:

  • DHT11 不发送任何浮点类型。对于每个读数,它发送 2 个字节:整数值和小数值。所以任何NAN 都必须是您的代码的结果。在开发从设备读取的代码时,第一步是打印它发送的原始数据,然后你可以看看这是否有意义,根据data sheet
  • 我不这样做,因为包含的库 应该为我这样做。 arduino playground 有一个教程,它使用 lib 从 dht11 传感器读取数据。我密切关注它,但没有收到我预期的结果。我是编程新手,也是 arduino 本身的新手,我尝试了简单的方法,但没有成功。我不认为我会使用(更)更难的方法取得成功,因为我在该领域的知识是有限的,充其量
  • @BenceKaulics 请问您的观点是什么?你能贡献一些相关的东西吗?
  • @WeatherVane 根据示例,OP 代码是正确的。创建一个实例并调用begin,然后调用读数。一切都在幕后处理,这就是适合您的 Arduino。该示例还检查 NAN 并将其视为错误,"Failed to read from DHT sensor!"。也许是硬件问题,不知道原理图就很难说。大多数 Arduino 人不阅读数据表,他们使用的库正是我想告诉你的。
  • 如果这是 Arduino 所做的,那么我删除了 C 标签:Serial.println(hum+humidity); 不能在 C 中工作,其中 hum 是一个字符串,humidityis float

标签: arduino sensors arduino-uno


【解决方案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 读数。

所以将其切换到数字引脚,看看它是如何工作的。

这是我的代码:

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

【讨论】:

  • 松线总是被低估..谢谢:D
【解决方案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);
}

【讨论】:

    【解决方案3】:

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

    我发现,如果您过快地询问 2 个或更多读数(在我的情况下,我只是询问温度)而在两个 dht.getTemperature(); 或两个 dht.readTemperature(); 之间没有延迟,具体取决于您使用的库,则第二个和以下读数将为您提供nan(不是数字)值,直到它再次回到想要的读数,依此类推。所以我在读数之间延迟了 2 秒(delay(2000);),它解决了我的问题。

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

    【讨论】:

      【解决方案4】:

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

      当使用Setup和连接DHT11单元时有时会出现代码

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

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

      nan
      

      通过 remoning 第一行,所有的阅读都很好。所以代码中有一些东西会导致这个问题。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            我已经在我的项目中通过在读取温度和湿度之间延迟 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);
            }
            

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                【解决方案9】:

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

                #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(数字)而不是 A3(模拟)读取,对吧?
                【解决方案10】:

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

                【讨论】:

                  猜你喜欢
                  • 2021-05-15
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-12-27
                  • 1970-01-01
                  • 2011-10-31
                  • 1970-01-01
                  • 2021-09-16
                  • 1970-01-01
                  相关资源
                  最近更新 更多