M5GOを用いた家庭菜園向け環境管理IoTシステム「オレのミギウデ」(旭川高専：エンジニアリング演習)

# 注意
本記事は**旭川高専で行われた授業を学生が書いたもの**ですので、**旭川高専の公式な記事ではございません。**　
留意したうえで読んでいただきますよう、お願い申し上げます。
# はじめに
皆さんM5GOを使ったことありますか？
>M5GOとは何ですか？
M5GOは、 ESP32というマイコン(超小型コンピュータ) をつかったプログラミングできる小型コンピュータです。 無線接続用のWi-FiとBluetoothが使えて、9軸加速度センサやスピーカー、フルカラーLEDバーなどもついています。(はじめてのM5GOより引用)

つまりESP32が、ちょっと簡単にさわれるようになったマイコンってことです。
そもそも、ESP32が何？というのはggってください。

# 今回の記事のきっかけ
わたしは旭川高専生なのですが、「エンジニアリング演習」という授業の一環でM5GOを利用したソリューション作成というのがありました。  
センサモジュール等を用いてなんか作って来いってことですね。何でもやっていいわけです。  
その授業の一環で作成したもの(たいそうなものではないですが)一応書き記しておこうと思います。たぶん、自作志向な人ならすぐ作れるようなものです。割と実用的かなとも思いますし(自画自賛)。  

# 経緯・概要
筆者自身の経験から作られるものなのですが、(ビジネスコンテストとかでは絶対NGな観点ですが今回は作るだけなので)家庭菜園の水やりを忘れる問題を克服するための機材です。  
筆者は今までも何度かミニトマトなどの育成に挑戦していますが、なかなか成功しないのです。それが水やりを忘れるといったところなんです。枯れてしまうんですよね。  
面倒だとかそういう心情ではなく、ただ単に「忘れる」んですよね。  
それを今回は解消していこうと思います。   

  基本的に、土壌水分センサ(EARTHセンサ)と環境センサ(ENVセンサ)を用いてものを作ります。  
  画面に表示させるだけじゃ面白くないので、クラウド連携を試みてAmbientやWebhookを活用した通知も実装します。そこまで難しくないのですが、ベースがBlockyなので日本語弱者な私は結構苦しみました。  
  
# 構成
![M5GO.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628829/7907ace3-8079-c42b-759b-7d74891e3778.png)
基本的にこんな構成です。  
M5GOはA,B,Cピンという概念があるので、そこだけ注意しなければなりません。  
Aピンにささるセンサは個々のセンサにI2Cのアドレスがついているので、プラグインプレイのHUBを仲介させるだけで台数を増やせるのですが、B,Cのピンではそうはいきません。  
きちんとアドレスや設定をしてあげなければならないのですが、いくら格闘してもEARTHセンサの複数設置は無理でした。デジタル信号は読めるのですが、アナログの値(抵抗値なのかわからないけど)を取得できないので諦めました。ここら辺は、もしかしたらESP32やM5Stackのほうがいいかもしれません。  

ちなみに今回の環境では  M5GOのIoTスターターキットを使用しています。その状態でのピンの使用状況ですが、  

    ・Aピン＝ENVセンサ
    ・Bピン＝EARTHセンサ
です。
もし、ほかにセンサ・スイッチ類を設置する場合は設計をし直す必要があるかもしれません。まあ、そこまで大掛かりになることはないと思います。  
ESP32にはあるWi-Fiを利活用してWebhookをたたきに行ったりAmbientに送り付けたりしてます。ここら辺がミソかもしれませんが、案外簡単です。  

# 開発環境
Windows 11
M5GO
UIFlow v1.0 web(M5Stack社が開発した開発環境。後述するが、Web版を今回は使う。)

# レシピ
以下レシピです。
## M5GOをWi-Fiにつなげる
そこまで難しくないです。が、いくつか注意点があります。  
私みたいなよわよわエンジニアじゃわからなかっただけかもしれませんが、一応書き入れます。

    ・SSIDは短くしましょう(アルファベット・5文字を目安に)
    ・日本語はできるだけ避けましょう
    ・Proxy環境下はやめましょう

なぜか私の環境かだと10文字程度のSSIDをもったAPに接続することができませんでした。何が原因だったのかわかりませんが、つながったのでよしということにしておきます。
またネットワークの接続にProxyが必要な環境ではできるだけやらないほうが賢明です。(例：学内ネットワーク)  

[詳細な接続の仕方はこちら](https://mag.switch-science.com/2018/07/09/m5go-handson/)を参照したほうがいいと思います。

## UIFlowを開く
今回は開発にUIFlowを用いてBlockyでの実装を行います。
基本的にはスクラッチと同じでブロックプログラミングです。  
内部的にはMicroPythonで動作しています。Web版とDesktop版があり、今回はWiFi経由接続を行うのでWeb版で行います。ですが、センサー類のテストするときは、問題の切り分けが簡単なのでシリアル接続のほうがいいと思います。どちらも環境を整えておくと便利でしょう。　
シリアル接続する際はCOMポートドライバの「CP210x Universal Windows Driver」を入れなきゃいけないかもしれないので、事前に入れておきましょう。  

[Web版はこちらから](https://flow.m5stack.com/)アクセスできます！　

![スクリーンショット 2024-02-15 121113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628829/18085c9d-6c57-21ea-1b81-dd87d56c0b78.png)　

こんな感じの画面になれば無事UIFlowを開けています。

## センサを接続する
センサを接続しましょう。　
基本的にこのM5GOは「どのセンサはどこに接続しなさい」という指示がありますので、それに従いましょう。間違った場所に刺すと最悪ぶっこわれます！　

今回は構成でも書いたように　

    ・Aピン＝ENVセンサ
    ・Bピン＝EARTHセンサ
の構成なので、このように差し込みます。

センサを物理的に接続することができたら、UIFlowでUnitを追加しなければならないのでその作業を行います。　

![スクリーンショット 2024-02-15 115831.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628829/6d6010b1-1640-8988-37b0-0fc60b731cf2.png)　

M5GOのセンサ一覧が出てきますので、接続したセンサを選択しましょう。 

画面左側にこのような感じのUIが出ていると思います。　
Unitsの下部分の＋のようなマークのボタンをクリックすると、以下のような画面が出てきます。　
![スクリーンショット 2024-02-15 121700.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628829/fe92ee38-91a2-fbdc-3040-88e01a53b245.png)

今回の僕の環境ではENV IIとEARTHなので、それらを選択していきます。　
選択すると、以下のようにポートを選ぶプルダウンが表示されると思います。　
![スクリーンショット 2024-02-15 121826.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628829/4341b0dc-cb35-4418-ca86-89ec1ad801ec.png)
接続したポートに合うように設定しましょう。　
EARTHも同じように作業をこなします。　

接続できて、以下のようなアイコンが出てくれば成功です。
![スクリーンショット 2024-02-15 121953.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628829/018a157d-e08d-de4f-6310-7e8c30e757c7.png)

## コーディングする
以下が今回実際に実装したコードの全体像です。  

[１：センサの値を変数に代入、画面に値を表示]
![スクリーンショット 2024-02-08 103526.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628829/f3bc7a7f-0183-bea7-928f-6d2bfe824349.png)  

  [２：Webhookを使ってDiscordにメッセージを送信]
![スクリーンショット 2024-02-08 103541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628829/01ed9824-49f8-1bf8-8d40-611eb0b95e34.png)  

  [３：Ambientにメッセージを送信する部分]
![スクリーンショット 2024-02-08 103555.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628829/edaf8b8c-3c89-7ff9-d5d3-391e72905f1a.png)

そこまでコード自体も長くないため、2-3時間あれば問題なく実装することが可能だと思います。  
筆者は2時間ほどで実装しました。　

では実際にコードの解説をします。　

### １：センサの値を変数に代入、画面に値を表示　
この部分はM5GOに接続したセンサの値を変数に格納して、画面に表示する機能を担っています。　
Setupブロックの下に入ってる繰り返し(While)は、起動したシステムが終了する際の条件です。M5GOにはボタンがついているので、ボタンを押したときにそのプログラムのループが終了するようになっています。　
まあ、このシステムが起こしたら起こしっぱなしというようなシステムなので、そこまで終了することはないと思うので実装しなくてもいいとは思います。　

その下の4行は変数に値を入れているだけなので、特に小難しいことはないです。　
上から

    ・Earth=土壌水分のアナログ値(これは表示させても何かすらわからないため表示しない)
    ・atm=Atmosphere,気圧
    ・temp=temperature,温度
    ・rh=Relative humidity,相対湿度

です。　　

テキストの表示座標はうまいことやってください。　
M5GO専用のエディタならこういうのをグラフィカルに設定する機能がUIFlowにあってもいいんじゃないかなと思ってしまったりしましたが、そこまで時間かかるわけじゃないのでまあいいかと思ったり。　

### ２：Webhookを使ってDiscordにメッセージを送信
Webhookってなんぞやという人向けに、

    webhook（ウェブフック）はweb開発でカスタムのコールバックを用いてウェブページや
    ウェブアプリケーションの動作を追加または変更するための方法である。　
    (引用：wikipedia)

ということです。　
つまりは、イベント発生時、指定したURLにPOSTリクエストとかをするってわけですね。　

今回はDiscordのWebhookを利用して土壌水分センサをトリガーにし、ユーザーに通知するシステムを構築しています。今回利用しているBlockyにはHTTPリクエストブロックがあるので、それを利用します。　
基本的にはコードを丸パクリしてURLだけ変更すれば動作すると思いますので、要所要所かいつまんで解説していきます。　

#### メソッド
これはPOSTに設定してください。リクエストを送信する設定になります。　
他のアプリケーション(ex.Teams,Slack...)を利用する際でもPOSTだと思いますが、利用する媒体のリファレンスなどを読み実装しましょう。　

#### URL
WebhookのURLになります。今回はDiscordのチャンネルに通知するので、DiscordのURLが記述してあります。　

DiscordでのWebhook URLの取得方法を一応解説してみます。　
**Discordのアカウントを取得し、サーバーを立てていることを前提**でこの解説を行います。
また、送信先のDiscordサーバーでWebhook URLを生成できる権限が必要なので、オープンコミュニティでの実装を考えている人は自分のアカウントに紐づいた権限を確認しましょう。　

![スクリーンショット 2024-02-15 133000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628829/6b50b2a0-9b0e-5c45-b845-3567e59b9ee3.png)

 サーバーのなかでこのような画面までいき、送信したいチャンネル（今回はwebhook）の歯車ボタンを押しましょう。　
 
![スクリーンショット 2024-02-15 133104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628829/3e07b0f2-6b05-1929-27e5-70a35c362212.png)　

編集画面が出たら、「連携サービス」の画面へ行きましょう。　
そうするとウェブフックを確認があるのでクリックしましょう。　

![スクリーンショット 2024-02-15 133234.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628829/4c1c5b55-c0e4-8e8e-d60e-dbf4f546eaea.png)

 このような画面に行くと思いますので、新しいウェブフックをクリックしましょう。　
 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628829/f35edc24-7ab0-bb3d-5078-9a485b7dbc03.png)

そうするとWebhookが生成されますので、生成されたWebhookをクリックし、URLをコピーしましょう。
 これで生成は終了です。

 リンクがあればほかのサービスでもほとんど使えると思いますので、活用しましょう。　

 #### マップを作成-username/content-
 Discordにメッセージが送信されるときのユーザー名と、メッセージの内容です。
 今回は以下のように設定しています。

     username : JM8PSY-M5GO
     content : Nodo ga KAWAITA

contentのValueは**日本語ではなくローマ字で入力しましょう。** うまく送信することができません。　
きっと文字コードの問題なんじゃないかなと思い、解決を試みたのですが時間の都合上、途中であきらめました。解決方法があると思いますので、どなたかご指摘お願いします。　

#### その他実装部分
M5GOはLEDを使用できるので、水が少ないときは赤色に設定し、Webhookのメッセージ通知をしています。
スピーカー部分は開発段階での、送信動作確認的な意味合いで実装していましたが、そのまま機能として実装しています。送信に成功した時には1回、失敗した時には2回なるように実装しています。　

### ３：Ambientにメッセージを送信する部分　
AmbientとM5GOを組み合わせたシステムに関することは[こちらのサイト](https://www.xeex-ti.jp/rndblog/2020/2020-m5stack-use-ambient/)のほうが詳しくわかりやすく記述されてるので、こちらを参照してください。

## 実行してみよう
実際に実行してみましょう。　
センサを湿った土壌の中に刺し、準備を行いましょう。WiFi経由であればRunボタン一つで実行できるので、押すとすぐに実行されます。　

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628829/72e3f75c-5639-e2f6-1ee5-237835c860be.png)　

正常に実行されれば、LEDが光り、Ambientにデータが送信されると思います。
Ambientに正常送信されれば、数分放置するとグラフができると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628829/4398575d-2ae8-0f49-8a50-6acc7ca7470e.png)

もし出力されていなかったら、WiFiの疎通を確認することや、Ambientの設定の確認をしてください。　
また、Webhookのテストのために、一度土壌水分センサを土から出してみましょう。正常に動作していると、ループの時に、水分が少ない判定をしてLEDが赤くなりメッセージが飛んでくるはずです。　

## そのまま使ってみよう
1日使ってみました。　
場所は研究室の日当たりが悪い場所（これがよくなかった）に設置してました。　

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628829/eca8be7f-2e27-a398-4b42-60c1e510a142.png)

こんな感じの結果が得られたのですが、一度も土が乾いたというメッセージが来なかったんです。コードがダメだったかなと思いつつ、次の日の朝見に行くと、まだ土が濡れていました。　
日当たりが悪い場所に置いておいたから、あんまり土が乾かなかったんだなと気づき、ちょっと落ち込みました。　

あと、土壌水分センサのアナログ値からメッセージを送ったりするための閾値を150に設定していたけども、どうやら低すぎたようであると思った。個人的には250くらいがいいのかなと思っている（まだ試していない）。　

M5GOの発熱とかも少し気にしていたがそこまで問題がなかったようにうかがえる。だが、ディスプレイを使っている以上あまりにもバッテリー持ちが悪いのでUSB給電は必須になるだろう。

**人がいない部屋って、案外寒いんだな。**

## 実用化に向けた改善点
普通にESP32でいいので（M5GOである必要性がない）、MicroPythonか何かを使ってまた書き直したいなという次第である。普通にBlockyで構築していくのはこれからの保守性を考えると微妙だと思う。
あと、完全に電気を自給自足させたいからウォルボックスか何かに入れて、ソーラーとリチウムイオン電池の組み合わせで完全にスタンドアロンにさせるのも構想として考えている。　
できれば一枚のマイコンで複数のプランタを確認したいので、そこも対応する必要がある。
そして、土壌水分センサの耐久性がないのが大きな問題なので、そこを解決する必要がある。これに関しては、自作方法がすでに公開されているので、[このサイト](https://note.com/ats030/n/nae62f61d61b2)を参考に開発をしてもいいのかなと思っている。

## 最後に
僕は小学生のころから育てるのは好きだったんですが、どうも水やりという行動を忘れてしまうことが多かったのでこれで念願の自作トマト(ワードがちょっとメカメカしいですが)を食べれるんじゃないかと思うと楽しみで仕方がないです。
M5GOはこれくらいのことなら結構簡単にすぐできるので、皆さんも時間があればやってみるといいと思います。