ESP32でエアコンを制御する（IRremote v4.x）


### はじめに
前回，ESP32とIRremoteライブラリを使ってテレビリモコンの赤外線信号を送受信することができました。今回は，赤外線のデータ長がテレビリモコンよりも長いエアコンのリモコンを解析し，その信号を送信してみようと思います。

### 実装準備
実装方針や準備するもの，実装環境に関しては，前回の投稿と特に変わらずエアコン制御用にスケッチを少し変更するだけです。同じ手順で進めます。

<details><summary>1. 実装方針</summary>

リモコンの作成には「受信して解析→送信する」の流れで進めていきます。

**受信する**

1. 受信モジュールの回路を組み立てESP32にプログラムを書き込みます
2. リモコンのボタンを受信モジュールに向けて信号を送信します
3. シリアルモニタで解析されたデータを確認します

**送信する**

1. 赤外線LEDとトランジスタを使って回路を組み，ESP32にプログラムを書き込みます
2. プログラムを実行して送信先のデバイスが動作するか確認します

これでリモコンの信号を受信して解析し，送信するという流れで実装していきます。

</details>

<details><summary>2. 準備するもの</summary>

* **ESP32開発ボード**：[ESP32-DevKitC-32E ESP32-WROOM-32E開発ボード 4MB](https://akizukidenshi.com/catalog/g/g115673/)
* **USBケーブル**（ESP32とPCをつなげる用）：[USBケーブル USB2.0 A-microB](https://akizukidenshi.com/catalog/g/g107607/)
* **PC**（Windows）
* **赤外線リモコン受信モジュール（IRレシーバ）**：[OSRB38C9AA](https://akizukidenshi.com/catalog/g/g104659/)
* **赤外線LED**：[5mm 940nm OSI5FU5111C-40](https://akizukidenshi.com/catalog/g/g103261/)
* **N-mosfet**：[NchパワーMOSFET 60V 25A 2SK2232](https://akizukidenshi.com/catalog/g/g102414/)
* **2.2Ω抵抗**：[1W 2.2Ω カーボン抵抗](https://akizukidenshi.com/catalog/g/g107953/)
* **10kΩ抵抗**：[1/4W 10kΩ カーボン抵抗](https://akizukidenshi.com/catalog/g/g125103/)
* **ブレッドボード**：ESP32がしっかり取り付けられるように6穴連結ピン以上で広めの面積のものをケチらずに買いましょう。
* **ジャンパワイヤ**：ブレッドボード上の部品を配線するために使用します。
    * [ブレッドボード・ジャンパーワイヤ 14種類×10本](https://akizukidenshi.com/catalog/g/g100288/)
    *  [ブレッドボード・ジャンパーワイヤ(オス-メス) 15cm(白)](https://akizukidenshi.com/catalog/g/g108935/)（任意）
* **調べたいリモコン**：
    * シーリングライト（Panasonic）
    * テレビのリモコン（ORION）
    * エアコンのリモコン（日立）

</details>


<details><summary>3. 回路作成</summary>

**受信する用回路**

![20240917181533.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680988/2233c001-fa93-8f9c-00f3-17bcd6f39ec4.jpeg)

**送信する用回路**

![2024091718153a3.jpg](https://cdn-ak.f.st-hatena.com/images/fotolife/y/yhotta240/20240917/20240917132914.jpg)

</details>

<details><summary>4. 実装環境</summary>


* Arduino IDE v2.3.2
https://www.arduino.cc/en/software
* ESP32 v3.0.4<br>Arduino IDEのボードマネージャからインストール
https://github.com/espressif/arduino-esp32
* 使用ライブラリ：IRremote v4.4.1<br>Arduino IDEのライブラリマネージャでインストールする。もしくは以下のリンクから`\Arduino\libraries`にクローン
https://github.com/Arduino-IRremote/Arduino-IRremote

Arduino IDE やESP32のセットアップ方法については以前のブログを参考にしてください。

https://yhotta240.hatenablog.com/entry/2024/09/09/050147?_gl=1*hkroiv*_gcl_au*NjYyMjcwNDM3LjE3MjU1NTAzMjg

</details>

ここまでは前回と同様です

https://qiita.com/yhotta240/items/df0f2f92b5dff1d9410b

### 赤外線を受信

#### エアコン用リモコン
![IMG_5851.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680988/66b2f700-08f4-ca8e-ae65-e961de8451da.jpeg)

#### 受信用スケッチ：

```cpp
#define RAW_BUFFER_LENGTH 900
#include <IRremote.hpp>  // IRremoteライブラリ
#define IR_RECEIVE_PIN 13 // GPIOピン番号を定義

void setup() {
  Serial.begin(115200);  // シリアル通信の初期化
  IrReceiver.begin(IR_RECEIVE_PIN, DISABLE_LED_FEEDBACK);  // 赤外線受信の初期化
}

void loop() {
  if (IrReceiver.decode()) {  // 信号を受信したら
    Serial.print("Received Raw Data: ");
    Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);  // 生のデータを16進数で表示
    IrReceiver.printIRResultShort(&Serial);  // 受信したデータの簡潔な概要を表示
    IrReceiver.printIRSendUsage(&Serial);    // 受信した信号を送信するためのコードを表示
    IrReceiver.printIRResultRawFormatted(&Serial, true);  // RAWフォーマットで結果を表示
    IrReceiver.compensateAndPrintIRResultAsCArray(&Serial, true);  // uint16_t配列として結果を出力
    IrReceiver.resume();  // 次の信号を受信できるようにする
  }
}

```
▼ **冷房：**
```:シリアルモニタ
Received Raw Data: FF00FF00
Protocol=PulseDistance Repeat gap=51100us Raw-Data=0xFF00FF00 424 bits LSB first
Raw result in microseconds - with leading gap
rawData[851]: 
 -51100
 +3400,-1650
 + 450,-1200 + 500,- 350 + 450,- 400 + 450,- 400
 + 450,- 400 + 450,- 350 + 500,- 350 + 500,- 350
 ・・・{省略}・・・
 + 450,- 400 + 450,- 400 + 450,- 350 + 500,- 350
 + 450,- 400 + 450,- 400 + 450,- 400 + 450,- 400
 + 450
Sum: 532300
uint16_t rawData[851] = {3380,1670, 430,1220, 480,370, 430,420, ・・・{省略}・・・, 430,420, 430,420, 430};  // Protocol=PulseDistance Repeat gap=51100us Raw-Data=0xFF00FF00 424 bits LSB first

```


### 赤外線を送信
#### 送信用のスケッチ作成（エアコンの冷房）
受信した赤外線信号を送信するためのスケッチを作成します。ここでは，先ほど受信した`rawData[851]`のデータをそのまま赤外線モジュールを使って再送信します。
```cpp
#include <IRremote.hpp>
#define IR_SEND_PIN 4  // MOSFETを制御するGPIOピン（例：GPIO3）
#define PIN_BUTTON_TURN_ON 0

// 冷房
const uint16_t rawData[851] = {3380,1670, 430,1220, 480,370, 430,420, ・・・{省略}・・・, 430,420, 430,420, 430};

void setup() {
  Serial.begin(115200);  // シリアル通信の初期化
  // 赤外線送信モジュールの初期化
  IrSender.begin(IR_SEND_PIN, DISABLE_LED_FEEDBACK, 0);
  pinMode(PIN_BUTTON_TURN_ON, INPUT_PULLUP);
}

void loop() {
  // 受信したデータ送信
  if (digitalRead(PIN_BUTTON_TURN_ON) == LOW) { // bootボタンを押す
    IrSender.sendRaw(rawData, sizeof(rawData)/sizeof(rawData[0]), 38);
    Serial.println("send trun on at " + String(millis()));
  }
  delay(5000);
}

```

#### 送信テスト
スケッチを書き込み，ESP32のブートボタンを押して送信テストを行います。シリアルモニタには「send turn on at」といったメッセージが表示され，送信成功のタイミングがミリ秒単位で確認できます。

無事にエアコンの冷房を起動させることができました。

### まとめ
今回は，ESP32とIRremoteライブラリを使用して赤外線信号の受信・解析・再送信を行い，エアコンの制御に成功しました。今後はこれらを応用してGASと連携させ，エアコンなどを遠隔操作できるようにしたいと思います。

### 最後に
お読みいただきありがとうございます。
この記事の詳しい内容や手順，プログラムの解説については，以下のブログにまとめていますのでぜひご覧ください。

https://yhotta240.hatenablog.com/entry/2024/09/25/215515?_gl=1*5ivcfz*_gcl_au*NjYyMjcwNDM3LjE3MjU1NTAzMjg

### 参考
https://asukiaaa.blogspot.com/2021/12/copy-and-send-ir-signal-by-esp32-arduino.html

https://github.com/Arduino-IRremote/Arduino-IRremote?tab=readme-ov-file#supported-ir-protocols

https://docs.sunfounder.com/projects/esp32-starter-kit/ja/latest/arduino/basic_projects/ar_irremote.html