XIAO ESP32C3
もともとはArduinoで作ることを考えていましたが、途中でXIAO ESP32C3の存在を知りました。2cm四方の小ささにUSB接続とWiFi、Bluetoothを持っており、Arduino IDEで開発できる優れものです。
D9に注意
XIAO ESP32C3を使うにあたって一番ハマったのが、D9ピンですね。ここにフォトリレーTLP222AFを繋いで起動しようとして起動できなくなりました。

ブレッドボードから外してESP32C3だけでUSB接続すると、問題なく起動できます。9ピンに関しては、Seeed K.Kの松岡さんがD6、D8、D9ピンについて割付の注意を出されていました。
Seeed Studio XIAO ESP32C3のI/O割り付けに注意
初心者には、D9は内部プルアップされているよ、BOOTボタンを押すとGNDに接続するよ、くらいしか読み取れませんでした。なので、フォトリレーを繋いだだけで起動に影響するとは思っていませんでした。少し検索を進めると、D9にLEDを繋ぐとLOW判定になる、というRcat999さんの情報を見つけました。
ESP32-C3 使ってみた
https://note.com/rcat999/n/nd5af859891fb
フォトリレーは内部にLEDが入っています。どうもそれがD9に接続されているのがよくなかったみたいです。D9には液面計の入力を繋ぐことにしたところ、問題なく起動できるようになりました。
WiFi接続/再接続
WiFi接続でよく見かけるスケッチは、こんなのですね。これで接続自体はいけていました。
#include <WiFi.h>
const char SSID[] = "*********";
const char PASSWORD[] = "**********";
void setup() {
Serial.begin(115200);
WiFi.begin(SSID, PASSWORD);
Serial.print("connecting to the AP: ");
Serial.println(SSID);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("connected.");
Serial.print("IP adress:");
Serial.println(WiFi.localIP());
}
void loop() {
}
つながる時は直ぐつながりますが、なかなかつながらずに、”・・・・・・”が数分間続くこともありました。これはなかなか使いづらい感じになっていたので、自動で再接続出来るように改造しました。
参考にしたのは、@nak435さんの記事、
ESP32 WiFiにつながらないとき #ESP32 – Qiita
です。ただ、原因はよくわかりませんが、こちらの環境では
WiFi.disconnect();
WiFi.reconnect();
これらがうまく機能せず、再接続できない状況になっていました。
一旦電源を落として再接続するとうまくいくことが多かったことから、disconnect/reconnectではなく、短いdeep sleepを入れることにしました。
deep sleepを入れると、次はスケッチの最初からスタートするので、再起動と同様な効果があると考えました。電源投入後の接続1回目が20秒経過で0.5秒のdeep sleepを入れて、スケッチの最初から再開、接続2回目に入る形です。接続1回目で失敗しても、大体2回目には接続出来ています。
#include <WiFi.h>
const char SSID[] = "*******";
const char PASSWORD[] = "*********";
void setup() {
Serial.begin(115200);
bool connecting = true;
WiFi.begin(SSID, PASSWORD);
while (connecting){
Serial.print("WiFi connecting to the AP: ");
Serial.println(SSID);
unsigned long connect_start = millis();
while (WiFi.status() != WL_CONNECTED && connect_start + 20000 > millis() ){
Serial.print(".");
delay(500);
}
if (WiFi.status() == WL_CONNECTED){
connecting = false;
delay(500);
} else {
Serial.println("retry");
delay(500);
esp_deep_sleep(500);
}
}
Serial.println("connected.");
Serial.print("IP adress:");
Serial.println(WiFi.localIP());
}
void loop() {
}
本当はWiFi.disconnect() / WiFi.reconnect()がちゃんと機能する方がいいんだろうけどなあ。ただ、何故かうまく機能しない場合は、deep sleepでもいいと思います。
Ambient
マイコンからデータを送るとグラフ等可視化できる形にしてくれるサーバーサービスです。正直これをなぜ8チャンネルまで無料で提供してくれるのか不思議に思うくらい、ありがたいサービスです。温度計等の計測値とブロア等の機器稼働状況を、スマホやPC等を通じて遠隔で見ることが出来ます。

左上が水温、真ん中上が液面検知、給水ポンプ稼働状況、給気ブロア稼働状況、右が気温、左下がTDS値、真ん中下が液面計(上、下)の指示値です。
使い方は簡単で、チュートリアルのAmbientの使い方、にある通りです。
Ambientの使い方
https://ambidata.io/docs/gettingstarted/
ざっと流れを書くと、まず、下のgithubに置かれているESP32用のライブラリをインストールし、ambient.hをインクルードします。
Ambient ESP8266/ESP32用ライブラリ
https://github.com/AmbientDataInc/Ambient_ESP8266_lib.git
ambientのアカウントを作り、チャンネルを作成するとチャンネルIDとライトキーが付与されるので、変数定義のところに記載します。setup()かloop()にAmbientに送りたいデータを指定し、Ambientへ送信する命令を記載します。Ambientで受け取ることの出来るデータは最短で5秒間隔ですので、それ以下の間隔で送っても5秒単位で表示されます。
スケッチは例えばこんな感じ。TDS値をambientの5番に送る場合は、ambient.set(5, TDS);として、その後ambient.send();ですね。ごちゃごちゃするのでTDS値を計算する部分は省略してあります。
#include <Ambient.h>
unsigned int channelId = *****;
const char* writeKey = "*******************";
#include <WiFi.h>
const char SSID[] = "*********";
const char PASSWORD[] = "**********";
WiFiClient client;
Ambient ambient;
void setup() {
WiFi.begin(SSID, PASSWORD);
ambient.begin(channelId, writeKey, &client);
}
void loop() {
ambient.set(5, TDS);
ambient.send();
delay(1000);
}
長くなるので、とりあえずここまで。次は測定装置についてかな。









コメントを残す