#include #include #include //LCD Setup (P1-GND, P2-5V, P3-10K2GND, P4-RS, P5-GND, P6-EN, P11-D4, P12-D5, P13-D6, P14-D7) LiquidCrystal lcd(13,12,11,10,9,8); //(RS, EN, D4, D5, D6, D7) int tempSensor = A0; //int tempUp = A4; //int tempDown = A5; int blindsOpenButton = A3; int blindsCloseButton = A5; int setTemp = 70; //default temperature int blindsAreOpen; int fanIsOn; unsigned long lastPush; unsigned long lastPrint; Servo switch1; Servo switch2; Servo blinds; int switchOn = 110; int switchOff = 75; int blindsOpen = 0xaaa; int blindsClose = 0xfff; unsigned long blindsOverRideTime = 0; unsigned long fanOverRideTime = 0; unsigned long lastAutomatic = 0; int RECV_PIN = 4; IRrecv irrecv(RECV_PIN); IRsend irsend; decode_results results; void setup() { Serial.begin(9600); // set up the LCD's number of columns and rows: lcd.begin(16, 2); lcd.print("Welcome Home!"); Serial.println("Welcome Home!"); delay(3000); lcd.clear(); printStatus(); Serial.println("Starting"); closeBlinds(); fanOff(); irrecv.enableIRIn(); // Start the receiver } void loop() { printStatus(); //print current room conditions if (irrecv.decode(&results)) { processIR(&results); irrecv.resume(); // Receive the next value } //check for/make adjustments float currentTemp = checkTemp(); if(!digitalRead(blindsOpenButton)){ Serial.println("BlindsOpenButton"); if(millis() - lastPush > 500){ openBlinds(); blindsOverRideTime = millis(); lastPush = millis(); } }else if(!digitalRead(blindsCloseButton)){ Serial.println("BlindsCloseButton"); if(millis() - lastPush > 500){ closeBlinds(); blindsOverRideTime = millis(); lastPush = millis(); } } if((currentTemp < setTemp) && (millis() - lastAutomatic >= 5000)){ if(fanIsOn && (millis() - fanOverRideTime >= 60000)) fanOff(); if(blindsAreOpen && (millis() - blindsOverRideTime >= 60000)){ Serial.println("Auto Close Blinds"); closeBlinds(); } lastAutomatic = millis(); }else if(currentTemp > setTemp && (millis() - lastAutomatic >= 5000)){ if(!fanIsOn && (millis() - fanOverRideTime >= 60000)) fanOn(); if(!blindsAreOpen && (millis() - blindsOverRideTime >= 60000)){ Serial.println("Auto Open Blinds"); openBlinds(); } lastAutomatic = millis(); } } float checkTemp(){ return ((analogRead(tempSensor) * (5.0 / 1024.0) / 3.3) * 330.0 - 50.0) * 1.8 + 32.0; } void printStatus() { if(millis() - lastPrint >= 1000){ float temp = checkTemp(); lcd.setCursor(0,0); lcd.print("Temp.: "); lcd.print(temp); lcd.setCursor(0,1); lcd.print("Set Temp.: "); lcd.print(setTemp); lastPrint = millis(); } } void openBlinds() { Serial.println("Open Blinds"); for(int k = 0; k < 3; k++){ irsend.sendSony(blindsOpen, 12); delay(300); } irrecv.enableIRIn(); // Start the receiver blindsAreOpen = 1; } void closeBlinds(){ Serial.println("Close Blinds"); for(int k = 0; k < 3; k++){ irsend.sendSony(blindsClose, 12); delay(300); } irrecv.enableIRIn(); // Start the receiver blindsAreOpen = 0; } void fanOn() { Serial.println("Fan ON"); switch2.attach(6); switch2.write(switchOn); delay(300); switch2.detach(); fanOverRideTime = millis(); fanIsOn = 1; } void fanOff() { Serial.println("Fan OFF"); switch2.attach(6); switch2.write(switchOff); delay(300); switch2.detach(); fanOverRideTime = millis(); fanIsOn = 0; } void lightsOn() { Serial.println("Lights ON"); switch1.attach(5); switch1.write(switchOn); delay(300); switch1.detach(); } void lightsOff() { Serial.println("Lights Off"); switch1.attach(5); switch1.write(switchOff); delay(300); switch1.detach(); } void processIR(decode_results *results) { int count = results->rawlen; if (results->decode_type == NEC) { Serial.print("Decoded NEC: "); char *translation = translate(results); Serial.println(translation); if(!strcmp(translation,"VolUp")){ lightsOn(); }else if(!strcmp(translation,"VolDown")){ lightsOff(); }else if(!strcmp(translation,"ChanUp")){ fanOverRideTime = millis(); fanOn(); }else if(!strcmp(translation,"ChanDown")){ fanOverRideTime = millis(); fanOff(); }else if(!strcmp(translation,"ArrowUp")){ Serial.println("SetTemp UP"); setTemp++; printStatus(); }else if(!strcmp(translation,"ArrowDown")){ Serial.println("SetTemp DOWN"); setTemp--; printStatus(); }else if(!strcmp(translation,"1")){ // delay(500); blindsOverRideTime = millis(); openBlinds(); }else if(!strcmp(translation,"2")){ //delay(500); blindsOverRideTime = millis(); closeBlinds(); } } } char* translate(decode_results* results){ if(results->value == 0x61A000FF){ return "1"; }else if(results->value == 0x61A0807F){ return "2"; }else if(results->value == 0x61A040BF){ return "3"; }else if(results->value == 0x61A0C03F){ return "4"; }else if(results->value == 0x61A020DF){ return "5"; }else if(results->value == 0x61A0A05F){ return "6"; }else if(results->value == 0x61A0609F){ return "7"; }else if(results->value == 0x61A0E01F){ return "8"; }else if(results->value == 0x61A010EF){ return "9"; }else if(results->value == 0x61A0906F){ return "0"; }else if(results->value == 0x61A030CF){ return "VolUp"; }else if(results->value == 0x61A0B04F){ return "VolDown"; }else if(results->value == 0x61A050AF){ return "ChanUp"; }else if(results->value == 0x61A0D02F){ return "ChanDown"; }else if(results->value == 0x61A042BD){ return "ArrowUp"; }else if(results->value == 0x61A0C23D){ return "ArrowDown"; }else if(results->value == 0xFFFFFFFF){ return "holding.."; }else return "unknown"; }