Skip to content

Instantly share code, notes, and snippets.

@zemahran
Last active May 12, 2018 10:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zemahran/1f228bc1ca161b501f88edd29442a100 to your computer and use it in GitHub Desktop.
Save zemahran/1f228bc1ca161b501f88edd29442a100 to your computer and use it in GitHub Desktop.
Mini Home Automation System
#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