ATOM Lite(ESP32)と温度湿度センサーDHT20を使って温度・湿度をMicroPythonで取得しました。
前置き(余談)
先日、PICを秋月電子さんに買いに行きましたが、なんとなくそれだけ買うと交通費がもったいない気がして、色々買ってしまったセンサーの一つです。
温湿度センサ モジュール DHT20 ¥380
https://akizukidenshi.com/catalog/g/gM-16732/
ちなみにDHT11、AM2302(旧名DHT22)という同種のセンサーもあって、通信方式が違うのですが、こちらの方が、MicroPythonにドライバーが組み込まれているので取り扱いは簡単だと思います(試していませんが)。DHT20を買ったのは、その前知識がなかったことと、安かったからですね。DHT20の通信方式はI2Cです。
ESP32 用クイックリファレンス
https://micropython-docs-ja.readthedocs.io/ja/latest/esp32/quickref.html#dht-driver
温湿度センサ モジュール DHT11 ¥480
https://akizukidenshi.com/catalog/g/gM-07003/
温湿度センサ モジュール AM2302 ¥950
https://akizukidenshi.com/catalog/g/gM-07002/
回路
DHT20はI2C通信で値を取得します。今回はMicroPythonのソフトウェアI2Cを使うので、GPIOは任意のピンが使えますが、G21をSCL、G25をSDAに使いました。
ATOM Lite DHT20 5V ---------- 1pin G21(SCL) ---- 4pin G25(SDA) ---- 2pin GND --------- 3pin
l
それぞれを直結で、SCLとSDAのプルアップ抵抗もなくて大丈夫みたいです。
プログラム
以下を参考にしました。今回使うのはMicroPythonで、参考サイトはPythonですが、そのまま使えるところが多くて良いですね。
温湿度センサーDHT20とAHT25の使い方 Raspberry Pi
https://s-design-tokyo.com/use-dht20-raspberrypi/
詳細は参考サイトまたはデータシート(7.4 Sensor Reading Process)を見るのが良いと思いますが、要点を書きますと、下記になります。
【プログラムの流れ】
・電源を入れて準備完了まで100ms待機
・状態確認(0x71を送って0x18が返ってくるか)
・状態(返り値が0x18じゃない)によっては初期化
・10ms待って測定開始コマンド送信
・測定完了まで80ms待機
・測定データ読み込み(7バイト読み込み)
・測定データを温度・湿度の物理量に変換
・連続で取得する場合は、測定開始コマンドから繰り返す
参考サイトにない点として、初期化の処理を加えました。何回かプログラムを回していると、状態確認で、0x18を返してこなくなり、データシートに「initialize the 0x1B, 0x1C, 0x1E registers」っとあったので、試しに空白にしてみたら上手くいきました。
ソース(MicroPython)
from machine import Pin, SoftI2C import utime def test(): i2c = SoftI2C(scl=Pin(21), sda=Pin(25), freq=100000) ls = i2c.scan() print(ls) if len(ls) == 0: print('no slave device') return addr = ls[0] #56 = 0x38 i2c.writeto(addr,b'\x71') ret = i2c.readfrom(addr, 1) if ret != b'\x18': print('init') i2c.writeto_mem(addr, 0x1B, b'') i2c.writeto_mem(addr, 0x1C, b'') i2c.writeto_mem(addr, 0x1E, b'') utime.sleep(0.01) i2c.writeto(addr,b'\x71') ret = i2c.readfrom(addr, 1) if ret != b'\x18': print('init error') return utime.sleep(0.01) i2c.writeto(addr,b'\xAC\x33\x00') utime.sleep(0.08) dat = i2c.readfrom(addr, 7) hum = dat[1] << 12 | dat[2] << 4 | ((dat[3] & 0xF0) >> 4) tmp = ((dat[3] & 0x0F) << 16) | dat[4] << 8 | dat[5] hum = hum / 2**20 * 100 tmp = tmp / 2**20 * 200 - 50 print('hum: ' + str(hum)) print('tmp: ' + str(tmp)) test()
データの変換は、参考サイトのコピペですが、なかったら苦労、っというかできなかっただろうなぁ。感謝!
なお、初期化は電源をOFFすることでも良いようです。
連続測定は発熱の影響を避けるには2秒以上間隔を置いたほうが良いとのこと。
PICマイコン(PIC16F1827)でDHT20のデータを取得
https://smtengkapi.com/pic16f1827-dht20