ラズパイでエアコン操作

ガレージにエアコンを設置したのですが、温度・湿度を見て冷房・除湿を切り替えて運転させたいなぁと考え、ラズパイで工作することに。

基本的には、格安スマートリモコンの作り方の記事を参考にすればOK。

ただ、エアコンはコマンドが長く、上記記事から更に別記事へのリンクが張ってありますが、エアコンの長い赤外線コードに対応した学習リモコンを作るの記事のPythonプログラムを利用すればOK。

で、格安スマートリモコンの作り方の記事からリンクされている、LEDドライバ回路はNch FETとPch FETの2つ使うやり方ですが、ラズパイの3.3Vから直接駆動できるNch FETもあります。

具体的には、Nch FETのデータシートでVgsの特性を見て、3.3Vで電流が流れていそうならOKです。

家にはたまたまIRLB8721PBFがあったのですが、データシートのVgsを見ると3.3VでもLEDを駆動する電流は余裕で賄えそうです。(秋月電子で探せば、他にもいくつか3.3V駆動できそうなFETが見つかります。)

実際その後、次のような回路で作ってみましたが、バッチリ動きます。(100Ωの左側が、ラズパイのGPIOになります)

そして、Pythonでこんなふうにプログラムで制御します。(前提としては、USBRHが使えることです。)最近はストロベリーLinuxで、I2C通信で温度湿度取れるセンサーも売っているので、温度湿度を取得するところは適宜アレンジしてください。

プログラムの状態遷移図

#!/usr/bin/env python

import subprocess
import sys
import time

#状態遷移定義
STS_OFF = 0
STS_COOL = 1
STS_DRY = 2
STS_BLAST = 3

#エアコンコマンド定義
CMD_OFF = 0
CMD_COOL = 1
CMD_DRY = 2
CMD_BLAST= 3

STATUS = STS_OFF

def aircontrol(cmd):
    if cmd == CMD_OFF:
        cmd = "python3 irrp.py -p -g17 -f codes aircon:off"
        subprocess.Popen(cmd.split())    
    elif cmd == CMD_COOL: 
        cmd = "python3 irrp.py -p -g17 -f codes aircon:cool27on"
        subprocess.Popen(cmd.split())    
    elif cmd == CMD_DRY:
        cmd = "python3 irrp.py -p -g17 -f codes aircon:dry27on"
        subprocess.Popen(cmd.split())    
    elif cmd == CMD_BLAST:
        cmd = "python3 irrp.py -p -g17 -f codes aircon:blaston"
        subprocess.Popen(cmd.split())    
    else:
        cmd = "python3 irrp.py -p -g17 -f codes aircon:off"
        subprocess.Popen(cmd.split())    


def main():
    #USBRHを実行して温度と相対湿度を取得する
    result = subprocess.check_output(['/usr/local/bin/usbrh'])

    #返り値は、温度、相対湿度の順番
    l = result.decode().split()

    #温度
    temp = float(l[0])

    #相対湿度
    rh = float(l[1])

    #飽和水蒸気圧
    e = 6.1078*10**(7.5*temp/(temp+237.3))

    #絶対湿度
    ah = 217*e/(temp+273.15)*rh/100

    global STATUS

    if STATUS == STS_OFF:
        if temp >= 30:
            STATUS = STS_COOL
            aircontrol(CMD_COOL)
        elif temp >= 28.5 and rh >= 65:
            STATUS = STS_DRY
            aircontrol(CMD_DRY)    

    elif STATUS == STS_COOL:
        if temp < 28.5:
            STATUS = STS_DRY
            aircontrol(CMD_DRY)

    elif STATUS == STS_DRY:
        if rh < 60:
            STATUS = STS_BLAST

    elif STATUS == STS_BLAST:
        aircontrol(CMD_BLAST)

        #1時間送風する
        time.sleep(3600)
        
        aircontrol(CMD_OFF)

    else:
        aircontrol(CMD_OFF)

if __name__ == '__main__':
    while True:
        STATUS = STS_OFF
        main()
        #5分おきに実行
        time.sleep(300)

コメントを残す

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

CAPTCHA