Raspberry Piと赤外線LEDでエアコンを自動操作
部屋に水槽を置いているのですが、夏場に魚が茹で上がるのを防止するため、一定室温を超えたらエアコンが作動するようなシステムを作ることにしました。ラズパイで赤外線LEDを制御します。
pigpio
送受信にはpigpioを使います
1 2 3 | $ sudo apt install pigpio $ sudo systemctl enable pigpiod.service $ sudo systemctl start pigpiod |
送受信プログラムのダウンロード
1 | $ 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”ファイルに記録されます
1 | $ python3 irrp.py -r -g22 -f codes aircon:stop --post 130 |
中身はこんな感じになってました
1 | "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] |
あとは下のように各温度に対応する信号を記録します。並べれば一気にできます。
1 | $ 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を繋げて発信してみます。
1 | $ 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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分毎に実行します
1 2 3 | $ crontab -e */5 * * * * python3 (aircon_auto.pyのパス) |
最近のコメント