hiro yamamoto works

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

赤外線リモコンをWi-Fiで中継する(合体スケッチの改変したところ)

2023-12-30 15:37:26 | 赤外線リモコン

この投稿は書きかけです。スケッチにあやしい箇所や説明不足があるので調べています。

タイトルの"Wi-Fiで"は間違いかもしれません。正しくは"ESP-NOW"ですが、解りにくいですね。
複数のSONY製ブルーレイディスクレコーダを使っている知人が、
操作したいレコーダ以外が反応して困っているらしいとのこと

リモコンモード変更の設定可能台数
2013年秋以降発売モデル 6台(BD1〜6)
それ以外のモデル 3台(BD1〜3)
リモコンモード変更だけでは対応しきれないこともあるらしい

そんな訳でこのプロジェクトはスタートしております。
他にも応用できるんじゃないかという期待も含んでいます。

しくみ
リモコン操作で送信された赤外線をリモコン受光ユニットで受けて、
No.1マイコンでデコードして、ESP-NOW Masterで送信する
No.2マイコンはESP-NOW Slaveで受信して、リモコン信号に戻し赤外線LEDから送信する。
リモコン操作した動作がレコーダーで実行される。

スケッチ(プログラム)について

スケッチ例"ReceiveDump"と"ESPNow_Basic_Master"の合体(?)
それぞれのセクションごとに注意深く合体させてください。
ライブラリ読み込み部分、変数の定義や初期化の部分、setup()部分、loop()部分
もう一方の"SendRawDemo"と"ESPNow_Basic_Slave"の合体も同様に行ってください。

次に追加や変更が必要な部分を書いておきます。
赤外線受信(ReceiveDump)&ESP-NOW Master
#define IR_RECEIVE_PIN 3 //XIAO ESP32S3の時<追加>
//ESP-NOW Masterは赤外線リモコンを受信して、ESP-NOW Slaveへ送る
//<追加>構造体
typedef struct struct_IRSendData {
  char IR_protocol[10];
  uint16_t IR_address;
  uint16_t IR_command;
  uint8_t IR_repeat;
  uint8_t IR_bit;
} struct_IRSendData;
struct_IRSendData IRSendData;

uint8_t repeatCount = 0;//<追加>
//中略
//uint8_t data = 0; //<変更> sendData()関数の前
//esp_err_t result = esp_now_send(peer_addr, &data,sizeof(data)); //<変更> sendData()関数の最初の方 次行のようにする
esp_err_tresult = esp_now_send(peer_addr, (uint8_t *) &IRSendData, sizeof(IRSendData));
//中略
//
delay(4000);//<追加>Serial.begin(115200);の次の行に入れる
中略

    // リピート回数が2回未満の場合に処理を実行
    if (repeatCount < 2) {//<追加>if (IrReceiver.decode())の次の行辺りに入れる
中略
//Serial.println(F("Received noise or an unknown (or not yet enabled) protocol"));
        //}この後に次を入れる
        if (IrReceiver.decodedIRData.protocol == SONY) Serial.println("protocol = SONY ");//<追加>
        //Serial.println(IrReceiver.decodedIRData.protocol);//数値で表示される例SONY=23、SHARP=14
        Serial.print("address = ");
        Serial.println(IrReceiver.decodedIRData.address, HEX); //uint16_t
        Serial.print("command = ");
        Serial.println(IrReceiver.decodedIRData.command, HEX); //uint16_t
        Serial.println("repeat = 2");
        Serial.print("numberOfBits = ");
        Serial.println(IrReceiver.decodedIRData.numberOfBits);

        strcpy(IRSendData.IR_protocol, "SONY");//<追加>
        IRSendData.IR_address = IrReceiver.decodedIRData.address;
        IRSendData.IR_command = IrReceiver.decodedIRData.command;
        IRSendData.IR_repeat = 2 ;
        IRSendData.IR_bit = IrReceiver.decodedIRData.numberOfBits

//Serial.println();から
//IrReceiver.compensateAndPrintIRResultAsPronto(&Serial);までを/**/で括って
コメントにしておくとシリアルモニタの出力が減り見やすくなる
中略

//IrReceiver.resume();を目印にして次の行以降に挿入
      //IrReceiver.resume(); // Prepare for the next valueISR (割り込みサービス ルーチン) ステート マシンを再起動して、次の IR フレームの受信を有効にします。
      //ESP-NOW合体部分ここから>>>
      /*/ In the loop we scan for slave*/// ループの中でスレーブをスキャンする
      ScanForSlave();
      /*/ If Slave is found, it would be populate in `slave` variable*/
      /*/ We will check if `slave` is defined and then we proceed further*/
      // スレーブが見つかれば、変数 `slave` に入力する。
      // `slave` が定義されているかどうかをチェックし、次に進む。
      // スレーブ・チャンネルが定義されているかチェックする
      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 {
          /*/ slave pair failed*/// スレーブ・ペアが失敗
          Serial.println("Slave pair failed!");
        }
      } else {
        /*/ No slave found to process*/ //処理するスレーブが見つからない
      }
      /*/ wait for 3seconds to run the logic again*/ //ロジックを再実行するために3秒待つ
      //delay(3000);
      //>>>ESP-NOW合体部分ここまで
      // リピート回数を増加
      repeatCount++;//<追加>
    } else {//<追加>
      // リピート回数が2回に達した場合、次のリモコン信号の処理を開始する前に
      // repeatCountをクリアするか、任意の初期値に設定する
      repeatCount = 0;//<追加>
    }
    IrReceiver.resume(); // Prepare for the next valueISR (割り込みサービス ルーチン) ステート マシンを再起動して、次の IR フレームの受信を有効にします。
  }

以上ですが解りにくいかな?ごめん
投稿したコードで大体の感じを掴んでもらえればと思います。
注意:リピート回数が2x2で4回になってしまうので、1回になるように追加しています。


"SendRawDemo"と"ESPNow_Basic_Slave"の合体スケッチは次の投稿にしたいと思います。

続く


赤外線リモコンをWi-Fiで中継する(送信、受信基板試作してみる)

2023-12-28 21:59:43 | 赤外線リモコン

この投稿は書きかけです。

タイトルの"Wi-Fiで"は間違いかもしれません。正しくは"ESP-NOW"ですが、解りにくいですね。
複数のSONY製ブルーレイディスクレコーダを使っている知人が、
操作したいレコーダ以外が反応して困っているらしいとのこと

リモコンモード変更の設定可能台数
2013年秋以降発売モデル 6台(BD1〜6)
それ以外のモデル 3台(BD1〜3)
(SONYのWebサイトのQ&A検索で”文書番号 : S1110278026483”より引用)
リモコンモード変更で対応しきれないこともあるらしい

そんな訳でこのプロジェクトはスタートしております。
他にも応用できるんじゃないかという期待も含んでいます。

しくみ
リモコン操作で送信された赤外線をリモコン受光ユニットで受けて、
No.1マイコンでデコードして、ESP-NOW Masterで送信する
No.2マイコンはESP-NOW Slaveで受信して、リモコン信号に戻し赤外線LEDから送信する。
リモコン操作した動作がレコーダーで実行される。


ブレッドボード接触不良による誤動作回避のため、仮に基板に組んでみました。

赤外線受信側

赤外線送信側

写真見れば作れるでしょ


赤外線リモコンをWi-Fiで中継する(IRremoteとESP-NOWのサンプルスケッチを合体)

2023-12-24 17:50:29 | 赤外線リモコン

この投稿は書きかけです

タイトルの"Wi-Fiで"は間違いかもしれません。正しくは"ESP-NOW"ですが、解りにくいですね。
複数のSONY製ブルーレイディスクレコーダを使っている知人が、
操作したいレコーダ以外が反応して困っているらしいとのことを
人づてに聞きました。
複数台を使っても問題が起きないように、リモコンモード変更という方法があったはず?

調べてみると
2013年秋以降発売モデル 6台(BD1〜6)
それ以外のモデル 3台(BD1〜3)
(SONYのWebサイトのQ&A検索で”文書番号 : S1110278026483”より引用)

リモコンモード変更で対応できない台数が稼働している?
多分そうなんでしょう。
そんな訳でこのプロジェクトはスタートしております。
他にも応用できるんじゃないかという期待も含んでいます。

しくみ
リモコン操作で送信された赤外線を受信モジュールで受けて、
No.1マイコンでデコードして、ESP-NOW送信する(Masterとして動作)
No.2マイコンはESP-NOW 受信(Slaveとして動作)して、
リモコン信号に戻して、赤外線LEDから送信する。
リモコン操作した動作がレコーダーで実行される。
注意点
リモコンの赤外線は当機受信モジュール以外へ漏れないようにすること。
レコーダーの受光部は当機以外の赤外線信号が受信されないようにすること。

赤外線受信回路
(リモコン受光ユニットGP1UXC41QSのBPF中心周波数38KHzですが、
40KHz(SONY)でも使うことができました。)

赤外線送信回路(コンデンサは1μFでした。33Ωは最適値ではないかもしれません。)

スケッチの準備
IRremoteライブラリをインストール
ArduinoIDEメニューから"スケッチ" → "ライブラリをインクルード" → "ライブラリを管理"
→ ライブラリマネージャで検索すれば見つかるはずです。
"スケッチの例"から"IRremote" → "ReceiveDump"を開きます。

もう一つのスケッチはESP32のボードマネージャをインストールする必要があります。
XIAO ESP32S3を使いましたので、wiki.seeedstudioのページから
"Additional Boads Manager URLs"を探して"URLリンクのアドレスを
コピー"して"追加のボードマネージャURL"に入力します。

ESP32 Dev Moduleなら次の手順でもOK
"ファイル" → "環境設定" → "追加のボードマネージャURL" → テキストボックスの右側ボタンをクリック
→ "クリックして非公式ボードをサポートするURLのリストを表示"(Webページが開きます)
→ Espressif ESP32を探して"URLリンクのアドレスをコピー"テキストボックスにctrl+vで貼り付け
(場合によってEnterキーで改行してから)→ 追加のボードマネージャURL""OK"
→ "環境設定""OK" → メニューから"ツール"→"ボード" → "ボードマネージャ"
→ "検索をフィルタ"へ"esp32" 入力→絞り込まれた中から "esp32"をインストールします。
インストール済はバージョンNo.横に緑文字で"INSTALLED"となっています
→ "閉じる"(しばらく待たないとスケッチ例が開けないかも)
これでスケッチの例ESP32が追加されました。
"ESP32"→"ESPNow"→"ESPNow_Basic_Slave"とか"ESPNow_Basic_Master"が
追加されています。
赤外線受信側はReceiveDumpとESPNow_Basic_Master、赤外線送信側はSendRowDemoと
ESPNow_Basic_Slaveを合体させますが、詳しくは今後の投稿で書きます。

SONYフォーマット(参考)
プロトコル、アドレス、コマンド、リピート回数、コマンドとアドレスのビット数合計と何か(12,15,20Bit)
サブキャリア40KHz

スケッチ(概要)
先ずは受信から(主にSONYのリモコンについて書いています。)
"スケッチの例"から"ReceiveDump"を選んでsetup()より上に次の1行を追加してください。
#define IR_RECEIVE_PIN  3//D3(GPIO4)に接続している
書き込んでシリアルモニタ開きます。
受光部へ向けてリモコンを操作するとなんやらいっぱい出力されますが、
その中に、次に類似した記述が見つかるはずです。
(数字は操作したリモコンのボタンで違ってきます)
Send with:IrSender.sendSony(0x1, 0x10, 2, 12);
ほぼ受信したままを(次のように)送信側で書いてやれば送れます。
IrSender.sendSony(0x1, 0x10, 2, 12);//参考Address=0x1はTV,0x1E5Aはレコーダー
スケッチ例"SendRawDemo"を見るとloop()の最後の方にsendNEC・・・と
同じように書いてあります。
次にESP-NOWスケッチとの合体
赤外線受信データからアドレス、コマンド、リピート回数(2回で固定)、
ビット数を取り出してESP-NOW MasterからSlaveへ送る
ESP-NOW Slaveに届いたデータをsendSonyの引数として与える。
赤外線リモコン信号送信という感じです。

写真はブレッドボードに、マイコンと赤外線LED&受信モジュールを挿して、色々テストしている様子です。
マイコン:XIAO ESP32S3

赤外線送受信回路ともにシンプルです。
赤外線LEDのドライブ用にトランジスタを(2SC1815)使った方が良いらしいです。

赤外線受信モジュールGP1UXC41QSシャープ
電源に”CRフィルターを実装してください”とデータシートに記載がありました。

IRremoteライブラリとESP-NOWに感謝
続く


データロガーWebから定期的にダウンロード保存する(備忘録)

2023-12-17 11:22:22 | ExcelVBA

chatGPT先生に教えていただいて、Execlのマクロを使って、データロガーのwebページから
データを定期的にダウンロードしてローカルドライブに保存するシートを作りました。
改善の余地はたくさんありますが・・・まあ、伸びしろがあるということですね。

前提条件
ネットワーク内に、CSV形式ファイルデータが保存されたHTTPサーバが動作しています。
データを表示するURLは”http://IPアドレス/年月日.CSV”(ファイル名例20231216.csv)です。

仕様
・マクロの実行、停止はExcelシートのボタンクリックで操作します。
・IPアドレス、保存先のローカルドライブのパス、ダウンロード保存を実行するインターバル時間を
ユーザーフォームで設定します。
・マクロを実行した日のファイルをダウンロードします。
・ダウンロードファイルの保存ファイル名(ブック名)シート名は当日の年月日とします。
・ローカルドライブパスへ当日ファイルを作成し保存します。インターバル時間毎にファイルを更新します。

既知の問題点
マクロ停止操作で”xxxエラー”が出ます。
再度マクロを実行するときは”リセット”ボタンをクリックしてから”マクロの実行”操作してください。

シートのデザインは必要最小限です。

使っていない部分もありますが、今後のことも考えてあえて残しています。

Public startDate As Date, dateValue As Date, localPath As String, csvURL As String, intervalMinutes As Integer, IPAddress As String

'ユーザーフォームを表示するメインのサブルーチン
Sub FormShow()
    ' ユーザーフォームを表示
    frmSetUp.Show
End Sub
Sub mainProgram()
Dim response As VbMsgBoxResult

'実行確認のダイアログを表示
response = MsgBox("メインプログラムを実行します。よろしいですか?", vbYesNo + vbQuestion, "確認")

'ユーザーが「はい」をクリックした場合
If response = vbYes Then
'メインプログラムの処理を開始
'Call downloadAndSave
Call FormShow
Else
'ユーザーが「いいえ」をクリックした場合
MsgBox "メインプログラムの実行をキャンセルしました。", vbInformation, "情報"
End If
End Sub
'!!注意!!サブルーチン名と処理内容が違う ダウンロードの開始日を当日日付に設定する。ダウンロードするCSVファイルのURLを生成する。
Sub downloadAndSave()

<code>' 改善が必要な点 過去のデータをダウンロードすることができない
' サブルーチン関連性 ブック、シートの作成、ファイル名の生成で個別に当日日付を取得しているので、
' 過去の日付が使えるようにそれぞれで改変が必要になる。
' インターフェースの改変 ユーザーフォームに入力された日付を取得し変数へ代入
    </code>
<code>    'Dim startDate As Date ' ダウンロードの開始日?←←
    'Dim localPath As String ' ローカルファイルの保存先パス
    'Dim csvURL As String ' csvファイルのURL
</code>    
<code>    ' 開始日を設定(使っていません。)
    ' startDate = DateSerial(2023, 11, 1) ' 開始日を適切な日付に変更←←
    startDate = Format(Date, "YYYY,MM,DD") ' 開始日を当日日付にセット←←
    </code>
   <code> ' ローカルファイルの保存先パスを設定
    'localPath = "E:" 'フォームから設定するように変更予定</code>

<code>    ' ダウンロードするCSVファイルのURLを設定 URL構文はブラウザ入力と同じです。
    'csvURL = "http://192.168.2.254/ Format(Date, "YYYYMMDD") & ".csv" '変更前のコード←←←←
    csvURL = "http://" & IPAddress & "/" & Format(Date, "YYYYMMDD") & ".csv" 'フォーム設定へ 当日の日付を取得してファイル名に使う←←←←
    MsgBox "CSVファイルのURLは:" & csvURL, vbInformation, "変数の確認" 'デバック用
    'Call DownloadAndContinue '繰り返しダウンロード、Continueを呼び出す。2023.12.08変更前
    Call StartDownload '2023.12.08
End Sub
'ダウンロードを開始するサブルーチン2023.12.08
Sub StartDownload()
'MsgBox "StartDownload確認" ' デバック用
'定期的にダウンロードを開始</code>

<code>    'MsgBox "IP Addressは:" & IPAddress, vbInformation, "変数の確認" 'デバック用
    'MsgBox "保存先パスは:" & localPath, vbInformation, "変数の確認" 'デバック用
    'MsgBox "インターバルは:" & intervalMinutes, vbInformation, "変数の確認" 'デバック用</code>

<code>Application.OnTime Now + TimeSerial(0, intervalMinutes, 0), "DownloadData"
'MsgBox "StartDownloadサブルーチン実行完了" ' デバック用
End Sub</code>

<code>'CSVデータのダウンロードと処理を行うサブルーチン2023.12.08
Sub DownloadData()</code>

<code>'MsgBox "DownloadData実行前" ' デバック用
'ここにcsvデータをダウンロードしてローカルに保存するコードを実装
'サブルーチン"SaveExcel"をここへ挿入する。</code>

<code>'csvファイルをダウンロードして保存するサブルーチン2023.12.08 サブルーチン"SaveExcel"を挿入
'カンマ区切り文字としてインポートする。当日年月日をファイル名にする。指定先にExcel形式で保存する。
'Sub SaveExcel(csvURL As String, localPath As String, dateValue As Date)←←←
'DimはVBAで変数を宣言するキーワードです 変数名とデータ型を指定します
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim fileName As String
    Dim previousPathFileName As String
    Dim previousFileName As String
    Dim chekFileName As String
    </code>
<code>    ' 既存のブックが開かれているか確認
    On Error Resume Next
    ' On Error Resume Next:実行時エラーが発生してもマクロVBAを中断せずにエラーが発生した
    'ステートメントの次ステートメントから実行を継続 …オートメーションエラーなどの原因になる可能性有り
    </code>
<code>    'csvURL = "http://192.168.2.254/ Format(Date, "YYYYMMDD") & ".csv" '参考用←←←←
    '開かれていると想定されるブック(ファイル)名を当日の日付から生成します。
    checkFileName = Format(Date, "YYYYMMDD") & ".xlsx" 'dateValueをDateへ変更←←←←
    'Set wb = Workbooks(Format(Date, "YYYYMMDD") & ".xlsx") 'このように書くとエラーになる←←←←
    </code>
<code>    Set wb = Workbooks("checkFileName") '…Setでwbという変数に入れる
    ' "Workbooks("checkFileName")"Workbookオブジェクトを参照 複数のブックを開いている時に、
    '"checkFileName"で指定したブックをアクティブにします。開いてある必要があります(無いとエラー)
    On Error GoTo 0
    'On Error GoTo 0:現在のプロシージャですべての有効なエラー処理ルーチンを無効にします。
    </code>
<code>    '複数のブック・・・マクロの入ったブックとデータの入ったブックが(別のフォルダに)存在することになる。
    'ダウンロードしたデータはマクロを書いたブックには保存しないで、
    '日付をファイル名としたExcelファイルに保存します。
    </code>
<code>    ' 既存のブックがない場合、新しいブックを作成
    If wb Is Nothing Then
        Set wb = Workbooks.Add '…Setでwbという変数に入れる
    End If
    </code>
<code>    ' 既存のシートがあるか確認
    On Error Resume Next '実行時エラーが発生しても・・・次ステートメントから実行
    'シート名を当日の日付から生成し、ます。
    Set ws = wb.Sheets(Format(Date, "YYYYMMDD")) '…Setでwsという変数に入れる←←←←
    On Error GoTo 0 'エラー処理ルーチンを無効にします。
    </code>
<code>    ' 既存のシートがない場合、新しいシートを作成
    If ws Is Nothing Then
        Set ws = wb.Sheets.Add
        ws.Name = Format(Date, "YYYYMMDD") '←←←←
    End If
    </code>
<code>    ' ファイル名を作成(年月日を使用)fileName = localPath & Format(Date, "YYYYMMDD") & ".xlsx"'←←←←
    ' シートの名前を設定(年月日を使用)ws.Name = Format(Date, "YYYYMMDD")'←←←←
   </code>
<code>    ' 新しいブックを作成  Set wb = Workbooks.Open "fileName" ' エラーとなっていた
    ' Set ws = wb.Sheets(1) ' 指定したブック('wb')から最初のシートを取得して'ws'に割り当てる
    ' シートの名前を設定(年月日を使用)' ws.Name = Format(Date, "YYYYMMDD")'←←←←</code>

<code>    ' テキストのインポート(カンマを区切り文字として指定)
    With ws.QueryTables.Add(Connection:="TEXT;" & csvURL, Destination:=ws.Range("A1"))
        .TextFileParseType = xlDelimited
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileCommaDelimiter = True  ' カンマを区切り文字として指定
        .Refresh
    End With</code>

<code>    ' ファイル名を作成(年月日を使用)
    fileName = localPath & Format(Date, "YYYYMMDD") & ".xlsx" '←←←←
    </code>
<code>    'MsgBox "保存ファイル名は:" & fileName, vbInformation, "確認" 'デバック用
    </code>
<code>    ' 保存
    Application.DisplayAlerts = False ' True:警告メッセージ表示 False:非表示
    wb.SaveAs fileName, FileFormat:=xlOpenXMLWorkbook
    Application.DisplayAlerts = True 'False ' True:警告メッセージ表示 False:非表示</code>

<code>    ' 既存のブックを閉じる
    wb.Close SaveChanges:=False ' False:内容の変更は保存しない 前の"wb.SaveAs"で保存されているためと思う
    </code>
<code>    ''previousFileName = Format(Date - 1, "YYYYMMDD") & ".xlsx"'←←←←</code>

<code>    ' 前日のファイルが開かれているか確認
    ''On Error Resume Next
    ' Set wb = Workbooks(Format(Date - 1, "YYYYMMDD") & ".xlsx")'←←←←
    ''Set wb = Workbooks("previousFileName")
    ''On Error GoTo 0</code>

<code>    ' 前日のファイルが開かれている場合、保存して閉じる
    ''If Not wb Is Nothing Then
        ''Application.DisplayAlerts = True ' True:警告メッセージ表示 False:非表示
        </code>
<code>        ''previousPathFileName = localPath & Format(Date - 1, "YYYYMMDD") & ".xlsx"'←←←←
        ''wb.SaveAs previousPathFileName, FileFormat:=xlOpenXMLWorkbook ' ブックを保存
        ''wb.Close SaveChanges:=False 'False:変更があっても保存せずに終了 True:保存して終了
        </code>
<code>        ''Application.DisplayAlerts = True 'False ' True:警告メッセージ表示 False:非表示
    ''End If</code>

<code>    ' ファイル名を作成(年月日を使用)' fileName = localPath & Format(Date, "YYYYMMDD") & ".xlsx"'←←←←
    ' Excelファイルを保存 'wb.SaveAs fileName, FileFormat:=xlOpenXMLWorkbook
    ' ブックを閉じる ' wb.Close SaveChanges:=False
    </code>
<code>    'Call DownloadAndContinue
'End Sub</code>

<code>' Sub ContinueProcessing()
' Call DownloadAndContinue
' End Sub</code>

<code>'ダウンロード完了後、次のダウンロードをスケジュール
StartDownload
End Sub</code>

<code>'ダウンロードを停止するサブルーチン 2023.12.08 ' Execlシートのボタンからこのサブルーチンを呼び出しています。2023.12.11
Sub StopDownload()</code>

<code>'タイマーのスケジュールをキャンセル
On Error Resume Next
Application.OnTime NextExecution:=Now, Procedure:="DownloadData", Schedule:=False
On Error GoTo 0
End Sub</code>

<code>'設定したキーが押されたことを検出しStopDownloadサブルーチンを呼び出す。使っていません2023.12.10
Sub DetectKeyPress() 'サブルーチンを呼び出す方法の例として残しています</code>

<code>    'ctrl+shift+右方向キーが押されるとStopDownloadサブルーチン(プロシージャ)が呼ばれるように設定
    Application.OnKey "^+{RIGHT}", "StopDownload"</code>

<code>End Sub</code> 

ユーザーフォームのデザイン

ユーザーフォームのコード

'フォームのテキストボックスに入力された内容を"設定を反映する"ボタンクリックで変数へ代入します。
Private Sub buttonSaveValue_Click()

'!!注意!!入力が正しいか間違っているかチェックをしていません。
' インターフェースの改変 ユーザーフォームに入力された日付を取得し変数へ代入

<code>MsgBox "保存先はWindows起動ドライブ(C:)以外を設定してください。エラーになる可能性あります。"
    IPAddress = frmSetUp.TextBox1.Value 'フォーム(frmSetUp)のTextBox1に入力されたIPアドレスを"IPAddress"へ代入します。
    localPath = frmSetUp.TextBox2.Value '…TextBox2に入力された保存先パスを"localPath"へ代入
    intervalMinutes = CInt(frmSetUp.TextBox3.Value) '…TextBox3に入力されたインターバル(分)を"intervalMinutes"へ代入
    'CInt()は引数をIntegerデータ型に変換します。</code>

<code>    MsgBox "IP Addressは:" & IPAddress, vbInformation, "変数の確認" 'デバック用
    MsgBox "保存先パスは:" & localPath, vbInformation, "変数の確認" 'デバック用
    MsgBox "インターバルは:" & intervalMinutes, vbInformation, "変数の確認" 'デバック用
    </code>
<code>Call downloadAndSave</code>

<code>frmSetUp.Hide</code>

<code>End Sub</code>


chatGPT先生ありがとうございました。
おかげでスキルアップできました。


赤外線リモコンをWi-Fiで中継する(手始めにReceiveDump)

2023-12-11 20:08:39 | 赤外線リモコン

タイトルの"Wi-Fiで"は間違いかもしれません。正しくは"ESP-NOW"ですが、解りにくいですね。
リモコンから送信された赤外線信号を受信し、ESP32でWi-Fi(もしくはESPNOW)電波に乗せて送信、
もう1個のESP32でWi-Fi電波受信し、赤外線信号へ戻して、離れた場所のハードディスクレコーダーを
操作しようというプロジェクトです。
ライブラリはArduino IRremoteを使わせていただいています。(感謝!!)
ESP32DevModule互換(?)にIR Receiver Module(DFROBOT)を3V3(3.3V)、GND、D15に接続し、
ReceiverDumpスケッチを書き込んで

SONY製ハードディスクレコーダーのリモコン信号を受信すると、
シリアルモニタになんやら表示されました。

ぼちぼちと、スケッチを解読しながら進めます。