ESP32を使って学習リモコンを作る(8) ソフトウエア 本機プロジェクトの勘所

はじめに

前回 ESP32を使って学習リモコンを作る(71) ソフトウェア 本機のプロジェクト で説明したプロジェクトの勘所を説明します。

ソフトウェアの要素技術

ソフトウェアの要素技術についてはこれまでに説明してきた内容を参照ください。
ESP32を使って学習リモコンを作る(3) ソフトウェア 赤外線リモコン受信( irReceive )
ESP32を使って学習リモコンを作る(4) ソフトウェア 赤外線リモコン送信( irSend )
ESP32を使って学習リモコンを作る(5) ソフトウェア webserver
ESP32を使って学習リモコンを作る(6) ソフトウェア Flash 読書き(SPIFFS)

本項ではクライアント(Webブラウザ)とサーバー(ESP32 main.cpp)間の相互関係や関数とのデータ受け渡しおよび関数の有効、無効の制御方法を中心に説明をして Smart Remote Controller 全体のシステム動作の理解に役立てればと思います。

グローバル変数(データ)

データの受け渡しに使用するグローバル変数を表1 にまとめました。
グローバル変数にしなくてもデータの受け渡しはできると思いますが、あえてグローバル変数として受け渡しに使用することを意識するようにしました。

表1 グローバル変数(データ)

変数名 型 説明
status_information String main.cpp で発生した制御状態の変化を任意の文字列で表現してこの変数に代入することで、クライアント側に文字列情報が伝達されてブラウザ画面に表示されます。
wrfolder String SPIFFS を使用して Flash に書込む際のフォルダ名として書込み、読出しで使用します。
wrfile String SPIFFS を使用して Flash に書込む際のファイル名として書込み、読出しで使用します。
writeStr String 取込んだ赤外線リモコン信号(HEX)を文字列として格納します。receive_IR_process()を実行すると戻り値 writeStr を返します。
信号登録が許可されると store_Flash() は writeStr を引数として Flash に書込みます。
readStr String restore_IR_proicess() を実行すると赤外線リモコン信号が読出されて戻り値 readStr を返します。
send_IR_process() は readStr を引数として赤外線リモコン信号を送信します。
num_reg int リモコン送信ボタンに登録する赤外線リモコン信号の登録数カウンタです。
bt_id String 赤外線リモコン信号を複数登録中にリモコン送信ボタンが変更されたかを識別するために使用します。

グローバル変数(フラグ)

制御のためにフラグとして使用する bool 型グローバル変数を表2 にまとめました。

表2 グローバル変数(フラグ)

変数名 型 説明
ena_send bool 赤外線リモコン信号送信関数 send_IR_process(); の有効/無効フラグとして使用します。
ena_store bool Flash への書込み関数 store_Flash(); の有効/無効フラグとして使用します。
ena_restore bool Flash からの読出し関数 restore_Flash(); の有効/無効フラグとして使用します。
ena_assign bool 信号登録の有効/無効フラグとして使用します。

主要関数とグローバル変数(フラグ)の関係

主要関数とグローバル変数(フラグ)の関係を表3 にまとめました。
この表から主要関数の有効/無効の条件および引数/戻り値を一覧できます。

表3 主要関数とグローバル変数(フラグ)の関係

機能 関数名 有効条件
(値)
無効条件
(値)
引数
(型)
引数
(型)
戻り値
(型)
赤外線
信号受信
receive_IR_process() 33PIN
(HIGH)
33PIN
(LOW)
writeStr
(String)
赤外線
信号送信
send_IR_process() ena_send
(true)
ena_send
(false)
readStr
(String)
Flash
書込み
store_Flash() ena_store
(true)
ena_store
(false)*
wrfile
(String)
writestr
(String)
Flash
読出し
restore_Flash ena_restore
(true)
ena_restore
(false)
wrfile
(String)
readStr
(String)

* ena_store のみ store_Flash 関数から抜ける時に false に設定されます。

ブラウザ画面に表示されるボタン

ボタンの動作を説明することでクライアント(Webブラウザ)とサーバー(ESP32 main.cpp)間の相互関係が明らかになります。ここでは Web ブラウザに表示されるボタンの定義を再掲します。(図1)

図1 Web ブラウザのボタン定義

モード切換ボタン(Smart Remote Controller)

ブラウザ画面下寄りの Smart Remote Controller の文字がモード切換ボタンで、モード切換が有効な場合は赤色、無効の場合は青色で表示されています。(図1 ③)

index.html

59 <!– モード切換ボタンの定義( ボタンの輪郭は消しているので文字だけに見える)–>
60 <divclass=“bt_mode”>
61 <inputtype=“checkbox”id=“bt_mode”name=“bt_mode”onclick=“bt_modeClick();”>
62 <labelid=“bt_mode_label”for=“bt_mode”>Smart Remote Controller</label>
63 </div>
59~63 モード切換ボタンを定義しています。
    checkbox 属性を使用して id と name 両方に bt_mode を設定しています。

js.js

171 function bt_modeClick(){
172 var xhr = new XMLHttpRequest();
173 xhr.open(“GET”, “/mode”, true);
174 xhr.send(null);
175 }

171~175 モード切換ボタン bt_mode を押した時サーバーへメソッド GET、 URL /mode のリクエストを送信します。

main.cpp

231 server.on(“/mode”, HTTP_GET, [](AsyncWebServerRequest *request){
232 Serial.println(“モード切換ボタンが押されました。”); //ターミナルにメッセージ出力
233 status_information = “モード切換ボタンが押されました。”; //クライアント側で情報を表示する
234 request->send_P(200, “text/plain”, getMsg_information().c_str());
235 });

231~235 URL /mode によりモード切換ボタン bt_mode からの GET リクエストと認識されて処理が行われます。
232    ターミナルにメッセージを出力します。
233~234 内部変数 status_information にメッセージを設定してクライアント側に text/plane として送信してブラウザ画面に表示します。

js.js

上記処理とは別にモード切換ボタンにイベントリスナを付加してボタンの状態が true か false かによって異なる動作を定義しています。

16 control_bt_mode_status();

16 モード切換ボタンの動作を定義した関数 control_bt_mode_status(); を呼び出します。

19 setInterval(getCurTime, 500);
19 関数呼び出しは 500ms 周期で実行されます。
262 function control_bt_mode_status(){
263 const ev_SRC = document.getElementById(‘bt_mode’);
264 ev_SRC.addEventListener(‘click’,
265 function(event){
266 enable_all_of_TX_keys();
267 const btSRC = document.getElementById(‘bt_mode’);
268 if ( btSRC.checked ){ /** bt_mode が true の場合制御ボタンを有効にして画面上で見えるようにする */
.
.
278 } else { /** bt_mode が false の場合制御ボタンを無効にして画面上で見えなくする */
.
.
288 }
289 }
290 );
291 }

262~291 モード切換ボタンの動作を関数 function control_bt_mode_status(){} で定義します。

263 const ev_SRC = document.getElementById(‘bt_mode’);
264 ev_SRC.addEventListener(‘click’,
265 function(event){

263~264 モード切換ボタン bt_mode にイベントリスナを付加します。
265    クリックされたら関数 function(event){} を実行します。

252 function enable_all_of_TX_keys(){
253 /* 16個の「リモコン送信ボタン」bt_1 から bt_16 を有効にする */
254 for (let i = 1; i < 17; i++){
255 buf_btc2 = “bt_” + i ;
256 enable_button(buf_btc2);
257 }
258 }

252~258 bt_1 から bt_16 のリモコン送信ボタン 16個全てを有効にします。

243 async function enable_button(button_id){
244 try{
245 document.getElementById(button_id).removeAttribute(“disabled”);
246 } catch (err){
247 console.error(err);
248 }
249 }

243~249 button_id で指定したボタンの Atribute “disabled” を削除して有効にします。

267 const btSRC = document.getElementById(‘bt_mode’);

267    モード切換ボタン bt_mode をインスタンス化します。

bt_mode が true の場合(制御ボタン有効)

268 if ( btSRC.checked ){ /** bt_mode が true の場合制御ボタンを有効にして画面上で見えるようにする */
269 enable_button(“bt_c1”);
270 enable_button(“bt_c2”);
271 enable_button(“bt_c3”);
272 enable_button(“bt_c4”);
273 bt_standby(‘bt_c1_label’);
274 bt_standby(‘bt_c2_label’);
275 bt_standby(‘bt_c3’);
276 bt_standby(‘bt_c4_label’);
277 document.getElementById(“msg_information”).innerHTML = “赤外線リモコン信号取込機能が有効になりました。 “;

268~272 ボタン bt_c1 ~ bt_c4 を有効にします。
関数 enable_button(); は 243~249行目で “disabled” Atribute を削除してボタンを有効にします。
273~276 ボタン bt_c1 ~ bt_c4 が見えるようにします。
関数 bt_standby(); は 302~307行目で文字、背景、境界を見える色に変更します。
277 ブラウザの情報表示窓に表示するためのメッセージを設定します。

bt_mode が false の場合(制御ボタン無効)

278 } else { /** bt_mode が false の場合制御ボタンを無効にして画面上で見えなくする */
279 disabale_button(“bt_c1”);
280 disabale_button(“bt_c2”);
281 disabale_button(“bt_c3”);
282 disabale_button(“bt_c4”);
283 bt_hidden(‘bt_c1_label’);
284 bt_hidden(‘bt_c2_label’);
285 bt_hidden(‘bt_c3’);
286 bt_hidden(‘bt_c4_label’);
287 document.getElementById(“msg_information”).innerHTML = “赤外線リモコン信号取込機能を終了しました。\n通常の赤外線リモコン送信機として機能します。”;
288 }

279~282 ボタン bt_c1 ~ bt_c4 を無効にします。
関数 disable_button(); は 234~240行目で “disabled” Atribute を付加してボタンを無効にします。
283~286 ボタン bt_c1 ~ bt_c4 が見えないようにします。
関数 bt_hidden(); は 309~314行目で文字、背景、境界を見えない色に変更します。
287 ブラウザの情報表示窓に表示するためのメッセージを設定します。

取込ボタン(bt_c1)

index.html

66 <div class=”bt_c1″>
67 <input type=”checkbox” id=”bt_c1″ name=”bt_c1″onclick=”bt_c1Click();”>
68 <label id= “bt_c1_label” for=”bt_c1″>取込</label>
69 </div>
66~69 取込ボタン bt_c1 を定義しています。checkbox 属性を使用して id と name 両方に bt_c1 を設定しています。

js.js
178 functionbt_c1Click(){
.
.
194 }
178~194 取込ボタン bt_c1 が押された時の処理を定義します。
180 var xhr = new XMLHttpRequest();
181 xhr.open(“GET”, “/capture”, true);
182 xhr.send(null);
180~182 取込ボタンが押された時サーバーへメソッド GET、URL /capture のリクエストを送信します。
183 const b11 = document.getElementById(‘bt_c1’);
184 const b12 = document.getElementById(‘bt_c2’);
185 b11.checked = true; /* 「取込」ボタンONを保持する */
186 b12.checked = false; /* 「登録」ボタンをOFFする */
187 bt_active(‘bt_c1_label’); /* 「取込」ボタンをアクティブ色に変更 */
188 bt_standby(‘bt_c2_label’); /* 「登録」ボタンをスタンバイ色に変更 */
183~184 取込ボタン bt_c1 、登録ボタン bt_c2 をインスタンス化します。
185~186 取込ボタン ON を保持し、登録ボタン OFF を保持します。
187 関数 bt_active(); は 295~300行目でボタンの背景色をトマト色、文字色を白に変更します。
188 関数 bt_standby(); は 302~307行目でボタンの背景色を水色に、文字色を黒色に変更します。

190 for (leti = 1; i < 17; i++){
191 buf_btc1 = “bt_” + i ;
192 disabale_button(buf_btc1);
193 }

190~193 リモコン送信ボタン bt_1~bt_16 全てを無効にします。

main.cpp

236 //capture 「取込」ボタン bt_c1 に対するレスポンス
237 server.on(“/capture”, HTTP_GET, [](AsyncWebServerRequest*request){
238 Serial.println(“\n「取込」ボタンが押されました。”); //ターミナルにメッセージ出力
239 digitalWrite(ena_receive_PIN, HIGH); //irReceive レベルシフト回路の動作を開始
240 status_information=“「取込」を開始します。リモコン送信機のボタンを押してください。”; //クライアント側で情報を表示する
241 request->send_P(200, “text/plain”, getMsg_information().c_str());
242 });

236~242 URL /capture により取込ボタン bt_c1 からの GET リクエストと認識されます。
238 ターミナルにメッセージを出力します。
239 ena_receive_PIN を HIGH レベルにして赤外線信号受信回路の動作を許可します。
240 内部変数 status_information にメッセージを設定します。
241 クライアント側に text/plane として送信してブラウザ画面に表示します。

356 String receive_IR_process() {
.
.
429 return writeStr;
430 }

356~430 赤外線リモコン信号の受信を処理する関数です。
この関数は Loop 内 287行目で呼び出されて常に動作状態になっています。
取込ボタン bt_c1 が押された時のレスポンスの 239行目で ena_receive_PIN を HIGH レベルに設定することで赤外線リモコン信号受信回路の動作が有効になります。

このとき被学習リモコンのボタンが押されると、赤外線リモコン信号を受信したリモコン受光 IC の出力信号が ESP32 モジュールに入力されることになります。
関数 String receive_IR_process(){} で処理されることにより文字列 writeStr が戻り値として得られます。

登録ボタン(bt_c2)

index.html

70 <divclass=“bt_c2”>
71 <inputtype=“checkbox”id=“bt_c2”name=“bt_c2”onclick=“bt_c2Click();”>
72 <labelid= “bt_c2_label”for=“bt_c2”>登録</label>
73 </div>
70~73 登録ボタン bt_c2 を定義しています。checkbox 属性を使用して id と name 両方に bt_c2 を設定しています。

js.js

197 functionbt_c2Click(){
198 varxhr = newXMLHttpRequest();
199 xhr.open(“GET”, “/memory”, true);
200 xhr.send(null);
201 constb11 = document.getElementById(‘bt_c1’);
202 constb12 = document.getElementById(‘bt_c2’);
203 b11.checked = false; /* 「取込」ボタンをOFFする */
204 b12.checked = true; /* 「登録」ボタンONを保持する */
205 bt_standby(‘bt_c1_label’); /* 「取込」ボタンをスタンバイ色に変更 */
206 bt_active(‘bt_c2_label’); /* 「登録」ボタンをアクティブ色に変更 */
207 enable_all_of_TX_keys(); /* 16個の「リモコン送信ボタン」をすべて許可する */
208 }
197~208 登録ボタン bt_c2 の動作を定義しています。

197~200 登録ボタン bt_c2 を押した時サーバーへメソッド GET、URL /memory のリクエストを送信します。
201~202 取込ボタン bt_c1 と登録ボタン bt_c2 をインスタンス化します。
203~204 取込ボタンを OFF に、登録ボタンを ON に保持します。
205~206 取込ボタンをスタンバイ色(水色)に、登録ボタンをアクティブ色(トマト色)に変更します。
207 16個のリモコン送信ボタンをすべて有効にします。

main.cpp

244 server.on(“/memory”, HTTP_GET, [](AsyncWebServerRequest*request){
245 Serial.println(“\n「登録」ボタンが押されました。”); //ターミナルにメッセージ出力
246 digitalWrite(ena_receive_PIN, LOW); //irReceive レベルシフト回路の動作を停止
247 ena_store = true;
248 num_reg = num_reg + 1; //「リモコン送信」ボタンに登録する登録数を加算する
249 status_information=“登録を開始します。\n登録する「任意」のボタンを押してください。”; //クライアント側で情報を表示する
250 request->send_P(200, “text/plain”, getMsg_information().c_str());
251 });

244~251 URL /memory により登録ボタン bt_c2 からの GET リクエストと認識されます。
245 ターミナルにメッセージを出力します。

246 ena_receive_PIN を LOW レベルにして赤外線リモコン信号受信回路の動作を停止します。
247 ena_store = true; 有効に設定して Flash への書込みを許可します。
248 リモコン送信ボタンに登録する赤外線リモコン信号の登録数を加算します。
249 内部変数 status_information にメッセージを設定します。
250 クライアント側に text/plane として送信してブラウザ画面に表示します。

終了ボタン(bt_c3)

index.html

74 <button class=‘bt_c3’ onclick=‘bt_c3Clicked(this)’ id=‘bt_c3’>終了</button>

74 終了ボタンを定義しています。終了ボタンは状態を保持する必要が無いので属性には checkbox は使わずに button を使用します。

js.js

211 functionbt_c3Clicked(element) {
212 varxhr = newXMLHttpRequest();
213 xhr.open(“GET”, “/finish”, true);
214 xhr.send(null);
215 constb11 = document.getElementById(‘bt_c1’);
216 constb12 = document.getElementById(‘bt_c2’);
217 b11.checked = false; /* 「取込」ボタンをOFFする */
218 b12.checked = false; /* 「登録」ボタンをOFFする */
219 bt_standby(‘bt_c1_label’); /* 「取込」ボタンをスタンバイ色に変更 */
220 bt_standby(‘bt_c2_label’); /* 「登録」ボタンをスタンバイ色に変更 */
221 enable_all_of_TX_keys(); /* 16個の「リモコン送信ボタン」をすべて許可する */
222 }

211~222 終了ボタン bt_c3 の動作を定義しています。
211~214 終了ボタン bt_c3 を押した時サーバーへメソッド GET、 URL /finish のリクエストを送信します。
215~216 取込ボタン bt_c1 と登録ボタン bt_c2 をインスタンス化します。
217~218 取込ボタンと登録ボタンを OFF にします。
219~220 取込ボタンと登録ボタンをスタンバイ色(水色)にします。
221 16個のリモコン送信ボタンすべてを有効にします。

main.cpp

253 server.on(“/finish”, HTTP_GET, [](AsyncWebServerRequest*request){
254 Serial.println(“\n「終了」ボタンが押されました。”); //ターミナルにメッセージ出力
255 digitalWrite(ena_receive_PIN, LOW); //irReceive レベルシフト回路の動作を停止。
256 ena_send = false; //irsend を禁止
257 ena_store = false; //Flash 書込みを禁止
258 ena_restore = false; //Flash 読出しを禁止
259 ena_assign = false; //信号登録禁止
260 status_information=“取込、登録を終了しました。”; //クライアント側で情報を表示する
261 num_reg = 0; //登録数カウンタをリセットする
262 request->send_P(200, “text/plain”, getMsg_information().c_str());
263 });

253 URL /FINISH により終了ボタン bt_c3 からの GET リクエストと認識されます。
254 ターミナルにメッセージを出力します。

255 ena_receive_PIN を LOW レベルに設定して赤外線リモコン信号受信回路の動作を停止します。
256~259 ena_send、ena_store、ena_restore、ena_assign の各フラグを false に設定して赤外線リモコン信号送信、Flash 書込み、Flash 読出し、登録を禁止します。
260 内部変数 status_information にメッセージを設定します。
261 登録数カウンタ num_reg = 0; をリセットします。
262 クライアント側に text/plane として送信してブラウザ画面に表示します。

リモコン送信ボタン(bt_1 ~ bt_16)

リモコン送信ボタン bt_1 ~ bt_16 の動作を説明します。

index.html

18 <p>TV</p>
19 <divclass=“inline_1”>
20 <buttonclass=‘bt_1’onclick=‘bt_1Clicked(this)’id=‘bt_1’>電源</button>
  .
.
23 <buttonclass=‘bt_4’onclick=‘bt_4Clicked(this)’id=‘bt_4’></button>
24 </div>
25 <br>
.
39 <p>BOSE</p>
40 <divclass=“inline_4”>
.
45 </div>
46 <br>

18 ~ 46 リモコン送信ボタン bt_1 ~ bt_16 を定義しています。
18 、 39 TV と BOSE の2つのグループに分類するラベルを付けています。
19、26、33、40 ボタンを4個ずつ横並びにするので inline_1~inline_4 のクラス名を付けて分類しています。
各ボタンは button 属性を使って class と id に bt_1 ~ bt_16 を設定しています。

js.js

38 functionbt_1Clicked(element){
39 if (document.getElementById(‘bt_c1’).checked == false){
40 varxhr = newXMLHttpRequest();
41 xhr.open(“GET”, “/bt_1”, true);
42 xhr.send(null);
43 }
44 }

38 ~ 44 リモコン送信ボタン bt_1 が押された時の動作を定義しています。
39 取込ボタン bt_c1 が押されていない、つまりチェックが false の場合に以下を実行します。
40 ~ 42 
サーバーへメソッド GET、URL /bt_1 のリクエストを送信します。
リモコン送信ボタン bt_2~bt_16 にはそれぞれ bt_2 ~ bt_16 の URL を設定しています。

main.cpp

140 server.on(“/bt_1”, HTTP_GET, [](AsyncWebServerRequest*request){
141 bt_response (“1”, “TV 電源”);
142 request->send_P(200, “text/plain”, getMsg_information().c_str());
143 });
140 URL /bt_1 によりボタン bt_1 からの GET リクエストと認識されます。
141 関数 bt_response(); を実行します。
142 クライアント側に text/plane メッセージを送信してブラウザ画面に表示します。
563 void bt_response(String bt_label, String bt_name){
564 wrfolder = “/bt_” + bt_label; //フォルダ名生成(bt_label の値は 1-16)
565 wrfile = “/bt_” + bt_label; //ファイル名生成
.
.
587 }

563~587 リモコン送信ボタンが押された時の処理になります。
564~565 引数 bt_label を使ってフォルダ名とファイル名を生成します。
この関数は受信した赤外線リモコン信号を Flash に書込んで登録する場合と、登録した赤外線リモコン信号を Flash から読出して送信する場合の2種類の動作に分かれます。

リモコン送信ボタンに登録する場合
取込んだ赤外線リモコン信号を登録する場合は登録ボタン bt_c2 に対するレスポンス 247行目で ena_store = true; に設定されるので、次の内容が実行されます。
568 if (ena_store == true){ //「取込」、「登録」に続けて「リモコン送信」ボタンを押した場合、
569 if ( bt_id!=bt_label){ //複数「登録」で異なる「リモコン送信」ボタンを押した場合、
570 num_reg = 1; //リモコン送信ボタンに登録するリモコン信号の数を 1 に戻しておく。
571 }
572 ena_assign = true; //信号登録許可
573 delay(1000); //Flash 書込みを待ってから次の処理へ進める。
574 Stringstr_buf = dtostrf(num_reg,2,0,m_buf); //整数を文字列に変換
575 //クライアント側で情報を表示する
576 status_information=bt_name+” ボタンに”+str_buf+” つめのリモコン信号を「登録」しました。”;
577 //複数登録中にリモコン送信ボタンが変更されたか識別用 bt_id に bt_label (1-16) を初期値として設定する。
578 bt_id=bt_label;
579 }
568~579 当該リモコン送信ボタンに登録する場合を定義しています。
569~571 複数登録で異なるリモコン送信ボタンを押した場合は登録数カウンタ num_reg を 1 に戻します。
572 信号登録許可フラグを有効 ena_assign = true; にします。Loop 内 291行目で ena_store == true、かつ ena_assign == true の条件が成立したので、Flash への書込み登録が開始されます。
573 Flash への書込みが終わるまで 1000ms 待ちます。
574~576 クライアント側で情報を表示するための文字列を生成します。
578 複数登録中にリモコン送信ボタンが変更されたかを識別するための変数 bt_id に引数で受け取った bt_label を設定します。
291 if ((ena_store == true) && (ena_assign == true)){ //Flash 書込み許可、信号登録許可 の場合
.
298 wrfile=wrfolder+wrfolder+“_”+num_reg+“.txt”;
299 store_Flash( wrfile, writeStr ); //受信した信号を Flash に書込む
.
304 wrfile=wrfolder+“/num_reg.txt”;
305 Stringstr_buf = dtostrf(num_reg,2,0,m_buf); //整数を文字列に変換
.
308 ena_store = true; //Flash 書込み許可
309 store_Flash( wrfile, str_buf ); //登録数カウンタ値を Flash に書込む
310 ena_assign = false; //信号登録禁止
311 }
291~311 登録ボタンに続けてリモコン送信ボタンが押された時の処理です。
298 564行目で生成したフォルダ名と登録数カウンタから赤外線リモコン信号を格納するファイル名を生成します。
299 生成したファイル名 wrfile と 412行目で取込んだ赤外線リモコン信号 writeStr を引数として Flash に書込みます。

304 564行目で生成したフォルダ名と登録数カウンタから登録数カウンタを格納するファイル名を生成します。
305 整数 num_reg を文字列に変換して Flash に書込む準備をします。
308 書込みフラグを有効にします。
309 304行目で生成したファイル名と305行目で変換した文字列を引数として Flash に書込みます。

例えばリモコン送信ボタン bt_1 に 2 つのリモコン信号を登録した場合に生成されるファイル名と Flash に書込まれる内容は次のようになります。
フォルダ名 ファイル名
/bt_1 —–|—–bt_1_1.txt (リモコン信号1:HEX文字列)
|—–bt_1_2.txt (リモコン信号2:HEX文字列)
|—–num_reg.txt (2:文字列)

リモコン信号を読出して送信する場合

ena_store が false の時にリモコン送信ボタンが押されると以下の動作をします。

581 elseif ((ena_store == false)){
582 ena_restore = true; //Flash 読出しを許可
583 ena_send = true; //irSend リモコン信号送信を許可
584 //クライアント側で情報を表示する
585 status_information=bt_name+” リモコン信号を送信しました。”;
586 }
581~586 リモコン送信ボタンが押された時の処理になります。
582    Flash 読出し許可フラグを有効にします。
583    リモコン信号送信許可フラグを有効にします。
585    クライアント側で情報を表示するための文字列を生成します。
315 if ((ena_restore == true) && (ena_send == true)){ //Flash 読出し許可、irSend 許可 の場合
.
.
344 }

315~344
Loop 処理中に Flash 読出し許可フラグ、リモコン信号送信許可フラグともに有効となった場合の処理です。

317 //登録数カウンタ num.reg の値を Flash から読出す
318 wrfile = wrfolder + “/num_reg.txt”; //ファイル名生成 (例) wrfile = “/bt_1/num_reg.txt”
319 restore_Flash(wrfile); //FALSH から読出し
320 int count = atoi(readStr.c_str()); //for ループでカウントするために文字列を整数に変換する。
321
322 //「リモコン送信」ボタンに何も登録されていなければ処理を終了する。
323 if ( count == 0){
324 ena_restore = false; //Flash 読出し禁止
325 ena_send = false; //irSend 禁止
326 status_information = “このボタンには何も登録されていません。”; //クライアント側で情報を表示する
327 Serial.println(status_information); //ターミナル出力
328 }

317~328 Flash から読出す準備をします。
318    押されたボタンに対応した登録数カウンタ値を読取るためにファイル名を生成します。
319    Flash から登録数カウンタの値を読出して readStr に格納します。
320    読出した文字列 readStr を 整数 count に変換します。
323~328 count が 0 の場合は当該ボタンに何も登録されていないので、ena_send == false に設定してリモコン信号送信許可フラグを無効にします。そしてボタンに何も登録されていない旨のメッセージをクライアント側とターミナルに出力します。

329 //「リモコン送信」ボタンに登録された登録数 num_reg 回だけ Flash から読出して送信する。
330 for (inti =1 ; i <= count; i++){ // count は Flash から読出した登録数を整数化したもの
331
332 //ファイル名生成 (例) wrfile = “bt_1/bt1_1.txt”
333 wrfile=wrfolder+wrfolder+“_”+i+“.txt”;
334 restore_Flash(wrfile); //Flash からリモコン信号を読出す
335 delay(100);
336 send_IR_process(readStr); //リモコン信号送信
337
338 //ループの最後でフラグを初期化しておく
339 if ( i == count ){
340 ena_restore = false; //Flash 書込み禁止
341 ena_send = false; //irSend 禁止
342 }
343 }
330~343 リモコン送信ボタンに登録された登録数 count 回だけ Flash から読出してリモコン信号を送信します。
330    登録数 count 回 for ループを繰り返します。
333~336 当該ボタンに対応したフォルダ名とループ回数 i からファイル名を生成して、Flash から readStr を読出して赤外線リモコン信号を送信します。
339~342 for ループの最後に Flash 書込み許可フラグとリモコン信号送信許可フラグを無効化します。

おわりに

完全リタイヤ後に見よう見まねで始めたソフトウェア開発なので拙いところが多々あるかと思います。

開発中は試行錯誤が続くので途中で残したドキュメントは構想や目標と結果が入り乱れたものになりがちです。きちんと整理しておきたかったので本編をまとめてみました。

自分自身でレビューして再検証も多く相当時間を費やしましたが、その分理解が深まりました。次の開発へ向けて役立つものになりました。

リンク

ESP32を使って学習リモコンを作る(1) 学習リモコンでどんなことができるの?
ESP32を使って学習リモコンを作る(2) ハードウェア
ESP32を使って学習リモコンを作る(3) ソフトウェア 赤外線リモコン受信( irReceive )
ESP32を使って学習リモコンを作る(4) ソフトウェア 赤外線リモコン送信( irSend )
ESP32を使って学習リモコンを作る(5) ソフトウェア webserver
ESP32を使って学習リモコンを作る(6) ソフトウェア Flash 読書き(SPIFFS)
ESP32を使って学習リモコンを作る(71) ソフトウェア 本機のプロジェクト
ESP32を使って学習リモコンを作る(81) ソフトウェア 本機プロジェクトの勘所
ESP32を使って学習リモコンを作る(9) ハードウェア設計の勘所
ESP32を使って学習リモコンを作る(10) 学習リモコンを操作した時のターミナル出力
Smart_Remote_Controller プロジェクト GitHub

(YI)

コメント

error: Content is protected !!
タイトルとURLをコピーしました