公開日:2023/06/17
title.png

26th Season


#26-1 温度・湿度リモート監視

 M5StickC PlusUIFlow開発環境を使って、温度・湿度のリモート監視システム👀を作成して行きます。

温度・湿度センサ

 本HPでしばしば使ってきた、お手軽な温度・湿度センサとしては、DHT11や、姉妹品のAM2302等が有ります(下図)。

ar24_dht11mdl.jpgar6_am2302.jpg

 お手軽ではあるのですが、以下記事で指摘した様に、実はM5StickC PlusのUIFlow開発環境では、非常に使い難い一面があります。

  「#25-9 I2C温度・湿度センサ化328duino

 特に、1線式シリアル通信方式は、例えば以下図(および、リンク先を参照)の様に、マイクロ秒オーダの実時間を計測しながら制御する必要があります。

ar6_bit01.png

 M5StickC PlusのUIFlow開発環境では、タイマブロック(下図)を使って、ミリ秒単位の時間を計測(Get ticks msブロック)することは可能なのですが、マイクロ秒の実時間を計測する手段が有りません。

a261_tmrblk.png

 このため、UIFlowのブロックで、DHT11からデータを読み出すことはできないのです。
 でも、ご安心ください。本HPでは、「#25-9 I2C温度・湿度センサ化328duino」の記事にて作成した「I2C温度・湿度センサ化328duino」があります(下図)。

a259_schem.pnga259_328d_i2cth.jpg

 I2C温度・湿度センサ化328duinoによって、マイクロ秒オーダの実時間制御が必要なDHT11との1線式シリアル通信は隠蔽され、M5StickC PlusのUIFlowからは単なるI2C通信方式の温度・湿度センサとして見えるようになっています。

UIFlowでI2C通信

 UIFlowには、I2C通信可能なブロックが備わっているため(下図)、I2C温度・湿度センサ化328duinoへ、アクセスすることができます。

a261_i2cblk.png

 I2Cマスタ通信用に、上図の他にも様々なブロックが備わっている様です。上図は、今回使いそうなところを抜粋しました。

I2C通信の初期化

 I2Cブロックの中から、i2c Master freqブロックを使うと、「portA」なるものがデフォルトで使えるように錯覚しますが、これを使っても、M5StickC PlusオンボードのI2Cバスにはアクセスできませんでした。Set i2c at sda scl freqブロックを使ってSCL=22、SDA=21を指定すると、M5StickC PlusオンボードI2CバスのRTCやIMU(加速度センサ)等のモジュールにアクセスできました。
 つまり、M5StickC Plus用に最適化されていないみたいなので、i2c0/i2c1どちらのチャンネルを使おうが、どのI/Oポートにアサインしようが、自由なのだと思われます。

 ここでは、外部のI2C温度・湿度センサ化328duinoにアクセスしたいので、拡張I/Oポート(下図)の中から、SCL=25、SDA=26を指定して使います。

a237_ioport.jpg


 I2C温度・湿度センサ化328duinoのスレーブアドレス=0x23を使って、初期化ブロックは以下の通りです。

a261_init328d.png

 上図の初期化コードでは、I2C温度・湿度センサ化328duinoのCNFGレジスタ(0x02番地)へ0x09を書き込んで、動作の初期設定も済ませてあります。

 もし、スレーブアドレス=0x23が見つからなかった場合、UIFlowのランタイムエラーで停止します。スレーブアドレスが見つからなかった場合に代替処理に飛ばすなど、自分でエラー処置したい場合には、スレーブアドレスをスキャンして、所望のスレーブモジュールの存在確認をするなど、一工夫必要となります。

16ビットデータの読み出し

 I2C温度・湿度センサ化328duinoの温度・湿度レジスタは16ビットサイズなのですが、上位バイトと下位バイト読み出しの間に、DHT11からのデータ読み出し処理が割り込んでしまうと、読み出したデータの上位/下位バイトが不整合を起こすので、バイトリードは禁止です。プロックリードコマンドを使ってアトミックに読み出す必要があります。
 UIFlowのI2Cブロックでは、以下のようにすると、ブロックリード(=16ビットワードリード)が可能です。

a261_read328d.png

 i2c Read Reg one short with decodeブロックが、実際にI2C通信で16ビットデータを読み出すためのブロックです。しかも、ご親切な事に、エンディアンをビッグ/リトルから選べるようになっています。便利、簡単、良き。

 上図の処理では、温度レジスタからの読み出しに対して、負数だった場合の処理や、固定小数点処理まで実施して、最終的に、変数dec_tmpに温度(浮動小数点型)、変数dec_humに湿度(浮動小数点型)が代入されています。

スマホで遠隔監視

 UIFlowとスマートホン(スマホ)との連携は、「#25-8 UIFlowとスマートホン連携」にて解説済みです。Remote+ブロックを使います。
 遠隔監視した温度・湿度は、スマホU/I画面エディタのラベルコントロールを使って、普通に数字(や、文字列)でも表示可能です。今回は別なコントロールを選択して、グラフィカルに表示してみようと思います。

ゲージコントロール

 スマホU/I画面エディタから、ゲージコントロールをドラッグして、配置します。下図は使い回しなので、右側に縦に並んでいるコントロールパレットに注目してください。一番下のアイコンが、ゲージコントロールです。

a258_smartph.png

 ゲージコントロールのアイコンをスマホ画面にドラッグして、配置します。すると、ブロックエディタ画面の方にも同時に、コールバックブロックが配置されるので、ゲージコントロールに表示したい数値(変数)を返す様にすれば、スマホ画面に反映されます。下図は、コールバックブロックを処置した後の様子です。

a261_cbkblk.png


 ゲージコントロールに限らず、他のコントロールにも共通する事なのですが、コントロールの更新時間間隔を指定しなくてはなりません。

 筆者が使って見た感覚では、更新時間間隔は5〜10[秒]間隔くらいにして使うのが無難かな?という印象でした。各自使って見て、調整してください。

上図では、10,000ms=10sに設定してあります。時間はブロックエディタの方では変更できず、スマホU/I画面エディタの方で設定します。

チャートコントロール

 グラフィカルに表示可能なコントロールとして、もう一種類、スマホ画面にグラフを表示することのできるチャートコントロールと言う物が有ります。
 他のコントロールは、コールバックブロックで適切な値を返すことで、データをスマホ画面に反映することができるのですが、チャートコントロールだけはEzDataと言う、UIFlowのクラウドデータストレージシステムでデータを渡す必要があります。

 解説は端折って、結論だけ備忘録として以下図に示しておきます。

a261_ezd_chart.png

 更に先の結論を言ってしまうと、今回、この機能(チャートコントロールおよびEzDataブロック)を使う事は断念しました。

 理由は簡単、UIFlowのバグに阻まれたから、です。

 現象を個々にレポートすることは避けますが、EzDataへのアクセスが、しばしばランタイムエラーを引き起こしたり、単にM5Fファイルとしてセーブ/ロードしただけにもかかわらず、スマホU/I画面エディタに配置したチャートコントロールが化けてしまうなど、全く収拾がつきませんでした。
 色々試してみても、発生する条件が判らず、ある時、突然発症しているので、原因不明かつ、回避不能なのです。


 UIFlowの、ブロックを使ったプログラミングは楽しいし、スマホとの連携プログラムも簡単に作成できます。良い所も沢山あるのですが、如何せんバグが多すぎます。
 ここまで触れずに来たのですが、日本語フォント(Unicode 16)も相当な割合で壊れていて、正しく表示されない文字を多数確認しています。日本語でさえ、まともにTFT表示できない状態です。

 兎に角、UIFlowに関しては、全てに言及しきれないほど多数のバグを確認しています。いい加減、バグを回避しながら使うのに疲れてきました……。

  もっとちゃんとしてよ ⇒ 開発者 各位

 こういう中華品質、いつまで続けるつもりなの??感じ悪ぅ。

プログラム

 と、言う事で、チャートコントロールを使う事は断念したのですが、ゲージコントロールを使う事で、目的は達成できました。以下に、完成したプログラムをリンクしておきます。

  完成プログラム:remote_th_mon.m5f

 UIFlowオンライン版で読み込んで、M5StickC Plusへ転送して使ってください。UIFlow開発環境の立ち上げ記事はこちらから参照してください。

実験の遠隔監視

 「#25-9 I2C温度・湿度センサ化328duino」で作成したI2C温度・湿度センサ化328duinoと、M5StickC Plusを使います。定格電圧が異なるので、以下表の通り、M5StickC Plusとの間にレベルシフタ(L/S)を挟んで接続してください。

M5StickC Plus 接続 レベルシフタ(L/S) 接続 I2C温度・湿度センサ化328duino
GND GND GND
5V(出力) HV Vcc
3.3V LV  
G25(SCL) LV1
G26(SDA) LV2
  HV1 SCL
HV2 SDA


 以下図に、実験中の様子を示します。

a261_expr.jpg

 ちょっと、写真が小さくて見えないと思いますが、M5StickC PlusのTFTディスプレイにも、測定した温度・湿度が表示されています。が、主目的はスマホから遠隔監視することですので、スマホ画面で確認してみましょう。

 「#25-8 UIFlowとスマートホン連携」と同様に、M5StickC PlusのTFTディスプレイに表示されたQRコードをスマホで読み取って、URLを開きます。すると、以下図の様なページがスマホの画面に表示されました。

a261_expr_smtph.jpg

 上図がゲージコントロールの実物です。それらしくグラフィカルに表示されるだけでなく、ゲージの中に数値でも表示されるので、具体的な数値が知りたい時でも大丈夫です。
 M5StickC Plusとスマホが、各々WiFiネットワークに接続してさえいれば、地球の裏側程離れた場所からでも、M5StickC Plusの置かれた場所の温度・湿度を遠隔監視することができます。M5StickC Plusで測定したセンサからのデータを、スマホで遠隔監視できる意義は大きいのではないでしょうか?色々と応用のアイディアが浮かびます。

※なお、URLさえ判れば、PC上のブラウザ(Fire Fox)からでもデータを確認することができました。


 色々と応用のアイディアは湧くのですが、UIFlowはバグだらけなので、本格的なシステムを設計するならArduino IDEを使った方が開発効率は良いのではないでしょうか?つくづく、残念。開発環境のバグに悩まされる事ほど、くだらなくて、バカバカしい事はありまませんから……。


btn_arduino.png

btn_prev.png btn_next.png

home