IoT何をいまさら(109) Xiao ESP32C3をNodeREDからMQTTでLチカ

Joseph Halfmoon

前回は、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点灯消灯指令のフローが下です。超簡単?

NodeRED_ESP32C3MQTTflow

さて上記の左下の「LED ON/OFF」と表示されているNodeREDダッシュボードの switchノード(NodeREDのフロー制御のswitchノードとは違います)の設定が以下に。

ポイントは、スイッチONで文字「1」をOFFで「0」を送出することです。1バイトの半角文字が送られるっと。

NodeRED_LED_switchSetting

上記のswitchノードから流れてきた msg を MQTTブローカ(mosquitto_Pi3というお名前)に伝えるのが以下の mqtt out ノードのお役目です。その際 publishする先のトピック名は XiaoESP32C3/LEDです。

NodeRED_MQTToutSetting

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とかかれたスイッチを操作してみます。NodeREDdashboardLEDswitchON

ON(右側)に倒せばLEDが点灯し、OFF(左側)に倒せばLEDが消灯します。点滅し放題。あたりまえか。

ESP32C3MQTT_LED_ON

一応、双方向通信OKってもんだね。

IoT何をいまさら(108) Xiao ESP32C3からNode-REDへMQTT へ戻る

IoT何をいまさら(110) Xiao ESP32C3、アナログ測定値でレベルゲージ表示 へ進む