#include "LightBank.h"
#include "SensorBank.h"
#define PIR 3
#define lightPinStart 41
#define sensorPinStart 9
#define numberOfSensors 5 //set number of sensors used
#define numberOfLightBanks 5 //set number of light fixtures used
#define delayUnits 's' //'s' for seconds 'm' for minutes
unsigned long lastTime = millis();
unsigned long lastRead = millis();
unsigned long lastPress = millis();
unsigned long timeNow;
byte defaultState[] = {1,1,1,1,0};
byte lastSensorState = 0;
uint8_t delayTime = 7; //System delay time min or sec
bool manualMode = false;
bool lastManualMode = manualMode;
unsigned long manualTimeOn;
unsigned long manualDelayTime = 30*1000;
bool lastState = LOW;
LightBank lightBanks[5];
SensorBank sensorBank;
void setup() {
Serial.begin(115200);
// create light bank objects, setup
for (int i = 0; i< numberOfLightBanks; i++){
lightBanks[i] = LightBank(defaultState[i],lightPinStart+i);
}
//create sensor pin array and sensor bank object
byte sensors[numberOfSensors];
for(int i = 0; i < numberOfSensors; i++){
sensors[i] = sensorPinStart + i;
}
// create the sensor bank object containing all sensors
sensorBank = SensorBank(sensors,delayTime,numberOfSensors,delayUnits);
// Setup buttons to toggle light states
for(int i = 0; i<5; i++){
pinMode(i+4, INPUT);
}
// Setup manual mode button
pinMode(3, INPUT);
}
void loop() {
if(digitalRead(3) && millis()- lastPress > 500){
manualMode = !manualMode;
lastPress = millis();
sensorBank.setManualMode(manualMode);
}
//check if sensor state has changed
if(lastSensorState != sensorBank.motionState()){
lightSwitch(); //execute light switch
} else if(manualMode){
lightSwitch();
}
// determine if buttons have been pressed
for (int i = 0; i<5; i++)
if(digitalRead(i+4) && millis() - lastPress > 500){
lastPress = millis(); //record last button press time
toggleLightBank(i); //toggle specific light activation state
}
}
//turn on lights
void lightsOn(){
for(int i = 0; i< 5; i++){
lightBanks[i].turnOn();
}
if(!sensorBank.motionState()){
sensorBank.setMotion();
lightSwitch();
}
}
//turn off lights
void lightsOff() {
for(int i = 0; i< 5; i++) {
lightBanks[i].turnOff();
}
if(!sensorBank.motionState()){
sensorBank.setMotion();
lightSwitch();
}
}
//switch light activation state to opposite of current value
void toggleLightBank(byte bankNumber){
lightBanks[bankNumber].setActivationState(!lightBanks[bankNumber].getActivationState());
lightSwitch(); //execute light switch
}
// if motion, turn on, if not turn off
void lightSwitch(){
switch(sensorBank.motionState()){
case 1: lightsOn();
break;
case 0: lightsOff();
}
//update latest sensor state
lastSensorState = sensorBank.motionState();
}