秋月で1個300円税込、
作例も多いしライブラリもあるからすぐ使えるかと思ったらなんだかはまりました
原因はよく分かりませんが色んなライブラリの中で動いたのはこの1個だけ...
(結線はというと1ピンの電源、2ピンのデータ、4ピンのGND(3ピンはNC)の三本で、
2ピンは4.7KΩでプルアップしてます
これプルアップ抵抗が実装されているユニットを買った人はともかく、センサ単体で買った人は必ずプルアップしないと動かない様な気がするが、してない作例も...^^;)
ライブラリとは言ってもデータI/Oに使うMCUのピンを、
1. はじめはHIGHの状態(pullupされているから)なので、
OUTPUTなMCU側のI/OをLOにするとDHT11側もLOに、これを18ms以上継続
(起動シーケンス)
2. 次にMCU側I/OをHIGHに戻し(DHT11側もHIGH)、MCUのI/Oをinputに変更
センサ側(と言うか内蔵MCU)のレスポンス(特定のパターン)を待つ
まずLOに落とし数十us継続、その後HIGHにしてまた数十us継続、
これで儀式は終わりなので以降はセンサからのデータ列が続く
3. センサの出力は5byte、第五byteはパリティでこのデータの塊を使うか捨てるかの判断材料に
第一byteは湿度の整数部、第二byteは湿度の小数部、第三byteは温度の整数部、第四byteは温度の小数部
パリティの計算は、第一~第四byteをそれぞれ8bitの二進数として加算、合計が第五byteに一致したらOK
なお、DHT11は計測値として整数値しか返さないので、第二/第四byteは常に0b00000000
"0"bitは、50usのLOの後、26~28us程度のHIGH
"1"bitは、50usのLOの後、70us程度のHIGH
4. 上記ステップの読み込みを5byte行いパリティのチェックをしてそのターンのデータ取得は終わり
パリティが一致しないときはエラーでそのデータを読み捨てる
5. 再度の読み込みを行うまで2秒以上の間をとる...
と言う感じなので、ライブラリのソースを読んだら動かないライブラリの原因が分かるはず
ところで参考に某ロジアナで、あるターンのデータ取得(成功しているやつ)をキャプチャしてみた
20msほどLO状態が続いている、ライブラリで言うと以下の赤字の辺り(wakeupDelayは18になっている^^;)
// REQUEST SAMPLE
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW); // T-be
delayMicroseconds(wakeupDelay * 1000UL);
digitalWrite(pin, HIGH); // T-go
pinMode(pin, INPUT);
でその後、HIGHに戻しI/OをOUTPUTからINPUTに変更し以降センサの出力を読み込む
で、データ5byte部分の冒頭を見ると、
LOからHIGHへ戻した後はセンサ側の出力、
LO-->HIGH(赤で囲った「センサ反応」の部分)した後、データのbit列が続くので8bit毎に切り出して格納
上の例では0b00100011なので、十進数の35ということで(第一byteは湿度の整数部)
実際、シリアルモニタの出力は、
てな感じだったのであいこです^^;
その後、色々試していたらAdafruitのこのライブラリも動きました^^;
但し、共通ライブラリのこれも必要
トラブっていたのは複数バージョンのArduino IDEを運用していたのでライブラリの参照で不都合があったらしく...
この通り