スケッチ改変ポイントなどを説明してみようかと思いました。
間違い、文字化け、抜けがあるかもしれません。
素晴らしいライブラリ、サンプルスケッチを公開してくださっている方々に感謝します。
赤外線送信したいコントロール内容を、簡単テキストファイルで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;
}
}
素人の書いたコードですが、少しでも参考になればと思います。
終わりかな
最新の画像[もっと見る]
- 年末はなにかとやること多い(景色に癒やされる) 2週間前
- 年末はなにかとやること多い(もちつきは機械任せ…ありがたや) 2週間前
- Arduino UNO MINIMAでCAN通信(ESP32 > twaireceive.inoで受信できたが) 2ヶ月前
- Arduino UNO MINIMAでCAN通信(ESP32 > twaireceive.inoで受信できたが) 2ヶ月前
- クロスオーバーネットワークXEC−700(SONY) 3ヶ月前
- 夕景 3ヶ月前
- 夕景 3ヶ月前
- Arduino UNO MINIMAでCAN通信(写真と・・・) 3ヶ月前
- Arduino UNO MINIMAでCAN通信(写真と・・・) 3ヶ月前
- Arduino UNO R4 MINIMAを使ってみる(bookworm RasPiOSで書き込みできない) 3ヶ月前
※コメント投稿者のブログIDはブログ作成者のみに通知されます