Raspberry Piと赤外線LEDでエアコンを自動操作

概要

部屋に水槽を置いているのですが、夏場に魚が茹で上がるのを防止するため、一定室温を超えたらエアコンが作動するようなシステムを作ることにしました。ラズパイで赤外線LEDを制御します。

つくりかた

GPIO制御ライブラリ pigpio

送受信にはpigpioを使います

$ sudo apt install pigpio
$ sudo systemctl enable pigpiod.service
$ sudo systemctl start pigpiod

送受信プログラムのダウンロード

$ curl http://abyz.me.uk/rpi/pigpio/code/irrp_py.zip | zcat > irrp.py

受信側

アリエクで適当に仕入れた10個入り(こんないらない)103円の受信モジュールを使います

受光部正面から見て左から OUT, GND, VCC です。2.7~5.5Vで動くらしいので、3.3Vを繋いでおきます。OUTにはGPIO22を使いました。

もしうまく受信できなかったら、データシートの通りに C=100μF, R=100Ω のRCフィルターを挟めばよいかと思います。

赤外線コードの記録

エアコン停止の信号を記録してみます。”codes”ファイルに記録されます

$ python3 irrp.py -r -g22 -f codes aircon:stop --post 130

中身はこんな感じになってました

 "aircon:stop": [3499, 1736, 446, 425, 446, 1304, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 1304, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 1304, 446, 1304, 446, 1304, 446, 425, 446, 425, 446, 1304, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 1304, 446, 1304, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 10026, 3499, 1736, 446, 425, 446, 1304, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 1304, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 1304, 446, 1304, 446, 1304, 446, 425, 446, 425, 446, 1304, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 1304, 446, 425, 446, 425, 446, 425, 446, 425, 446, 1304, 446, 425, 446, 1304, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 1304, 446, 1304, 446, 1304, 446, 1304, 446, 1304, 446, 425, 446, 1304, 446, 425, 446, 1304, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 1304, 446, 1304, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 1304, 446, 1304, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 1304, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 1304, 446, 1304, 446, 425, 446, 425, 446, 425, 446, 425, 446, 425, 446, 1304, 446, 425, 446, 425, 446, 1304, 446, 425, 446, 425, 446, 425, 446, 1304, 446]

あとは下のように各温度に対応する信号を記録します。並べれば一気にできます。

$ python3 irrp.py -r -g22 -f codes aircon:c26 aircon:c27 aircon:c28 --post 130

発信側

赤外線LEDもアリエクで適当に買ったやつを使います

パルスで75mAまで流していいみたいです

回路

ラズパイのGPIOではパワーが足りないのでトランジスタ 2SC1815 を使います。

必要な抵抗を計算します。赤外線LEDのVfは大体1.3Vぐらいらしいです。

3.3Vに繋ぎ、75mAを流すとすると、コレクタ抵抗は大体 Rc = (3.3-1.3)/0.075 = 27Ω にすればいいです。近い抵抗は22Ωがあるので、それを使うと コレクタ電流 Ic = (3.3-1.3)/22 = 91mA 流れますね。まあ若干超えてますがいいでしょう。

ベース抵抗を考えます。2SC1815のIc-Vce特性を見てください。

コレクタエミッタ間電圧Vceに電圧を吸われないようにするため、多めのベース電流を流します。Ic = 91mA のとき、低いVceに収まってるベース電流にしたいので、ベース電流は Ib = 5mA とします。
そのときの抵抗は、 Rb = (3.3-0.6)/0.005 = 540Ω (0.6はベースエミッタ間電圧Vbe)。近い抵抗は510Ωで、それを使うと Ib = (3.3-0.6)/510 = 5.3mA 流れます。

画像

ベースにGPIO23を繋げて発信してみます。

$ python3 irrp.py -p -g23 -f codes aircon:off

…届かない😅
エアコンまで5mぐらいですが、全然届きません

今度は5Vに繋いでLEDを3つ直列にして試します。推定110mA流れる計算ですが大丈夫なんでしょうか?

これで一応届くようにはなりました。
GPIO23からずっと3.3V出力して10Ω抵抗両端の電圧測れば流れている電流が正確にわかりますが、多分焼ききれるのでやりたくないです。

まあまあ指向性があるので、グルーガンでエアコンの方向にガチガチに固定しておきます

室温と連動させる

温度センサーにAHT10を使います。プログラムはこれを利用しました。

https://github.com/gejanssen/aht10-python

室温30度になったらエアコンを28度の設定でONにします。

aircon_auto.py

import smbus
import time
import requests
import subprocess

#bus = smbus.SMBus(0)  # Rev 1 Pi uses 0
bus = smbus.SMBus(1) # Rev 2 Pi uses 1
# when you have a 121 IO Error, uncomment the next pause
# time.sleep(1) #wait here to avoid 121 IO Error

config = [0x08, 0x00]
bus.write_i2c_block_data(0x38, 0xE1, config)
time.sleep(0.5)
byt = bus.read_byte(0x38)
MeasureCmd = [0x33, 0x00]
bus.write_i2c_block_data(0x38, 0xAC, MeasureCmd)
time.sleep(0.5)
data = bus.read_i2c_block_data(0x38,0x00)
temp = ((data[3] & 0x0F) << 16) | (data[4] << 8) | data[5]
ctemp = ((temp*200) / 1048576) - 50

on_temp = 30

if ctemp > on_temp:
    res = subprocess.run("python3 irrp.py -p -g23 -f codes aircon:c28", shell=True)

crontabで5分毎に実行します

$ crontab -e

*/5 * * * * python3 (aircon_auto.pyのパス)

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Index