我正试图用带有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只能报告什么?可能会被打破(我只是打开包装)?
答案 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
,并确保在代码中使用正确的类型。
有DHT11
,DHT22
和DHT21
。
答案 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 电源串联的电阻器连接起来(我认为这是出于保护目的)。移除电阻器解决了我的问题。