Last active
May 12, 2018 10:28
-
-
Save zemahran/1f228bc1ca161b501f88edd29442a100 to your computer and use it in GitHub Desktop.
Mini Home Automation System
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <SoftwareSerial.h> | |
#include <Firmata.h> | |
#include <elapsedMillis.h> | |
elapsedMillis timeElapsed; | |
unsigned int interval = 45000; | |
const int rxPin = 6; | |
const int txPin = 1; | |
String data; | |
int datalen; | |
char *on; | |
char *off; | |
String sub2 = "on"; | |
int sublen2 = sub2.length()+1; | |
String sub3 = "off"; | |
int sublen3 = sub3.length()+1; | |
byte previousPIN[TOTAL_PORTS]; | |
byte previousPORT[TOTAL_PORTS]; | |
SoftwareSerial mySerial(rxPin, txPin); | |
void setup() { | |
//put your setup code here, to run once: | |
Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback); | |
Firmata.attach(SET_PIN_MODE, setPinModeCallback); | |
Firmata.begin(9600); | |
Serial.begin(9600); | |
mySerial.begin(9600); | |
pinMode(2, OUTPUT); | |
pinMode(3, OUTPUT); | |
pinMode(4, OUTPUT); | |
pinMode(5, OUTPUT); | |
digitalWrite(2, HIGH); | |
digitalWrite(3, HIGH); | |
digitalWrite(4, HIGH); | |
digitalWrite(5, HIGH); | |
} | |
void(* resetFunc) (void) = 0; | |
void loop() { | |
// put your main code here, to run repeatedly: | |
char ch=0; | |
data=""; | |
while(1) | |
{ | |
if(mySerial.available() > 0) | |
{ | |
ch = mySerial.read(); | |
if(ch=='#') | |
break; | |
switch(ch){ | |
case'1': digitalWrite(2, LOW);Serial.println("ac on");break; | |
case'2': digitalWrite(2, HIGH);Serial.println("ac off");break; | |
case'3': digitalWrite(3, LOW);Serial.println("lights on");break; | |
case'4': digitalWrite(3, HIGH);Serial.println("lights off");break; | |
case'5': digitalWrite(4, LOW);Serial.println("tv on");break; | |
case'6': digitalWrite(4, HIGH);Serial.println("tv off");break; | |
case'7': | |
digitalWrite(5, LOW); | |
Serial.println("Music is on!"); | |
while(timeElapsed<interval){ | |
//Serial.println("Listening.."); | |
byte i; | |
for (i = 0; i < TOTAL_PORTS; i++) { | |
outputPort(i, readPort(i, 0xff)); | |
} | |
while (Firmata.available()) { | |
Firmata.processInput(); | |
} | |
if(mySerial.available() > 0){ | |
ch = mySerial.read(); | |
if(ch=='8'){ | |
digitalWrite(5, HIGH); | |
Serial.println("Music is off!"); | |
delay(20); | |
resetFunc(); | |
} | |
} | |
} | |
;break; | |
case'9': | |
digitalWrite(2, HIGH); | |
digitalWrite(3, HIGH); | |
digitalWrite(4, HIGH);Serial.println("all off");break; | |
default : data+=ch; | |
} | |
} | |
} | |
//parsing data into a charArray | |
datalen = data.length()+1; | |
char dataArr[datalen]; | |
data.toCharArray(dataArr, datalen); | |
//on | |
char subArr2[sublen2]; | |
sub2.toCharArray(subArr2, sublen2); | |
on = strstr(dataArr, subArr2); | |
//off | |
char subArr3[sublen3]; | |
sub3.toCharArray(subArr3, sublen3); | |
off = strstr(dataArr, subArr3); | |
Serial.println(data); | |
bool ac_on = (on && (check("ac", dataArr)||check("az", dataArr)||check("a z", dataArr) | |
||check("a c", dataArr)||check("easy", dataArr)|| | |
check("AC", dataArr)))||check("hot", dataArr); | |
bool ac_off = off && (check("ac", dataArr)||check("az", dataArr)||check("a z", dataArr) | |
||check("a c", dataArr)||check("easy", dataArr)||check("AC", dataArr)); | |
bool lights_off = (off && check("light", dataArr))||check("dim", dataArr); | |
bool all_on = (((check("all", dataArr))||(check("old", dataArr))|| | |
(check("everything", dataArr)))&&on) || (check("home", dataArr)); | |
bool all_off = (((check("all", dataArr))||(check("old", dataArr))|| | |
(check("everything", dataArr)))&&off) || (check("good night", dataArr)); | |
bool tv_on = on && ((check("TV", dataArr))||(check("tv", dataArr))); | |
bool tv_off = off && ((check("TV", dataArr))||(check("tv", dataArr))); | |
//AC | |
if(ac_on) | |
{ | |
digitalWrite(2,LOW); | |
Serial.println("ac on"); | |
} | |
else if(ac_off) | |
{ | |
digitalWrite(2,HIGH); | |
Serial.println("ac off"); | |
} | |
//Lights | |
if(on && check("light", dataArr)) | |
{ | |
digitalWrite(3,LOW); | |
Serial.println("lights on"); | |
} | |
else if(lights_off) | |
{ | |
digitalWrite(3,HIGH); | |
Serial.println("lights off"); | |
} | |
//TV | |
if(tv_on) | |
{ | |
digitalWrite(4,LOW); | |
Serial.println("tv on"); | |
} | |
else if(tv_off) | |
{ | |
digitalWrite(4,HIGH); | |
Serial.println("tv off"); | |
} | |
//All | |
if (all_on) | |
{ | |
digitalWrite(2,LOW); | |
digitalWrite(3,LOW); | |
digitalWrite(4,LOW); | |
Serial.println("all on"); | |
} | |
else if (all_off) | |
{ | |
digitalWrite(2,HIGH); | |
digitalWrite(3,HIGH); | |
digitalWrite(4,HIGH); | |
Serial.println("all off"); | |
} | |
} | |
bool check(String str, char dataArr[]){ | |
int strlengo = str.length()+1; | |
char subArr[strlengo]; | |
str.toCharArray(subArr, strlengo); | |
return strstr(dataArr, subArr); | |
} | |
void outputPort(byte portNumber, byte portValue) | |
{ | |
// only send the data when it changes, otherwise you get too many messages! | |
if (previousPIN[portNumber] != portValue) { | |
Firmata.sendDigitalPort(portNumber, portValue); | |
previousPIN[portNumber] = portValue; | |
} | |
} | |
void setPinModeCallback(byte pin, int mode) { | |
if (IS_PIN_DIGITAL(pin)) { | |
pinMode(PIN_TO_DIGITAL(pin), mode); | |
} | |
} | |
void digitalWriteCallback(byte port, int value) | |
{ | |
byte i; | |
byte currentPinValue, previousPinValue; | |
if (port < TOTAL_PORTS && value != previousPORT[port]) { | |
for (i = 0; i < 8; i++) { | |
currentPinValue = (byte) value & (1 << i); | |
previousPinValue = previousPORT[port] & (1 << i); | |
if (currentPinValue != previousPinValue) { | |
digitalWrite(i + (port * 8), currentPinValue); | |
} | |
} | |
previousPORT[port] = value; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment