前回は、Seeed社XiaoシリーズのRISC-VコアESP32C3搭載機からMQTTメッセージをPublish、NodeREDサーバでメッセージを受領、PCブラウザ上に表示しているNodeREDダッシュボード上に表示しました。今回はダッシュボードのスイッチのON/OFFでXiaoESP32C3にとりつけたLEDを点滅させてみます。
※「IoT何をいまさら」投稿順Indexはこちら
前回はXiaoESP32C3は、MQTTに向かってPublishするばかりで、Subscribeしてませんでした。今回はSubscribeをしてみる回です。NodeRED側から受け取るのはLEDをONするかOFFするかの「指令」です。これでパソコンのブラウザ上でスイッチを操作すればXiaoESP32C3の端子に接続したLEDが制御できると。
なお、XiaoESP32C3にはユーザLEDなどは搭載されていないので、端子D0の先に電流制限抵抗を介してLEDを接続してあります。
NodeRED側の設定
通信は相手があるものなので、まずはNodeRED側の設定をしておかねばなりません。当方環境では「サーバ機として頑張っている」ラズパイ3上でNodeREDサーバ、MQTTブローカであるMosquittoとも動作しています。しかし実際にはNodeREDエディタもNodeREDダッシュボードもパソコンのブラウザ上に表示されるので、ラズパイ3にログインして操作するという手順はまず無いのでありますが。
前回のXiaoESP32C3からのメッセージ受信フローが上、今回追加のNodeREDからLED点灯消灯指令のフローが下です。超簡単?
さて上記の左下の「LED ON/OFF」と表示されているNodeREDダッシュボードの switchノード(NodeREDのフロー制御のswitchノードとは違います)の設定が以下に。
ポイントは、スイッチONで文字「1」をOFFで「0」を送出することです。1バイトの半角文字が送られるっと。
上記のswitchノードから流れてきた msg を MQTTブローカ(mosquitto_Pi3というお名前)に伝えるのが以下の mqtt out ノードのお役目です。その際 publishする先のトピック名は XiaoESP32C3/LEDです。
XiaoESP32C3側のソースコード
今回もArduino環境を使わせていただいております。前回のコードの「チョイ変」で MQTT Subscribe 機能を追加しただけのものです。もっと言えば第74回でM5StackC用に実験したコードの子孫(というほどでもないか。)
走らせると MQTTのトピック XiaoESP32C3/Status に「待ってるからね」メッセージを送り、その後 トピック XiaoESP32C3/LED にメッセージが到来したら、それに対応してLEDを操作します。半角1なら点灯、半角0なら消灯です。それ以外は無視します。
#include <WiFi.h> #include <ArduinoMqttClient.h> int led = D0; char *ssid = "Your SSID"; char *password = "Your password"; const char broker[] = "Your broker address"; const int brokerPort = 1883; const char topic[] = "XiaoESP32C3/Status"; const char subtopic[] = "XiaoESP32C3/LED"; WiFiClient wifiClient; MqttClient mqttClient(wifiClient); void setup() { pinMode(led, OUTPUT); digitalWrite(led, HIGH); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); } if (!mqttClient.connect(broker, brokerPort)) { while (1); }; mqttClient.beginMessage(topic); mqttClient.print("ESP32C3 waiting for message."); mqttClient.endMessage(); mqttClient.subscribe(subtopic); } void loop() { int messageSize = mqttClient.parseMessage(); if (messageSize) { while (mqttClient.available()) { char mesC = (char)mqttClient.read(); if ( mesC == '1') { digitalWrite(led, HIGH); } else if ( mesC == '0') { digitalWrite(led, LOW); } } } }
実機動作
ブラウザからNodeREDダッシュボード画面を開き、前回準備したタブ XiaoESP32を開くと以下のような画面が見えます。XiaoESP32C3を起動しWiFiに接続できた後、publishした「待ってるよ」メッセージがStatus欄に届きます。届いたらその下のLEDとかかれたスイッチを操作してみます。
ON(右側)に倒せばLEDが点灯し、OFF(左側)に倒せばLEDが消灯します。点滅し放題。あたりまえか。
一応、双方向通信OKってもんだね。