Added Time Activation Example

Added example file to turn relays on or off based on time of day.
This commit is contained in:
telliottosceola 2016-01-20 12:44:23 -06:00
parent d351d88489
commit b63cc6e213

View file

@ -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;
}
}