別シリーズのRubyちゃん(RX631上のmruby)にラズパイPico用に自前作成のフルMicroPythonのDHT11インタフェース関数を移植しましたが苦戦中です。今回はESP32版のMicroPythonでDHT11接続を行ってみます。ESP32版にはDHT用のモジュール装備されとります。これを使えば一撃と。
※「MicroPython的午睡」投稿順 Indexはこちら
ESP32版MicroPythonにはDHTドライバ完備
DHT11は、Arduinoでの電子工作などで定番の温湿度センサです。1-wire的な双方向の1線でマイコンと通信するもの。電源、グラウンドとあわせて3線接続すれば動くのでお手軽です。
いつもお世話になっております以下のMicroPythonのクイックリファレンス(日本語版)にはDHTドライバの記載があります。
別記事にて作成した、自前でフルPython記述のDHT11ドライバとは異なり、ESP32用のDHTドライバモジュールは、フルソフトウエア制御とは言えC言語レベルで実装されたモジュールをMicroPythonから呼び出して使うことになります。多分速度的には一桁くらい有利かと。Python記述では結構クリティカルなソフト制御もお茶の子さいさいと。ホントか?
それに、ESP32系でも使ってみたことがあるのです。対象のボードは今回のESP32-DevKitCとは異なりM5ATOMLiteですが。M5ATOMLiteはESP32搭載機種です。その時作製の実験プログラムを今回はほぼほぼ流用。以下記事の真ん中辺の短いコードです。
MicroPython的午睡(49) ATOMLite、温湿度を測ってNode-RED報告
今回実験のMicroPythonスクリプト
上記記事で作成したものをチョイ直ししただけのもの。dht11クラスをさらにラップしているESP32DHT11クラスをコンストラクトするときに引数にピン番号を与えれば設定OKです。
import dht import machine, time class ESP32DHT11: def __init__(self, pnum): self.dht11 = dht.DHT11(machine.Pin(pnum)) self.TEMP = None self.HUMI = None def measure(self): self.dht11.measure() self.TEMP = self.dht11.temperature() self.HUMI = self.dht11.humidity() return (self.TEMP, self.HUMI) def main(): print("ESP32, test DHT11 I/F functions") dht11 = ESP32DHT11(4) loopCounter = 0 while True: loopCounter += 1 tpl = dht11.measure() print("LOOPCOUNTER: ", loopCounter) print("TEMPERATURE: ", tpl[0]) print("HUMIDITY : ", tpl[1]) time.sleep(6) if __name__ == "__main__": main()
実機
Rubyちゃん記事でも使用したArduino用のモジュール(ボード上にプルアップ抵抗載っているのでお楽)の信号をESP32-DevKitCのピン4に接続してます。別にVDD、GNDの接続がいるのです。実は最初、OSERRORがでて波形が出てこないので慌てふためいたのです。またお約束でやらかしてました。理由は
VDDを33端子に接続していた
です。つまり3v3端子(3.3V電源)に接続しようとして 33番のIO端子に接続していたと。困った老眼の年寄であります。。。
念のためDHT11の信号の様子を以下に。昨日やったので覚えてますぞ。太いハイパルスと細いハイパルスがありますが、太いのが1、細いのが0です。最初の太いパルスはおいておいて次から0/1判定していきます。最初の8ビットが湿度の整数(%)部分、次の8ビットが湿度の小数部分(意味なし)、つづく8ビットが温度の整数、さらに8ビットの小数、最後にCRC8ビットという塩梅であります。合計40ビット。
実験結果
温度も湿度もそれらしい値が出力されております。
こう簡単に動いてしまうと、別シリーズのRubyちゃんでの苦闘はなんだったの?と。