前回はNucleo F401RE用にビルドしたMicroPythonが結構高機能で嬉しいという話でした。今回はfrozen_mpyとしてMicroPython処理系に取り込まれている dht モジュールを使ってみます。温湿度センサが多数あるなか、古くから定番の温湿度センサDHT11のインタフェース用のモジュールです。
※「MicroPython的午睡」投稿順 Indexはこちら
「フローズン」mpyモジュール
マイコンボード上にインストールしたMicroPython処理系の中で、frozen_mpyモジュールは、ガチなオブジェクトコードとMicroPythonコードの中間的な存在です。MicroPythonのソースから mpy-crossツールをつかって最適化されたMicroPythonのバイトコードに変換しておいたものを、処理系のビルド時に取り込んでオブジェクトコードと一緒にFlashに書き込んだモジュールです。フラッシュの一部をMicroPythonのストレージとして使ってはいるものの、通常のストレージ部分に書き込んだモジュールと異なり、ファイルとしてはあからさまに見えない部分に書き込まれています。
さて、以下のようにして Nucleo-F401RE用にビルドしたMicroPython内蔵のモジュールを眺めてみるとありました。黄色で示した dht というのが frozen_mpyモジュールです(他にonewireとuasyncio。)
今回はこの dht モジュールをimportし、温湿度センサ DHT11 を使ってみたいと思います。
dhtモジュールを調べてみると、DHT11とDHT22の2つのセンサに対応しているようです。
手元には、DHT11センサしかないので、そちらを接続して動作確認してみます。
Nucleo F401REとDHT11の接続
現物写真は冒頭に掲げましたが、回路図は以下のようです。DHT11は5Vでも3Vでも動きますが、STM32F401REのGPIO端子は3.3V IO電圧なので、電源は3.3Vとしています。DHT11のDATA端子との接続は、ソフト制御なのでどのGPIO端子でもよいハズ。今回は Arduino式端子名D7 を接続しています。
なお、DHT11のデータシートの回路図では 5kΩでプルアップするように書かれていましたが、たまたま使用したGroveコネクタ用のDHT11搭載ボードが10kΩ使っていたのでそのままです。
実験に使ったMicroPythonソース
エラー対策とか何もなしの実験用のコードが以下に。前回やりましたが、Arduino式の端子名は、machine.Pin.board.Dチョメチョメ でアクセスできるのがミソです。
#STM32 DHT11 test import dht import machine import time def main(): d = dht.DHT11(machine.Pin.board.D7) d.measure() while True: print("Temperature : {0}".format(d.temperature())) print("Humidity : {0}".format(d.humidity())) time.sleep(5) if __name__ == "__main__": main()
実行結果
前回同様、Windows11上で走っているThonny IDEのバックエンドとして走っているNucleo F401REボードで上記を走らせた結果が以下に。
22℃、65%とな。そんなもんかね。