Arduino unoR3を搭載した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しか報告しない理由として考えられるものは何ですか?それは壊れているかもしれません(私はちょうどそれを開梱しました)?
逆順:
Q:壊れている可能性がありますか?
A:ありそうもない。私が1つ悪くなったのは、電圧を逆方向に接続しすぎたときだけでした。それがほんの少しであるならば、それはそのOKを生き残ることができます。しかし、長すぎると物が溶けてしまいました。
Q:NaNを見る理由として考えられるものは何ですか?
A:考えられる理由:
1)デジタル信号を受信するためにアナログピンを使用しています。
2)ワイヤーが緩んでいる
私は定期的に2つまたは3つのDHT-22を搭載したいくつかのセンシングステーションを運営しており、デジタルピンを使用しています。それらのいくつかはArduinoから20フィート離れています。
しかし、ワイヤーが緩んだ場合、私は確かに0.00を見ることができます。
これが私がそれらに対処する方法を尋ねるQ&Aです: 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);
}
NaNは「NotaNumber」の略です。センサーが読み取りに失敗し、nan値を表示することがあります。それに対して何もすることはできませんが、DHT.hライブラリにはisnan()という関数があります。したがって、正しい最後の値を格納した場合にバックアップ変数を作成できます。次に、センサーがnanを読み取るかどうかを確認し、読み取る場合は、バックアップ変数を出力できます。
float temperature;
float bTemperature;
temperature = dht.readTemperature();
if(!isnan(temperature)){
bTemperature = temperature;
Serial.println(temperature);
}
else{
Serial.println(bTemperature);
}
DHTTYPE
をチェックして、コードで正しいタイプを使用していることを確認する必要があります。有る DHT11
、DHT22
、およびDHT21
。
nANの問題を解決する最も簡単な方法は、ライブラリファイルの文字を大文字から小文字のDHT.h、dht.hに変更することです。
私がここで見なかったのは2番目のオプションです。それはコード自体によって引き起こされます。
使用する場合DHT11ユニットをセットアップして接続する場合
int chk = dht.read(DHTPIN);
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
コードのすぐ後ろでtempetureとhumidetyを読んだからです。常に1回の読み取りは大丈夫でした。そして、2番目に読んだものは私に
nan
最初の行を思い出させることによって、すべての読書はうまくいきました。したがって、この問題を引き起こすコードには何かがあります。
初めてDHT11を使用したときは、すべてうまくいきました。別のアプリケーションでDHT11を試しましたが、LCD1602とシリアルモニターでnan
という問題が発生しました。欠陥があるのはDHT11だと思ったので、古いプログラムをリロードしてDHT11をテストしました。プログラムは新しいDHT11で正常に機能したため、DHT11ではありませんでした。それで、私は新しいプログラムをもう一度試しましたが、まだnan
の読み取り値があります...
どのライブラリに応じて、2つのdht.getTemperature();
または2つのdht.readTemperature();
の間に遅延なしに、2つ以上の読み取り値をあまりにも速く(私の場合は温度を求めていた)要求すると、使用している場合、2番目以降の読み取り値は、必要な読み取り値に戻るまでnan
(数値ではない)の値を示します。そのため、読み取りの間に2秒の遅延(delay(2000);
)を設定すると、問題が解決しました。
これがお役に立てば幸いです。 :)