hiro yamamoto works

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

赤外線リモコンWi-Fi中継の応用 Webページからテレビを操作(設定ファイル読み2次元配列入れて)

2024-04-03 16:00:50 | 赤外線リモコン

スケッチ改変ポイントなどを説明してみようかと思いました。
間違い、文字化け、抜けがあるかもしれません。

素晴らしいライブラリ、サンプルスケッチを公開してくださっている方々に感謝します。

赤外線送信したいコントロール内容を、簡単テキストファイルでSDに保存しておきます。
"コントロール実行(赤外線送信)せよ"と命令来たら、読み込んで赤外線リモコン信号送信します。
#include "FS.h"
#include "SD.h"
#include "SPI.h"
中略
uint16_t IRco[20][5];
uint8_t NOIRCO = 0;//Number of IR control operations
中略
  if (!SD.begin(44)) { //XIAO ESP32S3 GPIO44/D7
    Serial.println("Card Mount Failed");
    return;
  }
void readFile(fs::FS &fs, const char * path) {
  Serial.printf("Reading file: %s\n", path);
  File file = fs.open(path);
  if (!file) {
    Serial.println("Failed to open file for reading");
    return;
  }
//2次元配列の型とサイズ uint16_t IRco[20][5];//[行][列] 横書きフォーマット
  Serial.print("Read from file: ");
  while (file.available()) {
    //Serial.write(file.read());
    String line = file.readStringUntil('\n');//終端文字'\n'が検出されるまで読んで文字列全体をlineへ入れる
    line = line.substring(0, line.indexOf('#'));//インデックス0(行頭)から(#までのインデックス数)の文字列取得
    //uint8_t NOIRCO = 0;//設定ファイルでは省略してNCOとしました。コントロールの数 Number of IR control operations
    if (line.substring(0, 3) == "NCO") { //開始位置(0)は含むが終了位置(3)は含まれない
      String NCO = line.substring(4, 6);//String変数名も設定ファイルと同じNCOとしました。
      NCO.trim();//スペース等を除去
      NOIRCO = NCO.toInt();
      Serial.println("NOIRCO = ");
      Serial.println(NOIRCO);
    } else if (line.substring(0, 3) == "C00") { //開始位置(0)は含むが終了位置(3)は含まれない
      String command0_0 = line.substring(4, 8); //address
      command0_0.trim();//スペース等を除去
      IRco[0][0] = strtol(command0_0.c_str(), NULL, 16);//address uint16_t
      String command0_1 = line.substring(9, 11);//command uint8_t
      IRco[0][1] = strtol(command0_1.c_str(), NULL, 16);//.toInt();
      //repeatは2固定のようなので省略しようと思う
      String command0_2 = line.substring(12, 14);//Bit
      IRco[0][2] = command0_2.toInt();
      String command0_3 = line.substring(15, 20);//interval
      command0_3.trim();//スペース等を除去
      IRco[0][3] = command0_3.toInt();
    } else if (line.substring(0, 3) == "C01") {
中略
    } else if (line.substring(0, 3) == "C09") {
      String command9_0 = line.substring(4, 8); //address
      command9_0.trim();//スペース等を除去
      IRco[9][0] = strtol(command9_0.c_str(), NULL, 16);//address uint16_t
      String command9_1 = line.substring(9, 11);//command uint8_t
      IRco[9][1] = strtol(command9_1.c_str(), NULL, 16);//.toInt();
      String command9_2 = line.substring(12, 14);//Bit
      IRco[9][2] = command9_2.toInt();
      String command9_3 = line.substring(15, 20);//interval
      command9_3.trim();//スペース等を除去
      IRco[9][3] = command9_3.toInt();
    }
  }
  file.close();
中略
void loop() {
中略
//"SimpleWiFiServer"スケッチへの改変部分です
        //クライアントのリクエストが "GET /H "か "GET /L "かをチェックする:Check to see if the client request was "GET /H" or "GET /L":
        if (currentLine.endsWith("GET /H")) {
          //digitalWrite(5, HIGH); // GET /H turns the LED off
          /*ユーザー様の環境に合わせてカスタマイズできるように、
            SDメモリに赤外線コード、インターバル時間、送信順序を記述したファイルで設定する*/
          //sendSony()関数へ与える引数の型は次の通りです。
          //sendSony(uint16_t aAddress, uint8_t aCommand, int_fast8_t aNumberOfRepeats,
          // uint8_t numberOfBits)
          /*備忘記 2次元配列 IRco[0][0] //uint8_t NOIRCO = ;*/
          CheckTVpower();//GPIO13がLOWの時TVがONしていると検出し"TV_Pon"を"1"にする
          //TV電源ONから開始するときはi=0、すでにONしている時はi=1とすれば良いのでは
          //TV電源ONのときTV_Ponは"1"
          for (uint8_t i = TV_Pon; i < NOIRCO; i++) { //Number of IR control operations
            //for (uint8_t i = 0; i < NOIRCO; i++) { //Number of IR control operations
            IrSender.sendSony(IRco[i][0], (uint8_t)IRco[i][1] , 2, IRco[i][2]); //POWER ON-OFF
            //POWER ONから次の操作を受け付けるまでの待ち時間
            delay(IRco[i][3]);
          }


関数 bool CheckTvpower()
//Check the TV power 電源がONしている時はONのコントロールを省略する7
bool CheckTVpower() {
  TV_Pon = !(digitalRead(TV_PowDet_PIN));//TVonのときLOW("0")なので反転して使う
  //uint8_t TV_Pon = 0;//"1"でTV電源がONしている
  //Serial.print("Check TV power = ");
  if (TV_Pon) {
    //Serial.println("ON");
    return 1;
  } else {
    //Serial.println("OFF");
    return 0;
  }
}


素人の書いたコードですが、少しでも参考になればと思います。
終わりかな



最新の画像もっと見る

コメントを投稿