湿度センサー「DHT11」がやってきた・・・けど!?
注文していた湿度センサー「DHT11」、届いたのはこれ。
「ASAIR」というメーカーのようです。
・https://www.aosong.com/en/productslist-4.html
・https://www.aosong.com/en/products-21.html
※前記事:出窓の結露対策用ヒータ制御回路
さっそくArduino-UNOで試運転。
ライブラリは使わず自前のルーチンで。
すると・・・いくつかの疑問が・・・
(1) DHT11の応答速度
「読み出し速度は1秒以上」なんて書かれてるページが
あります。
センサーとしての応答速度と通信速度とは違う
わけでして。
試しに0.2秒サイクルでデータを読み出してみました。
上がってくる5バイトのデータ、10進と16進で示します。
・加熱しながら0.2秒サイクルで読み出し
- 湿度- -温度- sum ---HEXで------
15 0 40 3 58 0F 00 28 03 3A
14 0 41 2 57 0E 00 29 02 39 …0.0 41.2℃
14 0 41 2 57 0E 00 29 02 39 2
14 0 41 2 57 0E 00 29 02 39 4
14 0 41 2 57 0E 00 29 02 39 6
14 0 41 2 57 0E 00 29 02 39 8
14 0 41 2 57 0E 00 29 02 39 1.0
14 0 41 9 64 0E 00 29 09 40 …0.0 41.9℃
14 0 41 9 64 0E 00 29 09 40 2
14 0 41 9 64 0E 00 29 09 40 4
14 0 41 9 64 0E 00 29 09 40 6
14 0 41 9 64 0E 00 29 09 40 8
14 0 41 9 64 0E 00 29 09 40 1.0
14 0 42 6 62 0E 00 2A 06 3E …0.0 42.6℃
14 0 42 6 62 0E 00 2A 06 3E 2
14 0 42 6 62 0E 00 2A 06 3E 4
14 0 42 6 62 0E 00 2A 06 3E 6
※センサーのそばにハンダゴテを置いて加熱。
湿度がえらい低く出てます。
「1.2秒」周期で湿度+温度データが更新されてました。
※追記
これ↑、私の勘違いを含んでいました。
6回のうちの5回はACK応答なしでタイムアウトエラーを
生じていました。
つまり直前に読み取ったデータを出力していたのです。
AdafruitのDHTライブラリではMIN_INTERVALとして2秒が
取られています。
その間の呼び出しは、読み出しは行わずに前回値を使うという
処理になっています。
(2) 0.1℃の桁まで温度が出てるぞ!
あちこちにあるDHT11のデータシート、湿度と温度のデータの
分解能、湿度が1%、温度が1℃と記されています。
しかし、このデータ列を見ると、4つ目のデータが「0.1℃」
の数字になっています。
(2つ目の湿度データは00が続く)
スケッチのサンプル、floatで処理しているようなんで、
分解能を気にしていないのか、はてさて。
(3) ライブラリはどうしてる?
よく使われているライブラリ「DHT.cpp」を見ますと・・・
DHT11はこんな処理に。
case DHT11:
f = data[2]; …3つ目が1℃桁
if (data[3] & 0x80) { …4つ目のMSBがマイナス符号
f = -1 - f; …★1
}
f += (data[3] & 0x0f) * 0.1; …4つ目の下位4bitが0.1℃
「0.1℃」が出ているのは間違いないようです。
で、★1のところに疑問。 データシートに出ていない、
マイナスの処理、これでエエん?
湿度が高分解能なDHT22の温度処理を見ると、
case DHT22:
f = ((word)(data[2] & 0x7F)) << 8 | data[3]; ★2
f *= 0.1; …3つ目が1℃で4つ目が0.1℃
if (data[2] & 0x80) { …3つ目のMSBが1なら
f *= -1; …マイナスに
}
このDHT22のマイナス処理はなるほど。
★2の所、3つ目の8bitデータはちゃんとマスクしてあります。
ということで、温度がマイナスはどうなる? が疑問です。
(4) 氷点下は?
実データを見るため、センサーをビニール袋に入れて
サンハヤトの「Q-REI」で冷やしてみました。
シリアル出力は2秒サイクル。
- 湿度- -温度- sum ---HEXで------
27 0 4 9 40 1B 00 04 09 28 … 4.9℃ 下降
27 0 4 1 32 1B 00 04 01 20 … 4.1℃
27 0 3 3 33 1B 00 03 03 21 … 3.3℃
27 0 2 5 34 1B 00 02 05 22 … 2.5℃
27 0 1 7 35 1B 00 01 07 23 … 1.7℃
27 0 0 9 36 1B 00 00 09 24 … 0.9℃
27 0 0 2 29 1B 00 00 02 1D … 0.2℃
28 0 0 133 161 1C 00 00 85 A1 …-0.5℃ ★3
28 0 1 129 158 1C 00 01 81 9E …-1.1℃
29 0 1 136 166 1D 00 01 88 A6 …-1.8℃
29 0 2 132 163 1D 00 02 84 A3 …-2.4℃
30 0 3 128 161 1E 00 03 80 A1 …-3.0℃
: :
45 0 2 132 179 2D 00 02 84 B3 …-2.4℃ 上昇
47 0 2 129 178 2F 00 02 81 B2 …-2.1℃
48 0 1 136 185 30 00 01 88 B9 …-1.8℃
49 0 1 132 182 31 00 01 84 B6 …-1.4℃
50 0 1 129 180 32 00 01 81 B4 …-1.1℃
52 0 0 135 187 34 00 00 87 BB …-0.7℃
53 0 0 132 185 35 00 00 84 B9 …-0.4℃
54 0 0 129 183 36 00 00 81 B7 …-0.1℃ ★4
55 0 0 3 58 37 00 00 03 3A … 0.3℃
57 0 0 7 64 39 00 00 07 40 … 0.7℃
58 0 1 1 60 3A 00 01 01 3C … 1.1℃
59 0 1 4 64 3B 00 01 04 40 … 1.4℃
温度が下降、上昇する速度から0℃付近の挙動が
見えてきます。
(1) 3つ目と4つ目のLSBを加算してxx.x℃に
(2) 4つ目のMSBが1ならマイナスに
ということでよさそうです。
しかし、★1の手順だと、「-0.1℃」を読んだときは、
「(-1 - 0) + 0.1」で「-0.9℃」になっちゃいます。
DHT11の0.1℃処理、後からデータが出ているのが
分かったんで付け足した感じでしょうか。
プラスのことしか考えなかったんで、それで、ミスを!
「ライブラリをうかつに信じたらアカンぞ!」っという
ことになっちゃいました。
DHT11の処理をこのライブラリでしたことがある方、
氷点下の処理を見直さなくちゃいけません。
1℃内で温度の上昇と下降が逆になってしまいます。
※こんなスケッチです (完成形じゃありません)
・ダウンロード - test_hdt2.txt
タイマー1のインプットキャプチャ機能を使って
DHT11からのパルス幅を読んでいます。
※ソース、DHTとする所、間違ってHDTとなってます。
次の手直しで直します。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
※追記 DHT11、氷点下の処理 (↑の★1)
case DHT11:
f = data[2]; …1℃桁
if (data[3] & 0x80) { …MSBがマイナス符号
f = -1 - f; …★1
}
f += (data[3] & 0x0f) * 0.1; …下位4bitが0.1℃
おそらく・・・★1は最小桁が1℃の時の処理だったかと。
温度が降下して「 4 3 2 1 0℃」と来た次、
データが「0」のままマイナスになって「-0℃」
が出現します。
それを嫌って、「4 3 2 1 0 -1 -2」となる
ようにするための処理が「f = -1 - f;」だったと
推測できます。
それが、「0.1℃桁」まで出ているのが分かり
(DHT11の機能アップ?)、それじゃと追加したのが
f += (data[3] & 0x0f) * 0.1;
しかし、マイナス温度を考えていなかったのがミス。
DHT22と同じように、先に1℃桁と0.1℃桁を合成してから
マイナスを判断して処理しなければなりません。
気が付かない原因・・・
・昔からあるライブラリにミスは無いだろう。
・みんな、使っているし。
・動いているし。
・欲しいのは湿度。 温度はおまけ。
・DHT11で氷点下なんて使わないぜ。
・1℃桁が合ってればヨシ!
「現場ネコ」みたいになってきました。
※追記 氷点下実験の様子
センサーをビニール袋に入れ、その上からQ-REIを噴射。
40.0% -19.6 28 00 13 86 C1
40.0% -19.7 28 00 13 87 C2
40.0% -19.7 28 00 13 87 C2
40.0% -19.8 28 00 13 88 C3
40.0% -19.8 28 00 13 88 C3
40.0% -19.9 28 00 13 89 C4
40.0% -20.0 28 00 14 80 BC
40.0% -20.0 28 00 14 80 BC 最低到達点
:
「-20.0℃」まで到達。 ここで数値が張り付きました。
※追記 氷点下の温度数値が★1の処理だと狂う様子
正 ★1の計算方法
1.9 [20 00 01 09 2A ] 1.9 ↓温度下降
1.4 [20 00 01 04 25 ] 1.4
0.8 [21 00 00 08 29 ] 0.8
0.3 [21 00 00 03 24 ] 0.3 プラスはok
-0.2 [21 00 00 82 A3 ] -0.8 マイナスがアウト
-0.6 [21 00 00 86 A7 ] -0.4
-1.0 [21 00 01 80 A2 ] -2.0
-1.4 [21 00 01 84 A6 ] -1.6
-1.8 [21 00 01 88 AA ] -1.2
-2.1 [22 00 02 81 A5 ] -2.9
-2.5 [22 00 02 85 A9 ] -2.5
-2.8 [22 00 02 88 AC ] -2.2 実際は0.2℃の変化なのに
-3.0 [22 00 03 80 A5 ] -4.0 1.8℃も飛んじゃっている。
:
-2.3 [31 00 02 83 B6 ] -2.7 ↓温度上昇
-2.1 [32 00 02 81 B5 ] -2.9
-1.8 [34 00 01 88 BD ] -1.2
-1.5 [35 00 01 85 BB ] -1.5
-1.3 [37 00 01 83 BB ] -1.7
-1.1 [39 00 01 81 BB ] -1.9 0.3の変化が
-0.8 [3A 00 00 88 C2 ] -0.2 1.7に。
-0.5 [3C 00 00 85 C1 ] -0.5
-0.3 [3D 00 00 83 C0 ] -0.7
0.0 [3F 00 00 00 3F ] 0.0 0はok
0.3 [40 00 00 03 43 ] 0.3 プラス復帰でokに
こんな変化になるんで、0℃を中心に温度がゆっくり変わったとき、
「なんかマイナスがおかしい」と気づきそうです。
「センサーがおかしい」とか「回路がおかしい」「精度が出てない」
じゃなく、「ソフトがバグってる」というのがこの原因です。
DHT11センサーで
AdafruitのDHTライブラリを使って
氷点下を計る
という条件なので、異常に気付くかどうか・・・微妙でしょうね。
※完成形へ
・2021年12月10日:DHT11を使った出窓の結露対策用ヒータ制御回路
※追記
・2022年3月10日:温湿度センサーDHT11、ライブラリを使うと氷点下の温度がおかしくなるぞ!
| 固定リンク
「出窓」カテゴリの記事
- 人感センサー用オフディレータイマー回路(2023.08.26)
- 『きもだめし』に人感センサー(2023.08.19)
- 出窓の夜間照明用LEDを交換(2023.06.04)
- 出窓:鯉のぼりを振る(2023.05.04)
- 出窓:鯉のぼりを振れたらというリクエスト(2023.04.26)
「Arduino」カテゴリの記事
- Arduino UNO R3で±19.9V表示電圧計(2023.10.14)
- 「御詠歌プレーヤー」の製作 (MP3-TF-16Pモジュールの使用例)(2023.08.10)
- Arduino UNO R3のソケット・・思えば違和感がぁ(2023.07.07)
- 初めて買ったArduino UNO・・・今は(2023.05.25)
- 液晶表示コントローラ HD44780で迎撃(2023.05.16)
「電子部品」カテゴリの記事
- ルネサスのトライアックを検索したらなぜか「ブラ」の画像が・・・(2023.11.28)
- LTC6101を使った電流検出回路をケースに入れる(2023.11.24)
- 74LVC1G57と1G58で作るXNORゲートとXORゲート(2023.11.20)
- 昨日の修理:板状電極(?!)の電解コン(2023.10.31)
- 電子負荷:Trの絶縁シートをどうしよう(2023.10.11)
コメント
DHT11のデータシートを見ますと、
The 2017-03-31 V1.3
4. 5.2 temperature parameter list to update the tabular form,
measuring range is 0 to 50 ℃ to - 20 to 60 ℃.
っと、測定温度範囲がマイナスにまで拡張されたことが記されています。
しかし、分解能が0.1℃になったのは不明。
1℃分解能でのマイナスの処理は★1でokなんですが、後から0.1℃の処理をくっつけたのが間違い。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2021年12月 8日 (水) 09時03分
Arduino-UNOを初めて使ったのが2012年12月。
http://act-ele.c.ooco.jp/blogroot/igarage/article/3192.html
なんやかんや作ってきましたが、「ちょっと待て!」にも数多く出会ってきました。
今回のDHT11ライブラリもその一つに加わります。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2021年12月 8日 (水) 09時07分
DHT11センサー、新旧のスペック比較があります。
https://www.seeedstudio.com/blog/2020/04/20/dht11-vs-dht22-am2302-which-temperature-humidity-sensor-should-you-use/
投稿: 居酒屋ガレージ店主(JH3DBO) | 2021年12月10日 (金) 11時43分