この記事は別ブログ(2021/06/03投稿)から移行したものです。
エアコンのタイマーを作ります。
作ろうと思った経緯。
エアコン自体のタイマーを使用すると停止後の霜取り(エアコン内部のカビ防止)運転をしてくれない(設定の方法も見つからない)
夏場はほぼ毎日のように寝る前に1時間タイマーをかけてから寝ます。
ただしこれだと運転停止後霜取り運転をしてくれませんのでエアコン内部は結露しまくりカビも増殖しまくりです。
エアコンのカビ掃除は非常に面倒なのでなるべくカビの発生は抑えたい。
ということでArduinoを使って1時間タイマーを作ろうということに至りました。
仕様
- 三菱重工ビーバーエアコン
- 電源オンでエアコンもオン
- 1時間後エアコンをオフ(霜取り運転あり)
リモコンです⇩
今回赤外線データをそのまま解析するのでリモコンの型式がどれであろうとあまり関係ないと思います。
赤外線データを解析する
赤外線データの解析にはこちらのサイト様のプログラムを利用させていただきました。
ArduinoとPCを接続し、シリアルモニタを開き赤外線モジュールに向かって信号を送信します。
するとこのような感じで赤外線の生のデータを得られます。
あとはこの生のデータをライブラリ「IRremote」を使って送信すればエアコンはコントロール出来てしまいます。
ちょこっとデータを整える
このままのデータでもエアコンはコントロールできますが、プログラムの見た目をスッキリさせたいのでExcelを使ってデータを整えてみます。
先ほどのデータを適当に作ったテキストファイルにコピペします。
テキストエディタ等で開いて変換されたデータをスケッチで利用します。
マクロです⇩
Sub エアコンコードの変換()
Dim i
For i = 1 To 307
If Cells(2, i).Value > 400 And Cells(2, i).Value < 500 Then
Cells(2, i) = "BM"
ElseIf Cells(2, i).Value > 250 And Cells(2, i).Value < 380 Then
Cells(2, i) = "BM"
ElseIf Cells(2, i).Value > 1000 And Cells(2, i).Value < 1200 Then
Cells(2, i) = "OS"
ElseIf Cells(2, i).Value > 1400 And Cells(2, i).Value < 1600 Then
Cells(2, i) = "HS"
ElseIf Cells(2, i).Value > 3000 And Cells(2, i).Value < 3500 Then
Cells(2, i) = "HM"
End If
Next
End Sub
「For i = 1 To
307」の307はデータの数を手打ちしているだけですのでもっとうまいやり方があると思います。
Arduinoスケッチ
ライブラリはArduinoを赤外線リモコンとして利用できるようになる「IRremote.h」とArduinoのスリープを利用できるようになる「avr/sleep.h」の二つを使用。
IRremoteに関しては最新版ではなく古いVer2.0.1を使いました。
最新版では上手く動作しなかったためです。
先ほど変換したデータは配列にしておきます(AONとAOF)
動作は至ってシンプル
- Arduinoの電源が入り次第「sendRaw関数」でAON配列を送信
- 1時間待つ
- 「sendRaw関数」でAOFを送信
- パワーダウンモードで節電
#include <IRremote.h> //version2.0.1
#include <avr/sleep.h>
IRsend irsend;
int a = 1;
const uint16_t HM = 3200; //Pause Space
const uint16_t HS = 1600; //Header Space
const uint16_t BM = 400; //Bit Mark
//const uint16_t ZS = 400; //Zero Space
const uint16_t OS = 1200; //One Space
const uint16_t AON[307] = { //ドライ、24℃、風速自動、風左、風上
HM, HS, BM, BM, BM, OS, BM, BM, BM, BM, BM, OS, BM, BM, BM, OS, BM, BM, BM, BM, BM, OS,
BM, OS, BM, OS, BM, BM, BM, OS, BM, BM, BM, OS, BM, OS, BM, OS, BM, BM, BM, BM, BM, BM,
BM, BM, BM, OS, BM, OS, BM, BM, BM, OS, BM, BM, BM, OS, BM, OS, BM, BM, BM, BM, BM, BM,
BM, OS, BM, BM, BM, OS, BM, BM, BM, BM, BM, OS, BM, OS, BM, OS, BM, OS, BM, BM, BM, OS,
BM, BM, BM, OS, BM, OS, BM, OS, BM, OS, BM, BM, BM, OS, BM, BM, BM, OS, BM, BM, BM, BM,
BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, OS, BM, OS, BM, OS, BM, OS, BM, OS, BM, OS,
BM, OS, BM, OS, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, OS, BM, OS, BM, OS, BM, OS,
BM, OS, BM, OS, BM, OS, BM, OS, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM,
BM, BM, BM, OS, BM, OS, BM, OS, BM, OS, BM, OS, BM, BM, BM, OS, BM, OS, BM, BM, BM, BM,
BM, BM, BM, BM, BM, BM, BM, OS, BM, BM, BM, BM, BM, BM, BM, OS, BM, OS, BM, OS, BM, OS,
BM, BM, BM, OS, BM, OS, BM, OS, BM, BM, BM, BM, BM, BM, BM, BM, BM, OS, BM, BM, BM, BM,
BM, OS, BM, OS, BM, OS, BM, OS, BM, OS, BM, OS, BM, BM, BM, OS, BM, BM, BM, BM, BM, BM,
BM, BM, BM, BM, BM, BM, BM, OS, BM, BM, BM, OS, BM, OS, BM, OS, BM, OS, BM, OS, BM, OS,
BM, OS, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, OS, BM
};
const uint16_t AOF[307] = { //オフ、2時間の霜取りあり
HM, HS, BM, BM, BM, OS, BM, BM, BM, BM, BM, OS, BM, BM, BM, OS, BM, BM, BM, BM, BM, OS,
BM, OS, BM, OS, BM, BM, BM, OS, BM, BM, BM, OS, BM, OS, BM, OS, BM, BM, BM, BM, BM, BM,
BM, BM, BM, OS, BM, OS, BM, BM, BM, OS, BM, BM, BM, OS, BM, OS, BM, BM, BM, BM, BM, BM,
BM, OS, BM, BM, BM, OS, BM, BM, BM, BM, BM, OS, BM, OS, BM, OS, BM, OS, BM, BM, BM, OS,
BM, BM, BM, OS, BM, BM, BM, BM, BM, OS, BM, BM, BM, OS, BM, BM, BM, OS, BM, BM, BM, OS,
BM, OS, BM, BM, BM, BM, BM, BM, BM, BM, BM, OS, BM, OS, BM, OS, BM, OS, BM, OS, BM, OS,
BM, OS, BM, OS, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, OS, BM, OS, BM, OS, BM, OS,
BM, OS, BM, OS, BM, OS, BM, OS, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM, BM,
BM, BM, BM, OS, BM, OS, BM, OS, BM, OS, BM, OS, BM, BM, BM, OS, BM, OS, BM, BM, BM, BM,
BM, BM, BM, BM, BM, BM, BM, OS, BM, BM, BM, BM, BM, BM, BM, OS, BM, OS, BM, OS, BM, OS,
BM, BM, BM, OS, BM, OS, BM, OS, BM, BM, BM, BM, BM, BM, BM, BM, BM, OS, BM, BM, BM, BM,
BM, OS, BM, OS, BM, OS, BM, OS, BM, OS, BM, OS, BM, BM, BM, OS, BM, BM, BM, BM, BM, BM,
BM, BM, BM, BM, BM, BM, BM, OS, BM, BM, BM, OS, BM, OS, BM, BM, BM, OS, BM, OS, BM, OS,
BM, OS, BM, BM, BM, BM, BM, BM, BM, OS, BM, BM, BM, BM, BM, BM, BM, BM, BM, OS, BM
};
void setup() {
}
void loop() {
if (a == 1) {
irsend.sendRaw(AON, 307, 38);
delay(1000UL * 60 * 60); //1時間タイマー
a = 2;
}
if (a == 2) {
irsend.sendRaw(AOF, 307, 38);
a = 3;
}
while (a == 3) {
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
}
}
次回は組み立てです。
ArduinoはUNO化したATmega328pマイコン単体で利用します。









