前回、Seeed社XiaoシリーズのRISC-VコアESP32C3搭載機とNodeREDサーバ間で双方向のMQTTメッセージの通信ができるようになりました。今回は余勢をかって、ESP32C3側で測定したアナログ値をNodeREDに報告、0から100%のレベルゲージ形式でブラウザに表示してみたいと思います。
※「IoT何をいまさら」投稿順Indexはこちら
※XiaoESP32C3機のファームウエア開発には、バージョン2.0.2のArduino IDEを使わせていただいております。
XiaoESP32C3側アナログ測定の準備
実験に使用した回路は以下です。可変抵抗VR1(テスタで測ったら回し切ったところで9kΩと読めたもの)の電位をA1端子で読み取るだけの構成であります。テキトー。冒頭の写真右側が現物デス。
実験に使用したソース
伝統のArduino形式ソースであります。前回「ダッシュボードからLED点滅」に使ったソースのチョイ変です。ESP32C3の場合、analogRead()で12ビット値が読み取れますが、レベルゲージのレベル表示を上げ下げする程度なので、map()で0~100%の値に変換してからMQTTブローカに送ってます。
#include <WiFi.h> #include <ArduinoMqttClient.h> int led = D0; int analogPin = A1; int adval = 0; 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"; const char gaugeTPC[] = "XiaoESP32C3/GAUGE"; WiFiClient wifiClient; MqttClient mqttClient(wifiClient); void sendMessage(const char* topic, const char* mes) { mqttClient.beginMessage(topic); mqttClient.print(mes); mqttClient.endMessage(); } void reportAnalog() { char buf[4]; int adPer; int adval = analogRead(analogPin); adPer = map(adval, 0, 4095, 0, 100); Serial.println(adval); snprintf(buf, 4, "%d", adPer); sendMessage(gaugeTPC, buf); } void setup() { pinMode(led, OUTPUT); digitalWrite(led, HIGH); Serial.begin(9600); while (!Serial) { ; } WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); } if (!mqttClient.connect(broker, brokerPort)) { while (1); }; sendMessage(topic, "ESP32C3 waiting for message."); 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); } } } reportAnalog(); delay(500); }
NodeRED側の設定
ラズパイ3機で動作中のNodeREDサーバ側の設定です。まずはフロー。
MQTT inノードで XiaoESP32C3/GAUGE トピックをサブスクライブし、受領したデータをmsgにのせて Dashboardの gauge ノードに送る、単純明快なもの。
MQTT in ノードの設定が以下に。ラズパイ3上で動作中の Mosquitto MQTTブローカに接続し、トピック XiaoESP32C3/GAUGE をサブスクライブするものです。
Dashboardにレベルゲージを表示するための gauge ノードの設定が以下に。ダシュボードの [XiaoESP32] タブにある、Gaugeグループに接続。TypeはLevelと。Levelとすると液面レベルゲージ風の「ゲージ」が表示されます。パーセント表示なので、Units欄に[%]と書き入れたうえ、Rangeを0から100としてあります。
実機に書き込み、Go!
Arduino IDEでビルドし、実機Flashに書き込んだ後、パソコン上のブラウザに表示させているNodeREDのDashboard画面をみると以下のようです。
XiaoESP32C3に接続している可変抵抗をひねると、レベルゲージが上がり下がりします。いかにも波打っているようなアニメーション付きなのがちょっとカッコイイ。まあ表示できて当然か。