« 湿度センサー駆動回路 「センサ・インターフェージング No1」から | トップページ | 焼け跡にプリントパターンが見える »

2021年12月 7日 (火)

湿度センサー「DHT11」がやってきた・・・けど!?

注文していた湿度センサー「DHT11」、届いたのはこれ。
ASAIR」というメーカーのようです。

31_20211207155001
 ・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℃桁が合ってればヨシ!

現場ネコ」みたいになってきました。


※追記  氷点下実験の様子
32_20211208113001
センサーをビニール袋に入れ、その上から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、ライブラリを使うと氷点下の温度がおかしくなるぞ!

|

« 湿度センサー駆動回路 「センサ・インターフェージング No1」から | トップページ | 焼け跡にプリントパターンが見える »

出窓」カテゴリの記事

Arduino」カテゴリの記事

電子部品」カテゴリの記事

コメント

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分

コメントを書く



(ウェブ上には掲載しません)




« 湿度センサー駆動回路 「センサ・インターフェージング No1」から | トップページ | 焼け跡にプリントパターンが見える »