diff --git a/firmware/examples/Time_Activated_Relay.ino b/firmware/examples/Time_Activated_Relay.ino new file mode 100644 index 0000000..4c45089 --- /dev/null +++ b/firmware/examples/Time_Activated_Relay.ino @@ -0,0 +1,258 @@ +// This #include statement was automatically added by the Particle IDE. +#include "NCD8Relay/NCD8Relay.h" + +const int centralZone = -6; +const int easternZone = -5; +const int mountainZone = -7; +const int pacificZone = -8; + +int eventArray[28][9]; +int numberOfEvents = 0; + +bool process = false; + +void newEventsHandler(const char *event, const char *data); +int setZone(String zone); +int clearMemory(String nothing); +int serialPrintMemory(String nothing); + +NCD8Relay controller; + +void setup() { + controller.setAddress(0,0,0); + if(Particle.subscribe("timeEventsDevice1", newEventsHandler, MY_DEVICES)){ + Serial.println("Subscribed"); + }else{ + Serial.println("Failed to subscribe"); + } + Particle.function("setTimezone", setZone); + Particle.function("clearMemory", clearMemory); + Particle.function("printMemory", serialPrintMemory); + int storedZone = EEPROM.read(0); + if(storedZone != 255){ + int zone = (EEPROM.read(0)*-1); + Time.zone(zone); + process = true; + readStoredEvents(); + } +} + +void loop() { + if(process){ + evalTime(Time.year(), Time.month(), Time.day(), Time.weekday(), Time.hour(), Time.minute(), Time.second()); + delay(1000); + }else{ + Serial.println("No Stored Events"); + delay(2000); + } +} + +void newEventsHandler(const char *event, const char *data){ + Serial.println("Handler Triggered"); + storeEvents((char *)data); +} + +void storeEvents(char *events){ + Serial.printf("events at entry to storeEvents method: %s \n", events); + //break events up into an array of ints + int len = 0; + String testString = String(events); + int stringLength = testString.length(); + Serial.printf("stringLength: %i \n", stringLength); + + char tempEvents[stringLength+1]; + testString.toCharArray(tempEvents, stringLength+1); + Serial.printf("tempEvents: %s \n", tempEvents); + char * pch = strtok (tempEvents, ","); + while (pch != NULL) + { + len++; + pch = strtok (NULL, ","); + } + Serial.printf("len: %i \n", len); + + int eventArray[len]; + Serial.printf("events before going to split: %s \n", events); + splitStringToIntArray(events, eventArray, ","); + + for(unsigned int i = 1; i < len*4;i+=4){ + Serial.printf("Storing %i in location %i \n", eventArray[(i-1)/4], i); + EEPROM.put(i, eventArray[(i-1)/4]); + } + readStoredEvents(); +} + +void readStoredEvents(){ + int stopIndex = 0; + for(int i = 1; i < 2048; i++){ + if(EEPROM.read(i) != 255){ + stopIndex++; + } + } + if(stopIndex == 0){ + Serial.println("No Stored Events"); + return; + } + unsigned char bytes[4]; + bytes[0] = (2016 >> 24) &0xFF; + bytes[1] = (2016 >> 16) &0xFF; + bytes[2] = (2016 >> 8) &0xFF; + bytes[3] = 2016&0xFF; + Serial.printf("%i, %i, %i, %i \n", bytes[0], bytes[1], bytes[2], bytes[3]); + int locationTest; + EEPROM.get(1, locationTest); + Serial.printf("location test %i \n",locationTest); + int locationTest2; + EEPROM.get(5, locationTest2); + Serial.printf("location test 2 %i \n", locationTest2); + Serial.printf("stopIndex: %i \n" , stopIndex); + + numberOfEvents = stopIndex/36; + Serial.printf("numberOfEvents: %i \n", numberOfEvents); + + int startIndex = 1; + for(int eventIndex = 0; eventIndex < numberOfEvents; eventIndex++){ + Serial.printf("Event at location %i: ",eventIndex); + for(int i = startIndex; i < startIndex+36; i+=4){ + EEPROM.get(i, eventArray[eventIndex][(i-1)/4]); + Serial.printf("%i, ", eventArray[eventIndex][(i-1)/4]); + } + Serial.printf("Event at location %i: ",eventIndex); + Serial.println(); + startIndex+=36; + } + Serial.printf("2numberOfEvents: %i \n", numberOfEvents); +} + +int setZone(String zone){ + int tZone = zone.toInt(); + EEPROM.write(0, tZone); + tZone = tZone * -1; + Time.zone(tZone); + process = true; + return 1; +} + +void evalTime(int year, int month, int dayOfMonth, int dayOfWeek, int hour, int minute, int second){ + //Cycle through stored events and compare to current date/time. + for(int i = 0; i < numberOfEvents; i++){ + bool runCommand = true; + + //Check Year + if(eventArray[i][0] != year){ + //Year does not match and is required + if(eventArray[i][0] != 0){ + runCommand = false; + } + + } + //Check Month + if(eventArray[i][1] != month){ + //Month does not match and is required + if(eventArray[i][1] != 0){ + runCommand = false; + } + } + //Check Day of Month + if(eventArray[i][2] != dayOfMonth){ + //Day of Month does not match and is required + if(eventArray[i][2] != 0){ + runCommand = false; + } + } + //Check Day of Week + if(eventArray[i][3] != dayOfWeek){ + //Day of Week does not match and is required + if(eventArray[i][3] != 0){ + runCommand = false; + } + } + //Check Hour + if(eventArray[i][4] != hour){ + //Hour does not match and is required + if(eventArray[i][4] != 24){ + runCommand = false; + } + } + //Check Minute + if(eventArray[i][5] != minute){ + //Minute does not match and is required + if(eventArray[i][5] != 60){ + runCommand = false; + } + } + //Check Second + if(eventArray[i][6] != second){ + //Second does not match and is required + if(eventArray[i][6] != 60){ + runCommand = false; + } + } + + if(runCommand){ + Serial.println("Running command"); + executeCommand(eventArray[i][7], eventArray[i][8]); + } + } +} + +void splitStringToIntArray(char *s, int *buffer, String del){ + int index = 0; + + Serial.printf("s in splitString method: %s \n", s); + + char * pch = strtok (s, del); + while (pch != NULL) + { + String pchString = String(pch); + buffer[index] = pchString.toInt(); + Serial.printf("buffer[%i] = %i \n",index,pchString.toInt()); + index++; + pch = strtok (NULL, del); + } +} + +int clearMemory(String nothing){ + for(int i = 0; i < 2048; i++){ + EEPROM.write(i, 255); + } +} + +int serialPrintMemory(String nothing){ + for(int i = 0; i < 2048; i++){ + Serial.print(EEPROM.read(i)); + Serial.print(" "); + if(i != 0 && i%15 == 0){ + Serial.println(); + } + } +} + +void executeCommand(int commandID, int commandData){ + switch(commandID){ + case 0: + //Turn On All Relays + controller.turnOnAllRelays(); + break; + case 1: + //Turn Off All Relays + controller.turnOffAllRelays(); + break; + case 2: + //Set bank Status + controller.setBankStatus(commandData); + break; + case 3: + //Turn On Relay # + controller.turnOnRelay(commandData); + break; + case 4: + //Turn Off Relay # + controller.turnOffRelay(commandData); + break; + case 5: + //Toggle Relay # + controller.toggleRelay(commandData); + break; + } +} \ No newline at end of file