Arduinoで遊んでいるとゲーミングPCの照明などで使われているフルカラーLEDが制御可能だってことがわかりまして庭にイルミネーションしてみようじゃないかということになりました。300個と150個のLEDテープ2本用意して電源も5V10A出せるものを用意しました。
当初はArduino nanoで作っていたのですがRAMが2Kバイトしかないってのがきつくなってきました。LED表示にひとつあたり3バイト使用しますんで450個で1.5Kバイト近く使う計算となりギリすぎるということでESP32を使用することとしました(こちらはArduinoIDEからで320K使えます)。
ESP32を使うとなればWiFiが使えるので遊びついでに機能を加えることとしました。
- 点灯時間を制御するためにタイムサーバーにアクセスして内部時間を設定する。
- ESP32でWebサーバーを立てて点灯時間以外でも強制的にON/OFFできるようにする。
- WebサーバーにアクセスするためにはIPアドレスが必要なのだけどWiFiアクセスポイントはDHCPなので取得したIPアドレスを報告する
- 屋外設置なのでプログラム書き換えをWiFi経由で行う
1.時刻設定
イルミネーションは基本、夜に点灯ですので当初はフォトレジスタを繋いで暗くなったら点灯と考えていたのですがWiFi接続できるんであればntpサーバーにアクセスして簡単に正確な時間を得られるので17時~21時点灯などとすることにしました。
configTime(9 * 3600L, 0, "ntp.nict.jp", "pool.ntp.org");
でESP32の時計が設定できて(9*3600は世界標準時との時差)
tm tmBuff;
getLocalTime(&tmBuff);
で設定した時刻を取得できます。
2.Webサーバー
ESP32のコアに含まれているのでライブラリー追加は必要ありません。
#include <WebServer.h>
WebServer webSvr(80);
インスタンスを作成して、setupでアクセスされたときのハンドル関数を設定して開始します。
webSvr.on("/", handleRoot); // rootへのアクセス
webSvr.on("/button", handleButton); // buttonへのアクセス
webSvr.begin(); // WEBサーバー開始
Loop内でWebサーバーにアクセスされたかチェックして当該処理を呼び出すメンバー毎回呼びます。
webSvr.handleClient();
ハンドル関数はクライアントで表示したいhtmlを編集して送り返せば良いです
webSvr.send(200, "text/html", str);
DHCPで運用していても、それほどIPアドレスが変わるわけでは無いのでシリアル出力で良いのですがLINEへの通知が簡単にできるのでそれでやってみました(Line Notifyという機能です)。
LINE上での設定はいろいろあって、それは端折りますが最終的にはトークンが得られます。
ESP32用のライブラリーがあるので検索して追加してください。
#include <ESP_Line_Notify.h>
を行って
LineNotifyClient line;
line.token = "取得したトークン文字列";
line.message = "ESP32起動 " + WiFi.localIP().toString();
LineNotify.send(line);
などとすればLINEに通知が届きます。画像なども送れるようなので今後カメラ付きのESP32でも買って遊ぼうかと思っています。
4.WiFIでのプログラム更新
ESP32のコアにArduinoOTAという名前で含まれています。
#include <ArduinoOTA.h>
を行いsetup内で
ArduinoOTA.begin();
を行いLoopで
ArduinoOTA.handle();
を行えばArduinoIDEでシリアルポートと並んでIPアドレスが表示されますので、それでWiFi経由の書き込みが可能です(色々設定はできるみたいですが全部端折りました)。ArduinoOTAインスタンスはインクルード内で定義されているのでソース内で定義する必要はありません。
書き込み時パスワードを聞かれますがadminです。
当方の環境では書き込みは正常に完了するのですがIDEでの書き込み表示が終了せずIDEの再起動が必要な状態となっています。(IDEのバージョンは2.0.2です)
ソースはもうちょっと整理して次の記事にしようと思います。