以前、マイクロビットとESPr Developerを使ってゲートウェイをつくりました(記事は こちら)。
複数のマイクロビット(IoT端末)から無線で送られてくるデータを受信し、そのデータをWebサーバに送信するものです。
マイクロビット(無線データ受信用)とESPr Developer(Wi-Fiデータ送信用)の2チップ構成となっており、両者の間はシリアル通信でデータ転送します。
とても簡単に実現できるのですが、マイクロビット − ESPr Developer間の接続にはブレッドボードなどを使っており、その部分の接続作業だけが若干煩雑になっていました。
そんな中「M5:Bit micro:bit用変換ボード」という製品を見つけました。
マイクロビット用の拡張ボードなのですが、シリアル通信用のGROVEポートを備えています。
ESPr Developerの代わりに、GROVEポートを備えた「M5Stack」などを使うことで、両者の接続が格段に容易になり、より簡単にゲートウェイがつくれそうです。
そんな訳で、早速試してみました。
こちらが「M5:Bit micro:bit用変換ボード」です(税込660円)。
マイクロビットをセットすると、こんな感じになります。
GROVEケーブルでM5Stackと繋ぐと、こんな感じになります。
それではプログラムをつくっていきます。
まずはIoT端末用マイクロビットのプログラムです。
適当なタイミングで「デバイス番号」を無線送信します。
ボタンAを押すことで、デバイス番号を変更できます。
次はゲートウェイ用マイクロビットのプログラムです。
無線受信したら、受信した「デバイス番号」と受信したときの「信号強度」をカンマ区切りでつないで、それをシリアル通信で書き出します。
最後はM5Stack用のスケッチです。
#include <M5Stack.h> int c = M5.Lcd.color565(255, 255, 255); void setup() { M5.begin(); Serial2.begin(115200, SERIAL_8N1, 22, 21); } void loop() { if(Serial2.available()) { String values = Serial2.readStringUntil('\n'); int pos1 = values.indexOf(','); int pos2 = values.indexOf('\n'); String value0 = values.substring(0, pos1); String value1 = values.substring(pos1+1, pos2-(pos1+1)); int device = value0.toInt(); int level = value1.toInt(); switch(device) { case 0: c = M5.Lcd.color565(255, 209, 209); // red break; case 1: c = M5.Lcd.color565(255, 209, 255); // pink break; case 2: c = M5.Lcd.color565(209, 209, 255); // purple break; case 3: c = M5.Lcd.color565(209, 255, 255); // blue break; case 4: c = M5.Lcd.color565(209, 255, 209); // green break; default: c = M5.Lcd.color565(255, 255, 209); // yellow } int x = random(0, 320); int y = random(0, 240); int r = map(constrain(level, -90, -50), -90, -50, 5, 30); M5.Lcd.fillCircle(x, y, r, c); } }
シリアル通信で1行読み込んだら、その文字列をカンマで分割し、「デバイス番号」と「信号強度」を取り出します。
それらの情報に基づいて「円」の色と大きさを決定し、LCD画面上の適当な場所に表示します。
結果は以下のとおりです。
とても簡単に、IoT端末用マイクロビットのデータをM5Stackまで受け渡すことができました。
M5Stack用のスケッチを、データをWebサーバに送信するように書き換えるだけで、お手軽にゲートウェイをつくることができます。