M5StickC PlusのUIFlow開発環境を使って、温度・湿度のリモート監視システム👀を作成して行きます。
本HPでしばしば使ってきた、お手軽な温度・湿度センサとしては、DHT11や、姉妹品のAM2302等が有ります(下図)。
お手軽ではあるのですが、以下記事で指摘した様に、実はM5StickC PlusのUIFlow開発環境では、非常に使い難い一面があります。
「#25-9 I2C温度・湿度センサ化328duino」
特に、1線式シリアル通信方式は、例えば以下図(および、リンク先を参照)の様に、マイクロ秒オーダの実時間を計測しながら制御する必要があります。
M5StickC PlusのUIFlow開発環境では、タイマブロック(下図)を使って、ミリ秒単位の時間を計測(Get ticks msブロック)することは可能なのですが、マイクロ秒の実時間を計測する手段が有りません。
このため、UIFlowのブロックで、DHT11からデータを読み出すことはできないのです。
でも、ご安心ください。本HPでは、「#25-9 I2C温度・湿度センサ化328duino」の記事にて作成した「I2C温度・湿度センサ化328duino」があります(下図)。
I2C温度・湿度センサ化328duinoによって、マイクロ秒オーダの実時間制御が必要なDHT11との1線式シリアル通信は隠蔽され、M5StickC PlusのUIFlowからは単なるI2C通信方式の温度・湿度センサとして見えるようになっています。
UIFlowには、I2C通信可能なブロックが備わっているため(下図)、I2C温度・湿度センサ化328duinoへ、アクセスすることができます。
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を指定して使います。
I2C温度・湿度センサ化328duinoのスレーブアドレス=0x23を使って、初期化ブロックは以下の通りです。
上図の初期化コードでは、I2C温度・湿度センサ化328duinoのCNFGレジスタ(0x02番地)へ0x09を書き込んで、動作の初期設定も済ませてあります。
もし、スレーブアドレス=0x23が見つからなかった場合、UIFlowのランタイムエラーで停止します。スレーブアドレスが見つからなかった場合に代替処理に飛ばすなど、自分でエラー処置したい場合には、スレーブアドレスをスキャンして、所望のスレーブモジュールの存在確認をするなど、一工夫必要となります。
I2C温度・湿度センサ化328duinoの温度・湿度レジスタは16ビットサイズなのですが、上位バイトと下位バイト読み出しの間に、DHT11からのデータ読み出し処理が割り込んでしまうと、読み出したデータの上位/下位バイトが不整合を起こすので、バイトリードは禁止です。プロックリードコマンドを使ってアトミックに読み出す必要があります。
UIFlowのI2Cブロックでは、以下のようにすると、ブロックリード(=16ビットワードリード)が可能です。
i2c Read Reg one short with decodeブロックが、実際にI2C通信で16ビットデータを読み出すためのブロックです。しかも、ご親切な事に、エンディアンをビッグ/リトルから選べるようになっています。便利、簡単、良き。
上図の処理では、温度レジスタからの読み出しに対して、負数だった場合の処理や、固定小数処理まで実施して、最終的に、変数dec_tmpに温度(浮動小数型)、変数dec_humに湿度(浮動小数型)が代入されています。
UIFlowとスマートホン(スマホ)との連携は、「#25-8 UIFlowとスマートホン連携」にて解説済みです。Remote+ブロックを使います。
遠隔監視した温度・湿度は、スマホU/I画面エディタのラベルコントロールを使って、普通に数字(や、文字列)でも表示可能です。今回は別なコントロールを選択して、グラフィカルに表示してみようと思います。
スマホU/I画面エディタから、ゲージコントロールをドラッグして、配置します。下図は使い回しなので、右側に縦に並んでいるコントロールパレットに注目してください。一番下のアイコンが、ゲージコントロールです。
ゲージコントロールのアイコンをスマホ画面にドラッグして、配置します。すると、ブロックエディタ画面の方にも同時に、コールバックブロックが配置されるので、ゲージコントロールに表示したい数値(変数)を返す様にすれば、スマホ画面に反映されます。下図は、コールバックブロックを処置した後の様子です。
ゲージコントロールに限らず、他のコントロールにも共通する事なのですが、コントロールの更新時間間隔を指定しなくてはなりません。
筆者が使って見た感覚では、更新時間間隔は5〜10[秒]間隔くらいにして使うのが無難かな?という印象でした。各自使って見て、調整してください。
※上図では、10,000ms=10sに設定してあります。時間はブロックエディタの方では変更できず、スマホU/I画面エディタの方で設定します。
グラフィカルに表示可能なコントロールとして、もう一種類、スマホ画面にグラフを表示することのできるチャートコントロールと言う物が有ります。
他のコントロールは、コールバックブロックで適切な値を返すことで、データをスマホ画面に反映することができるのですが、チャートコントロールだけはEzDataと言う、UIFlowのクラウドデータストレージシステムでデータを渡す必要があります。
解説は端折って、結論だけ備忘録として以下図に示しておきます。
更に先の結論を言ってしまうと、今回、この機能(チャートコントロールおよび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 |
以下図に、実験中の様子を示します。
ちょっと、写真が小さくて見えないと思いますが、M5StickC PlusのTFTディスプレイにも、測定した温度・湿度が表示されています。が、主目的はスマホから遠隔監視することですので、スマホ画面で確認してみましょう。
「#25-8 UIFlowとスマートホン連携」と同様に、M5StickC PlusのTFTディスプレイに表示されたQRコードをスマホで読み取って、URLを開きます。すると、以下図の様なページがスマホの画面に表示されました。
上図がゲージコントロールの実物です。それらしくグラフィカルに表示されるだけでなく、ゲージの中に数値でも表示されるので、具体的な数値が知りたい時でも大丈夫です。
M5StickC Plusとスマホが、各々WiFiネットワークに接続してさえいれば、地球の裏側程離れた場所からでも、M5StickC Plusの置かれた場所の温度・湿度を遠隔監視することができます。M5StickC Plusで測定したセンサからのデータを、スマホで遠隔監視できる意義は大きいのではないでしょうか?色々と応用のアイディアが浮かびます。
※なお、URLさえ判れば、PC上のブラウザ(Fire Fox)からでもデータを確認することができました。
色々と応用のアイディアは湧くのですが、UIFlowはバグだらけなので、本格的なシステムを設計するならArduino IDEを使った方が開発効率は良いのではないでしょうか?つくづく、残念。開発環境のバグに悩まされる事ほど、くだらなくて、バカバカしい事はありまませんから……。