この投稿は書きかけです。
スケッチは参考程度に見てください。
ポイント
赤外リモコン中継送信機の消費電力削減のために、
ESP32のDeep-sleep Modeを組み込みテストします。
無操作時は"deep-sleep"へ移行し、プッシュスイッチでwakeupします。
タイトルでは"Wi-Fiで"と表現していますが、正しくは"ESP-NOW"です。
だれでもイメージしやすいように"Wi-Fiで"と表現しています。
SONY製レコーダーのリモコンモード変更設定可能台数不足解決から
派生したプロジェクトです。
同室に複数設置されたSONY製テレビの赤外線リモコン操作で、
目的テレビ以外が反応してしまう問題解決に役立ちます。
Tip
SONY新型テレビは、赤外線は電源ボタンのみで、以外はbluetooth接続に
なっているとの情報です。テレビ側の設定でbluetoothをOFFにすると赤外線に
なりますが"googleアシスタント"が使えなくなるらしいです。
ちなみにbluetooth接続は、キッチンだと電子レンジの影響が出る可能性があります。
XIAO ESP32C3を使用しました。
Wakeupスイッチ・・・D1(GPIO3)とGND間にプッシュスイッチを接続
状態表示LED・・・D2(GPIO4)と3.3V間に抵抗とLEDを直列接続(抵抗は仮に1K点灯がわかれば良い)
IR_RECEIVE_PIN ・・・D8(GPIO8)
"IRremote"ライブラリの一部を合体し"デコード結果の
"リザルト ショート"をシリアルモニタへ表示
ざっくり説明
Seeed Studio wiki のXIAO ESP32C3 Getting Started に
紹介されているスケッチをベースにしています。
赤外線受信がなくcurrentMillis から previousMillisを引いた値が
小さくなったときカウンタを加算、大きくなった時カウンタをクリア
カウント値が連続50回(仮)を超えたときに"esp_deep_sleep_start()"
D1プッシュスイッチでWeakup
参考スケッチ//オリジナル部分を省略して主に追加した部分を記述
#define IR_RECEIVE_PIN 8
uint32_t repeatCount = 0;
uint32_t previousMillis = 0;
#include <IRremote.hpp>//"<"と">"は半角に直す
//中略
//以降はsetup()の中へ追加
/*参考 esp_err_t esp_deep_sleep_enable_gpio_wakeup(uint64_t gpio_pin_mask,
esp_deepsleep_gpio_wake_up_mode_t mode)*/
//次行参考にwakeup部(オリジナルのまま)
esp_deep_sleep_enable_gpio_wakeup(BIT(D1), ESP_GPIO_WAKEUP_GPIO_LOW);
//mode -- Select logic function used to determine wakeup condition:
//ESP_GPIO_WAKEUP_GPIO_LOW: wake up when the gpio turn to low.
//ESP_GPIO_WAKEUP_GPIO_HIGH: wake up when the gpio turn to high.
/*ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORSはデフォルトで有効
プルアップ、プルダウン抵抗の指定不要。外部プルアップ、プルダウンするときは、
ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS オプションを無効にと書いてあった
オプションの設定方法は見つけられなかった*/<
//中略
pinMode(D2, OUTPUT); // D2(GPIO4)status check LED
//pinMode(D3, INPUT_PULLUP);//test
//D2 LED deep-sleepで消灯 3.3V to ANODE ,D2 to CATHODE
digitalWrite(D2, LOW);
IrReceiver.begin(IR_RECEIVE_PIN);
//setup()部分はここまで
//以降loop()中に追加
//中略
if (IrReceiver.decode()) { //赤外線
Serial.println(); // blank line between entries
Serial.println(); // 2 blank lines between entries
IrReceiver.printIRResultShort(&Serial);
IrReceiver.resume();
} else {
//時間差**mS以下のとき
uint32_t currentMillis = millis();
//操作されない時current - previousの値は小さくなる
//設定された時間(**mS)より小さい回数が連続し、指定した回数を超えた時
if (currentMillis - previousMillis >= 300) {//仮に**mS=300
//**mS以上のときカウントをクリア
repeatCount = 0;
Serial.println("repeatCount clear");
} else {
//**mS以上でない時(未満のとき)
repeatCount++;
Serial.print("repeatCount = "); Serial.println(repeatCount);
}
previousMillis = currentMillis;
//**mS未満のカウントが**カウント以上ならsleep
if (repeatCount >= 50) {//仮に**カウント=50 参 MAX uint32_t 4294967295
//Go to sleep now
Serial.println("Going to sleep now");
esp_deep_sleep_start();
}
}
delay(100);
}//loop()
deep-sleepへ移行
deep-sleep移行阻止
つづく
※コメント投稿者のブログIDはブログ作成者のみに通知されます