RaspberryPi를 리모컨으로 하여 에어컨을 ON/OFF
14634 단어 RaspberryPiIoT
개요
우리 집의 에어컨은 오래되었고 온도를 설정해도 제대로 설정된 온도를 유지할 수 없습니다. 냉방을 ON으로 해 두면 점점 온도가 내려 버립니다. 적외선 리모컨은 동작하기 때문에 외부에서 ON, OFF를 제어하는 약간의 IoT 기기를 만들어 보았습니다.
Raspberry PI zero의 온도 센서로 온도를 측정하고 에어컨을 ON, OFF를 적외선 통신으로 실시합니다. 학습 리모컨은 여기를 참조하여 만들었습니다.
부품
알고리즘
에어컨이 켜져 있는지 또는 꺼져 있는지를 유지하는 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)
Reference
이 문제에 관하여(RaspberryPi를 리모컨으로 하여 에어컨을 ON/OFF), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/UchiwaFuujinn/items/0760a1b302462e1fc5ff
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
실제 공작
저것 이것과 기판을 사용해 주고 있기 때문에, 별로 참고가 되지 않는다고 생각합니다.
프로그램
프로그램은 파이썬으로 작성되었습니다.
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)
Reference
이 문제에 관하여(RaspberryPi를 리모컨으로 하여 에어컨을 ON/OFF), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/UchiwaFuujinn/items/0760a1b302462e1fc5ff
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# -*- 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)
Reference
이 문제에 관하여(RaspberryPi를 리모컨으로 하여 에어컨을 ON/OFF), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/UchiwaFuujinn/items/0760a1b302462e1fc5ff텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)