hiro yamamoto works

マイコンハード、ソフトを作ったりしています。
お家や現場のお困りごと解決に!
内容利用は自己責任でお願いします。

赤外線リモコンをWi-Fiで中継する(電池稼働のためにdeep-sleepを試す)

2024-07-14 17:20:50 | 赤外線リモコン

この投稿は書きかけです。
スケッチは参考程度に見てください。

ポイント
 赤外リモコン中継送信機の消費電力削減のために、
 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移行阻止

つづく



最新の画像もっと見る

コメントを投稿