
前回、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に接続している可変抵抗をひねると、レベルゲージが上がり下がりします。いかにも波打っているようなアニメーション付きなのがちょっとカッコイイ。まあ表示できて当然か。

