農業用 “IoT環境センサー” をつくってみた

IoT 環境センサー

知識ほぼゼロの状態から、離れた場所の温度や湿度を計測して、クラウドにアップするIoT環境センサーづくりにチャンレンジします。備忘録的に書きますが、少しでも同じようなことを考えている方々の参考になれば最高!です。

使用するデバイス

今回使うデバイスは、マイコンM5StickC Plus2に、M5StickC ENV Hat III (SHT30/QMP6988)という環境センサーを組み合わせてつくっていきます。

これまでのIoTチャレンジでは、ラズベリーパイに何度か取り組んで(その後ほったらかして)を繰り返していましたが、調べたところ、今回想定している農業の育苗ハウスなどの場合、M5Stackシリーズが簡単に導入できそうだったので、こちらで試作品をつくることにしました。

何を実現するか?

今回つくるセンサーで実現したいこと、研究したいことは下記の4つです。

  1. 温度や湿度などを計測する「環境センサー」をつくる。
  2. 計測データをクラウドにアップして、遠隔でもデータを確認できる。
  3. 設定した温度などを超えた場合に、スマホに通知がくる。
  4. 電源周りの便利さの追求(ソーラー/バッテリー/省電力)
  5. 通信周りの便利さの追求(プライベートLoRaWANなど?)

農家の方々がハウスで育苗するときに、温度が高すぎないかなどを確認しにいく頻度をできるだけ減らして、生産性の向上に貢献できるデバイスを目指します。

参考サイト

参考にしたサイトは、下記のとおりです。

  1. M5Stackカフェ 温度計を作る 下島健彦氏
  2. UIFlow(Blockly)でAmbientにデータを送る アンビエントデーター株式会社
  3. M5stackシリーズとUIFlowでLineNotify 2023年度版 @dzonesasaki(Daizo Sasaki)氏

1.環境センサーをつくる

まずは、参考サイト1を手がかりに、温度などを表示する環境センサーを作成します。

まずは温度と湿度と気圧を画面に表示するブロック
Env_stick_001 温度、湿度、気圧の表示ができました。

基本的に、参考サイト1のとおりに順に進めながら、自分の作りたいように少し改変していけばOK。最初のうちは、どのブロックがどこにあるかを探すのに苦労しますが、慣れれば問題ありません。

少し困ったのが、ループのブロック(ずっと)で、5秒間隔で温度を更新する部分で、過去の温度表示が消えずに、重ね書きされておかしな表示になってしまうことでした。次の温度が表示 される前に、直前の温度表記を消す必要があります。

小数点以下の変化がある桁数が重複表示されてしまっています。

参考サイト1には解決策は見当たらず、ググっても解決策を見つけることができず迷走。

結果的に「グラフィック」カテゴリの中で見つけた「画面をクリア」ブロックを使うことで解決することができました。

「画面をクリア」ブロックを「グラフィック」カテゴリの中に発見

その他バージョンの違いにより、微妙に表示や言い回しが変わっていたりしますが、そこはなんとなく雰囲気で対応しましょう。

参考サイト1では、その後LEDテープで視覚的に温度表示をしていますが、今回の目的では必要ないので、スルーします。

2.計測データをクラウドにアップする

次は、参考サイト2を手がかりに、計測したデータをクラウドにアップして、遠隔地のスマホやPCから確認できるようにします。

env_stick_002 クラウド(Ambient)にデータをアップロードするブロック
表示は特に変わりませんが、更新を60秒ごとにしました。
Ambientにアップロードしたデータは、こんな感じで表示されます。

これまでは、計測した温度、湿度、気圧を直接テキストに表示していましたが、ここではそれぞれのデータを入れる変数(tmp、hmd、atm)を作成し、その変数を「表示」し、その後「アップロード」処理します。

変数を使うことで、同じデータを簡単に複数の処理に活用しやすくなります。

また、データ更新の間隔を5秒ごとから60秒ごとに変更しました。

データの更新やアップの頻度は、最終的にはクラウド利用や通信のコストにも関係してきますので、データの活用に必要な程度に調整してきます。

若干つまづいたポイントは2つ。

Ambientにアップロードするブロック(Ambient send)に入れる「writeKey」に、「’」(シングルクォーテーション)(上記の図の赤丸部分)で囲うのを知らずに、エラーでハマりました。

「なんでアップロードされないんだっ!」とイライラしましたが、参考サイトを読み直すと「ライトキーは引用符で囲ってください」とばっちり書いてありました。

説明をしっかり読む、かなり大切。

あと、「マップを作成」ブロックの「くぼみ」の中に入れるブロックはどこにある?と、こちらもけっこう迷いました。結果的には、ブロックのくぼみ下部の「+」を押せばOKでした。超簡単。

いずれも、わかってしまえば簡単ですが、解決前は永遠の迷い道。まさにパラダイムシフト。

では、次は「スマホにアラート」に参りましょう。

3.スマホにアラート(通知)を送る

次に、参考サイト3をヒントに、ラインと連携してスマホに通知が届く仕組みを作ります。

ライン通知機能(「もし〜」ブロック)実装後

今回も、当然のようにスムーズには行きませんでした。参考サイト3をヒントに、「もし〜」ブロックのところを足してみましたが・・・うんともすんともライン届かず。。。

「先に進めなくなったときは、サンプルをそのまま実行してみる。」という格言(適当)に立ち戻り、ダウンロード&実行(m5linenotify.m5fのテキストをコピーしてエディタで保存→Ulfrowで開く→tokenの部分だけ、自分がLINE Notifyで設定したtokenに書き換えして実行)すると・・・ライン届く!

こうなると、先が見えてきた感じ。

自分でつくったブロックと、ダウンロードして実行したブロックとの比較をしていくと・・・

ありました・・・

上記の図に赤丸をつけた2個所。「Bearer」と「message=」の最後「半角スペース」の有無が違う!

それぞれに半角スペースを入れたら、ぬるっとライン通知完成!

(動画終わりあたり)指で温めて30℃以上にすると、あらかじめ指定したラインへ警告が送られます。
こんな感じで届く!いいね!

ここまでで、基本的な機能(温度などを測る。クラウドにアップする。設定値を超えたらアラート通知を行う。)が実装できました。

ただ・・・ここで、重大な問題に気がつきます。

なんだか温度がおかしい!

明らかに、他の温度計で測るよりも・・・高い!

ぐぐってみると、下記のような情報を見つけました。。。

https://www.facebook.com/groups/154504605228235/posts/385704132108280/

「M5StickC用のENV Hatはお手軽ですが、M5StickCの発熱の影響で温度が高く表示されるのが残念。」

なーにぃ〜???(クールポコ風)

欠陥商品じゃないんかっ!

いろいろググった結果、ここについては、「ディープスリープ機能」を活用して、M5Stick本体を休ませて冷やし、測定したらまた休ませる、という方法で乗り越える必要がありそう。

やっと一区切り形が作れたかと思ったら・・・。

まあ、そんなもんですよね。また調べます。

4.電源を便利にする

未済。今後研究予定。

5.通信を便利にする

未済。今後研究予定。