あっきぃ日誌

ラズピッピブログのようなオタクブログのようななにか

いまさらだけど壁スイッチをIoT(笑)したい(Seeed XIAO ESP32C3編)

昨日の続き。ただし、Seeed XIAO ESP32C3を使うためRaspberry Pi Advent Calendarではないです。

Seeed XIAOは、Seeed Studioが展開する親指サイズ系開発ボードです。今回触れるESP32C3のほかにBLE版とか、RP2040搭載版とか、いろいろなモデルが展開されています。価格も1,000円前後で、けっこう手頃です。

ESP32C3はスイッチサイエンスだと1,034円ですね。

Seeed Studio XIAO ESP32C3www.switch-science.com

昨日書いたPico Wireless環境は、アレでもまあ良いんですが、やはりかさばったり消費電力が気になったりするので、どうせならESP32単体に置き換えたいところです。で、手持ちに多少ESP32があるのでほじくり返してみますが、あ、う〜ん……。

USBシリアル変換のまともなやつがなくて、どっちもまともに動かせないので、こないだアキバでなんとなく買ってみたSeeed XIAO ESP32C3を使うことにします。これならUSBシリアルなしでも使えるので手軽。

ESP32として使えつつ、小さくて、アンテナが外付けタイプで、無線とBLE両方に対応みたいです。ARMではなくRISC-Vベースなのもポイントでしょうか。そんな感じのやつです。Micro/CircuitどっちのPythonも動いたり、Arduinoで動かしてもヨシみたいです。ただ、CircuitPythonはUSBストレージ的な見え方はしないので、その点は注意がいりそうですが、Thonnyとかを使っていれば問題はないでしょう。

WebサーバーをやりつつAPI的に受けてサーボを動かすやつが作れれば何でも良いですが、いい感じのサンプルが揃っていたArduinoで今回はやっていくことにしました。サーボ部分を足して、なんかついでにチップ温度が取れたのでそれもAPIにしてこうじゃ。

#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESP32Servo.h>

const char* ssid = "";
const char* password = "";

WebServer server(80);
Servo servo1;

void handleRoot() {
  server.send(200, "text/plain", "entrance room light\nusage: GET /off\nGET /temp");
}
void handleOff() {
  servo1.write(50);
  delay(500);
  servo1.write(90);
  server.send(200, "text/plain", "ok");
}
void handleTemp() {
  float temp = temperatureRead();
  char msg[10];
  sprintf(msg, "%f", temp);
  server.send(200, "text/plain", msg);
}

void handleNotFound() {
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}

void setup(void) {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  server.on("/", handleRoot);
  server.on("/off", handleOff);
  server.on("/temp", handleTemp);
  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");

  servo1.setPeriodHertz(50);
  servo1.attach(D0);
  servo1.write(90);
}

void loop(void) {
  server.handleClient();
  delay(2);
}

あとはピンヘッダーをはんだ付けして、諸々配線とか貼り付けとかをして、完成(雑)。ピンヘッダーの向きが逆なんですけど、基板が片面実装でつるつるのメンからピンが生えたらなんかもったいないなあと思いまして。この向きでもちょっとピンがでるけど、それでも壁とかに貼りやすいですし。

動作はPico Wirelessのときと同様なので動画は略。消費電力は基本的に0.02Aくらい、Wi-Fiアクセスがあると0.08Aくらいに跳ねる瞬間があるようです。PicoWとほぼ同じっぽくて良さそうですね。

www.raspi.jp

あとは呼び出ししやすいようにMac/iOSのショートカットでGETするだけのショートカットを作成して終わりです。1つ作ればデバイス間で共有されるので、MacからでもApple WatchからでもiPhoneからでも手軽に電気が切れますね。


まとめ

PicoWが待てないのでSeeed XIAO ESP32C3で実装する話でした。小さくて色々遊べそうなので、PicoWはPicoWとして、XIAO ESP32C3ももう一個くらい買ってみても良いかも。

小さいボードと言えば、我らがPimoroniのTiny2040がありますが、XIAO RP2040のほうが片面実装でスッキリしていて国内でも若干XIAOのほうが安いので、覇権の香りがしてます。ぐぬぬ。。