この投稿は書きかけです。
スケッチは参考程度に見てください。
SONY新型テレビのリモコンは、電源ボタンのみ赤外線で、
それ以外のボタンはデフォルトがbluetooth接続とのこと(赤外線にも設定可能)
ポイント
赤外線リモコンWi-Fi中継テレビ用
チャタリング類似現象の解決できたか?・・・できた
タイトルでは"Wi-Fiで"と表現していますが、正しくは"ESP-NOW"です。
だれでもイメージしやすいように"Wi-Fiで"と表現しています。
SONY製レコーダーのリモコンモード変更設定可能台数不足解決から
派生したプロジェクトです。
同室に複数設置されたSONY製テレビの赤外線リモコン操作で、
目的テレビ以外が反応してしまう問題解決に役立ちます。
テレビリモコンを中継してみて使いにくいことは
① 操作が遅れる
② 1回押しが2回押し(チャタリング的)になることがある
③ 準備OK・NG(中継可否)がわからない
①・・・赤外線受信してESP-NOW送信時に毎回再接続する。
起動時に接続して状態を維持する。・・・操作レスポンス向上
loop()の中に下記を見つけてsetup()の最後へ移動
ScanForSlave();
if (slave.channel == CHANNEL) { /* check if slave channel is defined*/
/* "slave" is defined. Add slave as peer if it has not been added already.*/
// "slave"が定義されている スレーブがまだ追加されていなければピアとして追加する。
bool isPaired = manageSlave();
if (isPaired) {
/* pair success or already paired Send data to device*/
// ペアリング成功またはペアリング済み デバイスにデータを送信
//sendData();//ここでは送らないのでコメントアウトしておく
} else {
Serial.println("Slave pair failed!");// スレーブペア失敗
delay(3000); // 追加
ESP.restart(); // 追加スレーブペア失敗 3秒後再起動
}
} else {
/*処理するスレーブが見つからない No slave found to process*/
delay(3000); // 追加
ESP.restart(); // 追加 スレーブが見つからない 3秒後再起動
}
②・・・リモコンからの赤外線が"リピート2"影響もあるのかな?
"チャタリング的"改善の"接続維持"により、操作レスポンスが
向上したのは良かったが、チャタリングは悪化
・・・赤外線受信回数をカウントして、送るタイミングを制御します。
ボタンを押し続けた時はカウント0回(初回)と10回以上の時だけWi-Fi送信します。
ボタンを離して300mS経過したらカウント値をリセットします。
カウント0回と10回以上の時"?理由は
テレビ付属リモコンをテレビに向けて"入力切換"押し続けてみるとわかります。//中略
uint8_t repeatCount = 0;
uint32_t LastSendMillis = 0;
//中略
loop(){
if (IrReceiver.decode()) { // Grab an IR code
if (IrReceiver.decodedIRData.protocol == SONY) {
//さっき送ったのと今送った時間差300mS以上のときにカウントをリセットする
uint32_t SendMillis = millis();
if (SendMillis - LastSendMillis >= 300) { //
repeatCount = 0;
}
strcpy(IRSendData.IR_protocol, "SONY");
IRSendData.IR_address = IrReceiver.decodedIRData.address;
IRSendData.IR_command = IrReceiver.decodedIRData.command;
IRSendData.IR_repeat = 2;//2で固定
IRSendData.IR_bit = IrReceiver.decodedIRData.numberOfBits;
LastSendMillis = SendMillis;
//リモコンボタン押し時間が長め(**mS超え)の時 1発目送って少し待って(**mS)2発目送る
//以降は少ない待ち時間で繰り返し
if (repeatCount == 0 || repeatCount >= 10) {
sendData();//ESP-NOW送信
}
repeatCount++;//どこに入れたら良いか暫定
} else if (IrReceiver.decodedIRData.protocol == UNKNOWN) {
Serial.println(F("Received noise or an unknown (or not yet enabled) protocol"));
}
IrReceiver.resume();
}
}//loop()
間違いがあるかもしれません。どんなことをやっているのか参考程度に見てください。
③・・・LED追加で表示(今後)
・・・ 中継できていない時は
赤外線送信器側(Wi-Fi受信側)準備完了まで、赤外線受信側(Wi-Fi送信側)が
待って接続を完了します。(再起動繰り返します)①のスケッチとダブります。void InitESPNow() {
WiFi.disconnect();
if (esp_now_init() == ESP_OK) {
Serial.println("ESPNow Init Success");
} else {
Serial.println("ESPNow Init Failed");
// Retry InitESPNow, add a counte and then restart?
// InitESPNow();
// or Simply Restart
ESP.restart();
}
}
もう少し伸びしろがあるのか?
つづく
※コメント投稿者のブログIDはブログ作成者のみに通知されます