ノンコーディングでIoT！UIFlow（M5Flow）とNoodlの連携方法

#概要
　IoTや電子工作界隈で流行している「M5Stack」と「M5StickC」。開発環境は様々でArduino IDEやesp-idf、OSはobniz OSやMongoose OSなど多岐にわたります。
　その中で[M5STACK](https://m5stack.com/)公式が提供している環境に**UIFlow**という開発環境があります。これは**Blockly**というビジュアルプログラミング言語を使用してプログラムを構築できる環境です。詳しくは[こちら](https://m5stack.github.io/UIFlow_doc/ja/)を参照して下さい。

　M5Stackでプロトタイピングをしていて「スマホから制御したい」と思いUIを簡単に作れて連携できるツールを探していました。
　で、見つけたツールが[Noodl](https://tensorx.co.jp/noodl-jp/)。このツールはフローベースのビジュアルプログラミングツールで、ノードを配置し接続してUIを構築します。さらに、UIだけでなくMQTTやRESTを利用できるので外部連携も可能です！

#構成
　ということでUIFlowとNoodlを組み合わせて利用してみました。今回はNoodl
で作成したUIのボタンをタップすると、その状態でM5Stackの背景と文字を変えるデモを作ってみました。
　構成はこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/597ae395-06ae-d7ea-8baa-5eeee8462197.png)

#デモ
　このデモのソースコードは[こちら](https://github.com/kmaepu/UIFlow_Noodl_connect)で公開しています。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">M5StackとNoodlを連携してみたデモ。ノンコーディングで実現してます。<a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://twitter.com/hashtag/Noodl?src=hash&amp;ref_src=twsrc%5Etfw">#Noodl</a> <a href="https://t.co/17xw060Cc8">pic.twitter.com/17xw060Cc8</a></p>&mdash; まえぷー@アクアリウム管理装置を開発中 (@kmaepu) <a href="https://twitter.com/kmaepu/status/1200955585497186306?ref_src=twsrc%5Etfw">December 1, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

#UIFlow
　UIFlowの使い方の説明は省略します。詳しくは[こちら](https://m5stack.github.io/UIFlow_doc/ja/)を参照してください。
　作成したブロックはこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/d5333d08-d13c-065f-e1db-5aa24385426b.png)

##初期設定
　まず、SetupしたらMQTTの初期設定を行っています。MQTTについてはネットで調べると沢山情報があるので割愛します。今回使用したMQTTブローカは「shiftr.io」です。shiftr.ioについては[こちら](https://qiita.com/kmaepu/items/644b0bf2c3f438e71aa6)に設定方法をまとめました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/bf8ec0c6-5e01-b4c4-e4c2-b4a206698fa4.png)

　userとpassworにはshiftr.ioのトークン設定画面にあるKeyとSecretを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/b973126c-a4ca-b86c-11c1-b830bfd46702.png)

##処理
　処理の内容は次の通りです。
1. MQTTでデータを受け取ったら処理開始
2. データの中身が”ON”なら背景を黄色にしてデータの内容を表示
3. 違っていたら背景を水色にしてデータの中身を表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/c1f8727c-4ec7-2bcc-b74d-b44fe8db7ccb.png)

#Noodl
　Noodlのフローはこんな感じです。ちょとオシャレに見えるように、背景に画像を使っています。
  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/fcff128e-6713-8c61-b1a8-dc3a29731587.png)

##処理の概要
　中で行われている大まかな処理は次の通りです。
　↓ ボタンをタップ
　↓ 状態が切り替わる
　↓ 状態によって色が切りかえる
　↓ 円の色が変わる
　↓ MQTTで状態を送信

##処理の詳細
　ネックとなるのがボタンの処理です。ボタンのGroup（円）をタップすると状態が切り替わるようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/aa9869f7-8d59-88ab-1200-2da493d96220.png)

　状態管理ははStateノードを利用しています。この設定は次のようにしています。

- States　： ON　と OFF
- Color

　ON状態ではColorの値が"1"となり、OFF状態では"0"になります。ボタンの色を変えるために、Color Blendノードを使用しています。Color Blendノードの設定は次の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/69339de4-99b7-02a1-3d61-acc445c4ff04.png)

　また、状態が切り替わるとMQTTでデータを送信するようにしています。MQTTでデータを送信するにはプロジェクトの設定とSend Messageノードを使います。

　プロジェクトの設定は画面左上の歯車マークを押すと開けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/504da413-0b36-faeb-9617-d06eb9e9ca2c.png)

　プロジェクト設定の一番下に**External Bloker**という項目があるのでチェックします。
すると、Endpoint入力欄が表示されるので、shiftr.ioのトークンのURLを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/394a2e98-6203-d4d1-2190-f26636eb5619.png)

　Send Messageノードの設定は次の通りです。TopicはUIFlowのMQTT設定にあるtopicと同じ名前にする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/8488636f-0cfb-439b-d790-bc4f8f756a74.png)

以上で完了です。

#おわりに
　UIFlowとNoodlを利用し、ノンコーディングでここまで動かせるの凄いですね！。
Noodlの使い方はYoutubeの[こちら](https://www.youtube.com/watch?v=DzvFNN8OehM)が参考になると思います。

　皆様のものづくりライフがよりよくなると嬉しいです！