温湿度センサ(DHT20)/ESP32-WROOM-32E/Arduino IDE (Debian11.3.0)

2022/7/16


はじめに

手許に2種類の温湿度センサ(AM2320,DHT20)がある。どちらもESP32にI2C接続できる。
DHT20

DHT20ライブラリ

ESP32にI2C接続して使うのだが、このセンサ用のライブラリが既にあるらしい。
結論から言うと「これらのライブラリは必須ではない」。
ライブラリがたくさんあって、どうしたらよいのか迷うくらいなら、「ライブラリを使わない」という選択もある。
「各ライブラリについて調べ、テストするが動かない」より、最低限なものを使って「自分用のライブラリを作る」ほうが時間的には短い場合がある。

ライブラリをみた第一印象は「たくさんあって、どれをつかうのがよいかわからない。」だった。
センサを使用している記事をいくつかみたが、どのライブラリを使用したか明記しているサイトの少ないことに驚いた。「自分はこうして動かしました」的なものを見せられても、これでは再現ができない。 Arduino Documentation--Librariesのなかからセンサを選ぶと、これでもかというばかりにライブラリがでてくる。「必要なものを各自でインストールしてください」的スタンスだから文句を言える立場ではないが、ライブラリの説明とかどうにかならないのだろうか?
それ以前に、「気に入らないのならライブラリくらい自分で作れ」というのが正しい。


DHT20またはDHTシリーズが使用できるライブラリを探すと・・・Official librariesには存在しない。
  1. DFRobot_DHT11: DFRobot Standard library(SKU:DFR0067).
  2. DFRobot_DHT20: Provide an Arduino library to get Humidity and Temperature by reading data from dht20.
  3. DHT sensor library: Arduino library for DHT11, DHT22, etc Temp & Humidity Sensors
  4. DHT sensor library for ESPx: Arduino ESP library for DHT11, DHT22, etc Temp & Humidity Sensors
  5. DHT12: Arduino library for I2C DHT12 temperature and humidity sensor.
  6. DHT12 sensor library: DHT12 Temp & Humidity Sensors, library for Arduino, ESP8266 and ESP32
  7. DHT20: Arduino library for I2C DHT20 temperature and humidity sensor.
  8. DHT2pin: Experimental library of the DHT library that uses 2 pins.
  9. DHTINT: Arduino library for DHT temperature and humidity sensor. Integer only to save footprint.
  10. DHTlib: AVR Optimized Library for DHT Temperature & Humidity Sensor on AVR only.
  11. DHTNEW: Arduino library for DHT temperature and humidity sensor, with automatic sensortype recognition.
  12. DHTStable: Stable version of library for DHT Temperature & Humidity Sensor
  13. Grove Temperature And Humidity Sensor: Arduino library to control Grove Temperature And Humidity Sensor, it contains chip DHT11 AM2302.
  14. SDHT: Class for DHT11, DHT12, DHT21 and DHT22 Sensors
  15. SimpleDHT: Arduino Temp & Humidity Sensors for DHT11 and DHT22.
  16. TinyDHT sensor library: Arduino library for Using DHT11, DHT22, etc Temp & Humidity Sensors with the ATtiny85
  17. TroykaDHT: Allows you to read the temperature and humidity from the DHT series sensors.
いったいどれを選べというのだろうか?
DHT20とあるのはわかる。etcとかseriesにはDHT20は含まれるのかどうなのかわからない。さらにいうとDHT22とAM2302が同じ扱いのものもある。
センサはI2Cで接続したいので、接続方法が1線式は使えない。2線式とかI2Cの記載があるものはよいが、そうでないものはライブラリの説明を見ないとわからない。

20件程度だから丁寧に内容を確認すればよいと言えばそれまでだが。


結局全部説明を見ることになったのだが、 明確にDHT20とあるのは2つだった。
ライブラリヘッダファイルサンプルプログラムI2C接続ESPで動作
 2. DFRobot_DHT20DFRobot_DHT20.hサンプルスケッチ(ino)あり
python言語(ラズベリーパイ)サンプルあり
本体はC言語で記述
ドキュメントを読むとI2C接続していることがわかる。ESP32/ESP8266で動作する。
DFRobot社製品を使うなら間違いがなさそう。
 7. DHT20DHT20.hサンプルスケッチ(ino)あり
本体はC言語で記述 C言語サンブルあり
ドキュメントを読むとI2C接続していることがわかる。ESP32は動作するらしいが細かい動作確認は今後の予定。ESP8266での動作は?
他のライブラリでもI2Cアドレスを修正すれば通信可能だろうが、取得値を温度湿度に変換するあたりがセンサごとに違うと想像している。各センサのデータシートとコードを比較すればよいだろう。後々検討しよう。

DHT20 サンプルを動かしてみる

「7.DHT20」でサンプルを動かしてみた。
  1. ライブラリを追加
    DHT20を使うために、ライブラリにDHT20を追加した。
    DHT20

    DHT20

  2. サンブルスケッチ
  3. ESP用らしいサンプル(https://raw.githubusercontent.com/RobTillaart/DHT20/master/examples/DHT20_test_esp/DHT20_test_esp.ino)がある。
    サンプルスケッチはそのままでは使えない。
    システムモニタでchecksum errorが表示されている。
    DHT20

  4. トラブル?
    SDA,SCLをオシロスコープで観測したが信号が出ていない。
    サンプルスケッチを見ると「ピン番号をここに書け」とある。「SCL,SDAをどのピンにするのか」指定するらしいが、
    #if defined(ESP8266) || defined(ESP32)
      DHT.begin(12, 13);  // select your pin numbers here
    #else
      DHT.begin();
    #endif
    
    ・pin numberはボード上のピン番号なのか、ESP32の番号なのか、GPIO番号なのか
    ・記述する順番はSCL,SDAなのか SDA,SCLなのか
    ・そもそもESP32にはSCL,SDAとして指定されたピンがあるが、デフォルト値はなにが設定されているのか?
    等々疑問だらけだ。ドキュメントによるとdataPin,clockPinの順らしい。
    ESP32-WROOM-32EのGPIO番号(SCL=GPIO22,SDA=GPIO21)を指定してみたが、SCL,SDAどちらにも信号は出力されなかった。 結局Wire.h,Wire.cppを見て、デフォルト値が(SDA=GPIO21,SCL=GPIO22)であることがわかり、そのように温湿度センサを接続していることを確認し、 DHT.begin()にすると温度湿度を表示できた。
    #defineディレクティブにESP8266とかESP32とか書いていないからコンパイル時にDHT.begin();を選択しているのではないのか? それともコンパイルオプションでESP32でも指定されているのか? Arduino-IDEのどこかに記載があるのか?
    コンストラクタbeginはESP32はbegin(dataPin,clockPin)でI2Cバスピンを指定、begin()は非ESP32の初期化に使用するらしい。
    ESP32-WROOM-32Eは非ESP32なのか?
    DHT20

  5. ライブラリDHT20を削除
  6. かなりムカついたのでDHT20は削除した。
    ライブラリ管理からライブラリが削除できなかった。(DHT20は削除ボタンが表示されない)
    スケッチ保存先(~/Arduino)にある ~/Arduino/libreries/DHT20以下を削除した。
    もちろんDHT20_test_esp.inoは動かない。

retry : DHT20 自家製スケッチ

Wire.h,Wire.cppを読んだことでいろいろなことがわかった。
aruduino-esp32をインストールした段階でI2C通信に必要なライブラリ(Wire.h,Wire.cpp)はそろっている。
DHT20等のライブラリは(Wire.h)を(センサから取得値を変換する仕組み)でラッピングしたものとみて間違いなさそうだ。
デフォルト(SDA,SCL)にセンサを接続するならほぼそのままWire.hを使ってよい。
ライブラリDHT20を使用せずに、温湿度センサを使用している方がいた。 こちらを参考に動作確認をする。
温湿度センサはSDA=GPIO21, SCL=GPIO22に接続するのがデフォルトらしい。
I2C

I2C
I2C
CH1 SCL, CH2 SDA
1回目のデータにエラーがあったので100mS後にリトライしている。
この後、80mSにリトライするようにスケッチを修正した。
I2C
CH1 SCL, CH2 SDA
SCLとSDAを拡大。(1回目のデータ)

結論

I2C通信を行うにはWire.h(https://github.com/espressif/arduino-esp32/tree/master/libraries/Wire)があればよい。
DHT20を使うために、DHT20関連ライブラリを使ってもよいが、必須ではない。
ライブラリを使うと、センサから取得した値を温度湿度に変換する辺りは楽になる。
データシートを読めば自分で解決できる。
ライブラリが期待した動作をしない場合は、覚悟(ソースコードを読む・ライブラリを解析する)が必要になる。
Arduino core for the ESP32 (https://github.com/espressif/arduino-esp32)

同上ドキュメント I2C(https://github.com/espressif/arduino-esp32/blob/master/docs/source/api/i2c.rst)

ソフトウェア開発者ブログ ESP32とDHT20で作る温度・湿度測定デバイス(https://jpdebug.com/p/2819468)

畑から DHT20(温湿度測定器)を使う(for Arduino) (https://hatakekara.com/dht20-arduino/)