요즘 아두이노와 OBD-II 로 Dashboard 를 만들고 있는 과슈입니다. ^^;;
아직 태블릿이 도착하지 않아서 진척 사항이 없었는데요, 어제 친구녀석과 저녁에 양꼬치를 먹다가 '잘때 에어컨 껐다 켜는게 불편하다'는 민원을 접수하고 짬을내서 친구녀석의 요구사항을 구현해 봤습니다.
요구사항은 이렇습니다.
1. '시작온도' 와 '지속시간' 을 주면 자동으로 끄고 켠다.
2. '시작온도' 와 '목표 온도' 를 주면 자동으로 끄고 켠다.
재료비만 받고 해주겠다고 집에와서 반나절 뚝딱뚝딱 해서 만들었는데, 만들고 보니 양꼬치 한번 더 얻어 먹어야 겠다는 생각이 드네요 ㅎㅎㅎ
컨트롤은 기어 S2 앱을 만들려고 계획 중입니다. 일단 양꼬치를 얻어 먹고 나서 ㅎㅎㅎ
앞면
뒷면
아두이노 구성은 아래와 같이 하면 됩니다.
온도센서, IR Transmitter, HM-10 (블루투스) 그리고 아두이노 Pro mini 를 사용했습니다.
소스 코드는 아래와 같습니다.
LG 에어컨 기준으로 했는데, 원하는 회사의 리모컨 키를 recording 해서 넣어 주면 됩니다.
LG 에어컨은 온도 하나하나에 키를 매핑했더라구요. 좀 당황스럽긴 했지만 리모컨에 숫자키를 안 넣으려니 이랬나 보다 했습니다.
테스트는 MSMble 라는 안드로이드 앱으로 가능합니다.
'@1464680197' 처럼 utc time 을 send 해주면 아두이노의 시간 세팅이 되고,
'#$22.0|30' 처럼 command 를 send 해주면 22.5 도로 30분 켤 수 있습니다.
일전에 소개했던 'Gear S2 로 스마트홈 만들기' 에 추가해 주면 될것 같습니다. ^^
원본글 : http://ift.tt/1Y0wsRn
#include <SoftwareSerial.h>
#include <Time.h>
#include <IRremote.h>
#define TIME_MSG_LEN 11
SoftwareSerial bb(9, 8);
String recv = "";
time_t apptime = 0;
time_t cctime = 0;
time_t rtime = 0;
int rmin = 0;
float stemp;
float rtemp;
int a;
float ctemp;
int B=3975;
float resistance;
int bset = 0;
IRsend irsend;
int status = 0;
/* turn on */
unsigned int turnon[59] = {...};
/* turn off */
unsigned int turnoff[59] = {...};
/* 22.0 */
unsigned int settemp_22_0[59] = {...};
/* 22.5 */
unsigned int settemp_22_5[59] = {...};
/* 23 */
unsigned int settemp_23_0[59] = {...};
/* 23.5 */
unsigned int settemp_23_5[59] = {...};
/* 24 */
unsigned int settemp_24_0[59] = {...};
float StrToFloat(String str){
char carray[str.length() + 1];
str.toCharArray(carray, sizeof(carray));
return atof(carray);
}
void setup()
{
Serial.begin(9600);
bb.begin(9600);
bb.println("hello aircon ");
}
void loop()
{
while (bb.available()){
char data = bb.read();
recv.concat(data);
if (data == '&'){
if(recv[0] == '@'){
/* time setting */
Serial.println(recv);
for(int i=1; i<TIME_MSG_LEN; i++){
if( recv[i] >= '0' && recv[i] <= '9'){
apptime = (10 * apptime) + (recv[i] - '0');
}
}
setTime(apptime);
Serial.print(day());
Serial.print(" ");
Serial.print(month());
Serial.print(" ");
Serial.println(year());
} else if(recv[0] == '#'){
char srecv[recv.length()];
recv.toCharArray(srecv, sizeof(srecv));
Serial.println(srecv);
String temp = "24.0";
String mins = "30";
String dtemp = "24.0";
/* command */
if(srecv[1] == '$'){
/* Temp|Min format : #$22.0|30 */
//sscanf(srecv, "#$%f|%f", &temp, &mins);
temp[0] = srecv[2];
temp[1] = srecv[3];
temp[2] = srecv[4];
temp[3] = srecv[5];
stemp = StrToFloat(temp);
rtemp = stemp;
rtime = now();
mins[0] = srecv[7];
mins[1] = srecv[8];
rmin = StrToFloat(mins);
Serial.print("start temperature = ");
Serial.println(stemp);
Serial.print("mins = ");
Serial.println(rmin);
bset = 1;
}else if(srecv[1] == '^'){
temp[0] = srecv[2];
temp[1] = srecv[3];
temp[2] = srecv[4];
temp[3] = srecv[5];
stemp = StrToFloat(temp);
rtime = now();
dtemp[0] = srecv[7];
dtemp[1] = srecv[8];
dtemp[2] = srecv[9];
dtemp[3] = srecv[10];
rtemp = StrToFloat(dtemp);
Serial.print("start temperature = ");
Serial.println(stemp);
Serial.print("deat temperature = ");
Serial.println(dtemp);
}
}
recv = "";
apptime = 0;
}
}
if (bset) {
int khz = 38;
a = analogRead(0);
resistance = (float)(1023-a)*10000/a;
ctemp = 1/(log(resistance/10000)/B+1/298.15)-273.15;
Serial.print("Current temperature is ");
Serial.println(ctemp);
cctime = now();
Serial.print("remain time ");
Serial.print((rmin*60)-(cctime-rtime));
Serial.println(" s");
if((ctemp > stemp) && ((cctime-rtime)<rmin*60)) {
/* turn on & set temperature */
if (!status) {
status = 1;
Serial.println("turn on and set temp ");
irsend.sendRaw(turnon, sizeof(turnon) / sizeof(turnon[0]), khz);
if (rtemp == 22.0)
irsend.sendRaw(settemp_22_0, sizeof(settemp_22_0) / sizeof(settemp_22_0[0]), khz);
else if (rtemp == 22.5)
irsend.sendRaw(settemp_22_5, sizeof(settemp_22_5) / sizeof(settemp_22_5[0]), khz);
else if (rtemp == 23.0)
irsend.sendRaw(settemp_23_0, sizeof(settemp_23_0) / sizeof(settemp_23_0[0]), khz);
else if (rtemp == 23.5)
irsend.sendRaw(settemp_23_5, sizeof(settemp_23_5) / sizeof(settemp_23_5[0]), khz);
else if (rtemp == 24.0)
irsend.sendRaw(settemp_24_0, sizeof(settemp_24_0) / sizeof(settemp_24_0[0]), khz);
}
} else {
/* turn off */
if (status) {
status = 0;
Serial.println("turn off");
irsend.sendRaw(turnoff, sizeof(turnoff) / sizeof(turnoff[0]), khz);
}
}
}
delay(1000);
}
May 31, 2016 at 04:41PM