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

Joseph Halfmoon

前回Seeed社XiaoシリーズのRISC-VコアESP32C3搭載機とNodeREDサーバ間で双方向のMQTTメッセージの通信ができるようになりました。今回は余勢をかって、ESP32C3側で測定したアナログ値をNodeREDに報告、0から100%のレベルゲージ形式でブラウザに表示してみたいと思います。

※「IoT何をいまさら」投稿順Indexはこちら

※XiaoESP32C3機のファームウエア開発には、バージョン2.0.2のArduino IDEを使わせていただいております。

XiaoESP32C3側アナログ測定の準備

実験に使用した回路は以下です。可変抵抗VR1(テスタで測ったら回し切ったところで9kΩと読めたもの)の電位をA1端子で読み取るだけの構成であります。テキトー。冒頭の写真右側が現物デス。XiaoESP32LevelGaugeSchematic

実験に使用したソース

伝統の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 ノードに送る、単純明快なもの。NodeRedFlow

MQTT in ノードの設定が以下に。ラズパイ3上で動作中の Mosquitto MQTTブローカに接続し、トピック XiaoESP32C3/GAUGE をサブスクライブするものです。MQTTinSetting

Dashboardにレベルゲージを表示するための gauge ノードの設定が以下に。ダシュボードの [XiaoESP32] タブにある、Gaugeグループに接続。TypeはLevelと。Levelとすると液面レベルゲージ風の「ゲージ」が表示されます。パーセント表示なので、Units欄に[%]と書き入れたうえ、Rangeを0から100としてあります。LevelGaugeSetting

実機に書き込み、Go!

Arduino IDEでビルドし、実機Flashに書き込んだ後、パソコン上のブラウザに表示させているNodeREDのDashboard画面をみると以下のようです。

XiaoESP32LevelGauge

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

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

IoT何をいまさら(111) Xiao ESP32C3、JSONオブジェクトをパブリッシュ へ進む