最近ESP-NOWを使って独自のスマートホーム環境を検討しているのですが、やはり屋内照明には
従来からあるスイッチがあった方が家族の批判をかわすのには良い策だと思っています。
なので自作照明にはヒモでON/OFFするキャノピスイッチを付けているのですが、その仕組みでは
クリアできない「壁面(タンブラスイッチ)が普通だろ?」的な場所のクリアが課題でした。
今まで壁スイッチを検討してきたのですが、イロイロと難敵がいました。
スマートホーム照明の壁スイッチでの難敵
1:照明から壁までの距離が長くDIYケーブル配線は見た目が汚い
対処:照明と壁スイッチを無線で対処する。
2:壁スイッチの無線化には電源が必要
対処:電池駆動での運用を検討、電池寿命及び電波混信対策としてESP8266機を使う
通信手段はESP-NOWで電池寿命延長にはDeepSleepで対処します。
3:壁スイッチは「Panasonic WN5001010」風でないと一般人に受け入れられない(今回UPDATE!!)
対処:ESP8266をESP32に変更して、GPIOの状態変化でDeepSleepから復帰する
とまぁ、こんな感じでボチボチ進んできた所です。
#ESP32環境で必要なリソース
ESP32(DeepSleep時に無駄な電力消費しない周辺機器の付いてない奴)
スイッチ2ケ(壁面スイッチをそのまま使う予定)
プルダウン抵抗2ケ(ON時に電力消費するので不具合の出ない限りは高い方が良い)
3.3V電源
#配線
pin32/pin33とGNDの間に抵抗を繋ぐ(プルダウン抵抗)
pin32/pin33と3.3Vの間にスイッチを繋ぐ
参考>>https://plaza.rakuten.co.jp/foxbat/diary/202209010000/
#機能
今回「Panasonic WN5001010」をスイッチを2個ON/OFFする事を想定しています。
pin32/pin33のスイッチを切り換える度にDeepSleepからWakeupします
あと1000秒毎にDeepSleepからWakeupします
DeepSleepに移行する前に1000秒後とpin32/pin33状態に沿ったWakeup条件を設定します。
※2スイッチ同時の切り替えをしても検知できません。
void setup(){
pinMode( 32, INPUT );
pinMode( 33, INPUT );
Serial.begin(115200);
// 起動要因に合わせて動作する
esp_sleep_wakeup_cause_t wakeup_reason = esp_sleep_get_wakeup_cause();
switch( wakeup_reason ){
case ESP_SLEEP_WAKEUP_EXT0: // スイッチ切換えでWakeupした
Serial.printf( "GPIO32:%s\n", (digitalRead(32)==LOW?"LOW":"HIGH") );
break;
case ESP_SLEEP_WAKEUP_EXT1: // スイッチ切換えでWakeupした
Serial.printf( "GPIO33:%s\n", (digitalRead(33)==LOW?"LOW":"HIGH") );
break;
case ESP_SLEEP_WAKEUP_TIMER: // TIMER TIMEUP
Serial.printf( "timer wakeup\n" );
break;
default:
Serial.printf( "power on\n" );
break;
}
// 現状のスイッチHIGH/LOWが切り替わるとDeepSleepから復帰する
esp_sleep_enable_ext0_wakeup( (gpio_num_t)32, (digitalRead(32)==LOW?1:0) ); // GPIO32 / 1:Low ⇒ High 2:High ⇒ Low
if( digitalRead(33)==LOW )
esp_sleep_enable_ext1_wakeup( 0x200000000, ESP_EXT1_WAKEUP_ANY_HIGH ); // GPIO33 / Low ⇒ High
else esp_sleep_enable_ext1_wakeup( 0x200000000, ESP_EXT1_WAKEUP_ALL_LOW ); // GPIO33 / High ⇒ Low (ALL_LOWだけど・・
// 今後の機能の為にTIMER WAKEUPは検討しておく
esp_sleep_enable_timer_wakeup( 1000 * 1000000 ); // 1000秒毎に一応起動する
// DeepSleepを開始する
esp_deep_sleep_start();
}
void loop(){
}
あとがき
一応スイッチの切り換え時にESP32がWakeupする様になりました。ESP-NOWメッセージを
投げてまたDeepSleepへ移行すれば一応の壁スイッチ完成になります。その後はESP32への
電源回路をどうするかの検証を始める予定です。動くのなら18650電池直結で終わらせたい)
あと、3スイッチ化できないか検討したのですが、上手い方法が見つかりません・・・