RaspberryPi를 리모컨으로 하여 에어컨을 ON/OFF

14634 단어 RaspberryPiIoT

개요



우리 집의 에어컨은 오래되었고 온도를 설정해도 제대로 설정된 온도를 유지할 수 없습니다. 냉방을 ON으로 해 두면 점점 온도가 내려 버립니다. 적외선 리모컨은 동작하기 때문에 외부에서 ON, OFF를 제어하는 ​​약간의 IoT 기기를 만들어 보았습니다.

Raspberry PI zero의 온도 센서로 온도를 측정하고 에어컨을 ON, OFF를 적외선 통신으로 실시합니다. 학습 리모컨은 여기를 참조하여 만들었습니다.



부품


  • 온도 센서: mcp9808
  • 적외선 리모컨 수신 모듈: OSRB38C9AA
  • 적외선 LED: 503IRC2E-2AC

  • 알고리즘



    에어컨이 켜져 있는지 또는 꺼져 있는지를 유지하는 FLAG가 있습니다. FLAG=0이 에어컨이 OFF 상태, FLAG=1이 에어컨이 ON 상태를 나타냅니다. FLAG=0의 경우, 온도를 측정하고 있는 온도(Tmax) 이상이면 에어컨을 ON으로 하고, FLAG=1의 경우, 어느 온도(Tmin) 이하가 되면 에어컨을 끕니다. OFF에서 ON, 반대로 OFF에서 ON으로 상태가 변화했을 때, 각각 30분, 에어컨이 효과가 오는 것을 기다립니다.

    처음, 어느 온도가 되면 에어컨을 ON, 어느 온도 이하라면 에어컨을 OFF로 하는 간단한 프로그램이었습니다. 설정한 온도의 사이에 몇번이나 에어컨 ON의 리모컨 조작을 실시해 버려, 에어컨이 「피・피」라고 번거롭게 되어 버렸습니다.



    그래서 FLAG와 대기 시간을 캡처하기로 결정했습니다. FLAG=1일 때는 에어컨을 OFF로 하는 온도를 목표로 온도가 Tmax를 넘어도 다시 ON하지 않습니다. 또, ON으로 한 후, 30분은 아무것도 하지 않도록 변경해 버렸습니다.



    귀찮은 것은, 자고 있어 스스로가 참을 수 없어 에어컨의 리모컨을 만지게 되어 버리는 것. 수동으로 리모컨으로 에어컨을 넣고 (자르고) 버리면 FLAG와 모순됩니다. FLAG=0으로 에어컨을 ON으로 하는 타이밍을 찾고 있는데, 정말 에어컨은 ON이 되어 점점 온도가 내려 버려, OFF로 하는 타이밍을 찾아야 한다든가.

    그 때문에, 찾고 있는 방향과 반대가 되었을 경우에 FLAG를 반전하는 구조를 넣고 있습니다.



    회로도





    실제 공작



    저것 이것과 기판을 사용해 주고 있기 때문에, 별로 참고가 되지 않는다고 생각합니다.



    프로그램



    프로그램은 파이썬으로 작성되었습니다.

    mcp9808 프로그램



    smbus 라이브러리를 이용합니다. smbus는 I2C와 거의 동일한 표준입니다. 작동시켜 보면 문제없이 온도를 측정할 수 있습니다.

    mcp9808.py
    # -*- coding: utf-8 -*-
    import smbus
    from time import sleep
    
    true    =1
    false   =0
    
    MCP9808_I2CADDR_DEFAULT        =0x18   # < I2C address
    MCP9808_REG_CONFIG             =0x01   # < MCP9808 config register
    
    MCP9808_REG_CONFIG_SHUTDOWN    =0x0100 # < shutdown config
    MCP9808_REG_CONFIG_CRITLOCKED  =0x0080 # < critical trip lock
    MCP9808_REG_CONFIG_WINLOCKED   =0x0040 # < alarm window lock
    MCP9808_REG_CONFIG_INTCLR      =0x0020 # < interrupt clear
    MCP9808_REG_CONFIG_ALERTSTAT   =0x0010 # < alert output status
    MCP9808_REG_CONFIG_ALERTCTRL   =0x0008 # < alert output control
    MCP9808_REG_CONFIG_ALERTSEL    =0x0004 # < alert output select
    MCP9808_REG_CONFIG_ALERTPOL    =0x0002 # < alert output polarity
    MCP9808_REG_CONFIG_ALERTMODE   =0x0001 # < alert output mode
    
    MCP9808_REG_UPPER_TEMP         =0x02   # < upper alert boundary
    MCP9808_REG_LOWER_TEMP         =0x03   # < lower alert boundery
    MCP9808_REG_CRIT_TEMP          =0x04   # < critical temperature
    MCP9808_REG_AMBIENT_TEMP       =0x05   # < ambient temperature
    MCP9808_REG_MANUF_ID           =0x06   # < manufacture ID
    MCP9808_REG_DEVICE_ID          =0x07   # < device ID
    MCP9808_REG_RESOLUTION         =0x08   # < resolutin
    
    class mcp9808():
        def __init__(self, ):
            self.bus = smbus.SMBus(1)
            self.address_mcp9808 = MCP9808_I2CADDR_DEFAULT
            self.register_mcp9808 = MCP9808_REG_AMBIENT_TEMP
            while(self.mcp9808_init()==false):
                print("*")
    
        def mcp9808_init(self):
            word_data = self.bus.read_word_data(self.address_mcp9808, MCP9808_REG_MANUF_ID)
            print("MCP9808_REG_MANUF_ID=",word_data)
            if (word_data!=0x5400):
                return false;
            word_data = self.bus.read_word_data(self.address_mcp9808, MCP9808_REG_DEVICE_ID)
            print("MCP9808_REG_DEVICE_ID=",word_data)
            if (word_data != 0x0004):
                return false;
            self.bus.write_word_data(self.address_mcp9808, MCP9808_REG_CONFIG, 0)
            return true;
    
        def read_mcp9808(self):
            word_data = self.bus.read_word_data(self.address_mcp9808, self.register_mcp9808)
            word_data = ((word_data&0xFF00)>>8) + ((word_data&0x00FF)<<8)
            data = word_data & 0xfff
            temperature = data/16.0
            if(word_data&0x1000):
                temperature=temperature-256;
            return temperature
    
        def shutdown_wake(self,sw):
            conf_register = self.bus.read_word_data(self.address_mcp9808, MCP9808_REG_CONFIG)
            if (sw == true):
                conf_shutdown = conf_register | MCP9808_REG_CONFIG_SHUTDOWN
                self.bus.write_word_data(self.address_mcp9808, MCP9808_REG_CONFIG, conf_shutdown)
            if (sw == false):
                conf_shutdown = conf_register & ~MCP9808_REG_CONFIG_SHUTDOWN
                self.bus.write_word_data(self.address_mcp9808, MCP9808_REG_CONFIG, conf_shutdown)
    
        def read_temperature(self):
            self.shutdown_wake(false)
            sleep(0.25)
            inputValue = self.read_mcp9808()
            return inputValue
    

    사용하는 측에서는 다음과 같이 온도를 측정할 수 있습니다.
    from mcp9808 import *
    mcp=mcp9808()
    tmp=mcp.read_temperature()
    print(tmp)
    

    좋은 웹페이지 즐겨찾기