[강좌] 아두이노로 에어컨 스마트하게 컨트롤 하기

모바일 페이지

요즘 아두이노와 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