Again a suggestion from Rene to change
the way the input is handled. First we have to go to the top of the
declaration part and add a couple of definitions:
/////////////////////Includes///////////////////////////// #include <DS1307RTC.h> #include <Time.h> #include <Wire.h> #include <ShiftLCD.h> #include <avr/pgmspace.h> //>>>>>>>>>>>>>Addition starts here<<<<<<<<<<<<< #define ON 1 // (RRKM-01) The switch is in ON state #define OFF 0 // (RRKM-01) The switch is in OFF state //>>>>>>>>>>>>>Addition ends here<<<<<<<<<<<<<
From here we move down to the main loop
in to the “////////////loop through the 8 input pins to check their
status////////////” section and there we replace the whole section.
////////////loop through the 8 input pins to check their status//////////// //>>>>>>>>>>>>>Replacement starts here<<<<<<<<<<<<< //shift register 1 if(switchVar1 & (1 << 0)) { //checking S1 //Serial.println("Switch 1 was activated."); //debug only switchState[0] = 1; } else { switchState[0] = 0; } if(switchVar1 & (1 << 1)) { //checking S2 //Serial.println("Switch 2 was activated."); //debug only switchState[1] = 1; } else { switchState[1] = 0; } if(switchVar1 & (1 << 2)) { //checking S3 //Serial.println("Switch 3 was activated."); //debug only switchState[2] = 1; } else { switchState[2] = 0; } if(switchVar1 & (1 << 3)) { //checking S4 //Serial.println("Switch 4 was activated."); //debug only switchState[3] = 1; } else { switchState[3] = 0; } if(switchVar1 & (1 << 4)) { //checking S8 //Serial.println("Switch 8 was activated."); //debug only switchState[7] = 1; } else { switchState[7] = 0; } if(switchVar1 & (1 << 5)) { //checking S7 //Serial.println("Switch 7 was activated."); //debug only switchState[6] = 1; } else { switchState[6] = 0; } if(switchVar1 & (1 << 6)) { //checking S6 //Serial.println("Switch 6 was activated."); //debug only switchState[5] = 1; } else { switchState[5] = 0; } if(switchVar1 & (1 << 7)) { //checking S5 //Serial.println("Switch 5 was activated."); //debug only switchState[4] = 1; } else { switchState[4] = 0; } //shift register 2 if(switchVar2 & (1)) { //checking S9 //Serial.println("Switch 9 was activated."); //debug only switchState[8] = 1; } else { switchState[8] = 0; } if(switchVar2 & (1 << 1)) { //checking S10 //Serial.println("Switch 10 was activated."); //debug only switchState[9] = 1; } else { switchState[9] = 0; } if(switchVar2 & (1 << 2)) { //checking S11 //Serial.println("Switch 11 was activated."); //debug only switchState[10] = 1; } else { switchState[10] = 0; } if(switchVar2 & (1 << 3)) { //checking S12 //Serial.println("Switch 12 was activated."); //debug only switchState[11] = 1; } else { switchState[11] = 0; } if(switchVar2 & (1 << 4)) { //checking S16 //Serial.println("Switch 16 was activated."); //debug only switchState[15] = 1; } else { switchState[15] = 0; } if(switchVar2 & (1 << 5)) { //checking S15 //Serial.println("Switch 15 was activated."); //debug only switchState[14] = 1; } else { switchState[14] = 0; } if(switchVar2 & (1 << 6)) { //checking S14 //Serial.println("Switch 14 was activated."); //debug only switchState[13] = 1; } else { switchState[13] = 0; } if(switchVar2 & (1 << 7)) { //checking S13 //Serial.println("Switch 13 was activated."); //debug only switchState[12] = 1; } else { switchState[12] = 0; } //shift register 3 if(switchVar3 & (1)) { //checking S17 //Serial.println("Switch 17 was activated."); //debug only switchState[16] = 1; } else { switchState[16] = 0; } if(switchVar3 & (1 << 1)) { //checking S18 //Serial.println("Switch 18 was activated."); //debug only switchState[17] = 1; } else { switchState[17] = 0; } if(switchVar3 & (1 << 2)) { //checking S19 //Serial.println("Switch 19 was activated."); //debug only switchState[18] = 1; } else { switchState[18] = 0; } if(switchVar3 & (1 << 3)) { //checking S20 //Serial.println("Switch 20 was activated."); //debug only maintenancePin = 1; } else { maintenancePin = 0; } if(switchVar3 & (1 << 4)) { //checking S21 //Serial.println("Switch 20 was activated."); //debug only switchState[20] = 1; } else { switchState[20] = 0; } if(switchVar3 & (1 << 5)) { //checking S22 //Serial.println("Switch 21 was activated."); //debug only switchState[21] = 1; } else { switchState[21] = 0; } if(switchVar3 & (1 << 6)) { //checking S23 //Serial.println("Switch 22 was activated."); //debug only switchState[22] = 1; } else { switchState[22] = 0; } //////////////Debug Statements////////////////////////////////// #ifdef DA_DEBUG for(int c=0; c<22; c++){ Serial.print("Switch state: "); Serial.print(c); Serial.print(" / "); Serial.println(switchState[c]); delay(500); } #endif //>>>>>>>>>>>>>>Replacement ends here<<<<<<<<<<<<<
with the code below:
// (RRKM-01) shift register 1 switchState[0] = IIFi((switchVar1 & (1)), ON, OFF); //checking S1 switchState[1] = IIFi((switchVar1 & (1 << 1)), ON, OFF); //checking S2 switchState[2] = IIFi((switchVar1 & (1 << 2)), ON, OFF); //checking S3 switchState[3] = IIFi((switchVar1 & (1 << 3)), ON, OFF); //checking S4 switchState[7] = IIFi((switchVar1 & (1 << 4)), ON, OFF); //checking S5 switchState[6] = IIFi((switchVar1 & (1 << 5)), ON, OFF); //checking S6 switchState[5] = IIFi((switchVar1 & (1 << 6)), ON, OFF); //checking S7 switchState[4] = IIFi((switchVar1 & (1 << 7)), ON, OFF); //checking S8 // (RRKM-01) shift register 2 switchState[8] = IIFi((switchVar2 & (1)), ON, OFF); //checking S9 switchState[9] = IIFi((switchVar2 & (1 << 1)), ON, OFF); //checking S10 switchState[10] = IIFi((switchVar2 & (1 << 2)), ON, OFF); //checking S11 switchState[11] = IIFi((switchVar2 & (1 << 3)), ON, OFF); //checking S12 switchState[15] = IIFi((switchVar2 & (1 << 4)), ON, OFF); //checking S13 switchState[14] = IIFi((switchVar2 & (1 << 5)), ON, OFF); //checking S14 switchState[13] = IIFi((switchVar2 & (1 << 6)), ON, OFF); //checking S15 switchState[12] = IIFi((switchVar2 & (1 << 7)), ON, OFF); //checking S16 // (RRKM-01) shift register 3 switchState[16] = IIFi((switchVar3 & (1)), ON, OFF); //checking S17 switchState[17] = IIFi((switchVar3 & (1 << 1)), ON, OFF); //checking S18 switchState[18] = IIFi((switchVar3 & (1 << 2)), ON, OFF); //checking S19 switchState[19] = IIFi((switchVar3 & (1 << 3)), ON, OFF); //checking S20 switchState[20] = IIFi((switchVar3 & (1 << 4)), ON, OFF); //checking S21 switchState[21] = IIFi((switchVar3 & (1 << 5)), ON, OFF); //checking S22 switchState[22] = IIFi((switchVar3 & (1 << 6)), ON, OFF); //checking S23 //////////////Debug Statements////////////////////////////////// #ifdef DA_DEBUG_in // (RRKM-01) Only when debugging for(int x=0; x<23; x++) { Serial.println( "Status of Switch S" + String(x+1) + ": " + IIFs((switchState[x] == ON), "ON", "OFF" ) ); } #endif //////////////////checking the light status//////////////////////
To make it work we also have to add to
functions IIFs() and IIFi(). But since we also have a few other
things to change, we do this last not to jump up and down in the
code. You may have noticed, that I removed the maintenancePin
variable and replaced it with switchState[19]. That means, we do not
need the variable any more and can delete it in the declaration part.
We also need to update the part where it is used. There fore we go
down towards end of the main loop and find the part and change
outputL += lightOutput[i]; //adding up the numbers } if(maintenancePin == 1) { //<<<<<<<<<REPLACE with switchState[19]<<<<<<<< for(int i=1; i>17; i++){ //loop through all circuits lightStatus[i] = 1; //setting the light status of everything roomTimer[i] = millis()/1000; //setting all the room timers } outputL = 32767; //setting the output //binary 0111111111111111 } lcd.setCursor(0,0); lcd.print(outputL, BIN);
so it reads after
outputL += lightOutput[i]; //adding up the numbers } if(switchState[19] == 1) { //if maintenance switch is active for(int i=1; i>17; i++){ //loop through all circuits lightStatus[i] = 1; //setting the light status of everything roomTimer[i] = millis()/1000; //setting all the room timers } outputL = 32767; //setting the output //binary 0111111111111111 } lcd.setCursor(0,0); lcd.print(outputL, BIN);
Why we are here, I have noticed the
other day that the outside lights do not come on with the maintenance
switch and this is simple due to the fact that I forgot to add the
integer value of bit 16 to the output value. Please add 32768 to the
outputL value where we check switchState[19] so it reads after
outputL = 65535; //which reads as binary 1111111111111111
Now we have to go back up a little to
the beginning of the “holiday timer” section. Remember, in the
menu post 8 we added the corridor (room 10) in to the possible
schedule. When we check the photocell to see if the light level is OK
to switch on the lights, we are looping only through 9 rooms.
Let's correct it and find the following
part:
photocellSwitch = getSensorValue(sensorValue, photoCellCutOff, photoCellCutOn, photocellSwitchOld); photocellSwitchOld = photocellSwitch; //allowing the lights to switch on between 17:00 and 23:00 h if(photocellSwitch == 1 && currentHour >= 17 && currentHour <= 23) { for(int i=0; i<9; i++){ //<<<<<<<<<<<<<Replace 9 with 10<<<<<<<<<<<<< lightLevel[i] = 1; } lightLevel[15] = 1; } //allowing the lights to switch on between 00:00 and 08:00 h else if(photocellSwitch == 1 && currentHour >= 0 && currentHour <= 8){ for(int i=0; i<9; i++){ //<<<<<<<<<<<<<Replace 9 with 10<<<<<<<<<<<<< lightLevel[i] = 1; } lightLevel[15] = 1; } //make sure the lights switch off on sunrise during morning hours else if(photocellSwitch == 0 && currentHour >= 5 && currentHour <= 8){ for(int c=0; c<17; c++){ lightLevel[c] = 0; } } #ifdef DA_DEBUG_photo Serial.print("Photo cell switch: "); Serial.println(photocellSwitch); for(int c=0; c<17; c++){ Serial.print("Light level "); Serial.print(c); Serial.print(" :"); Serial.println(lightLevel[c]); } #endif //////////////Holiday lighting/////////////////////////
so this part reads after correction:
photocellSwitch = getSensorValue(sensorValue, photoCellCutOff, photoCellCutOn, photocellSwitchOld); photocellSwitchOld = photocellSwitch; //allowing the lights to switch on between 17:00 and 23:00 h if(photocellSwitch == 1 && currentHour >= 17 && currentHour <= 23) { for(int i=0; i<10; i++){ lightLevel[i] = 1; } lightLevel[15] = 1; } //allowing the lights to switch on between 00:00 and 08:00 h else if(photocellSwitch == 1 && currentHour >= 0 && currentHour <= 8){ for(int i=0; i<10; i++){ lightLevel[i] = 1; } lightLevel[15] = 1; } //make sure the lights switch off on sunrise during morning hours else if(photocellSwitch == 0 && currentHour >= 5 && currentHour <= 8){ for(int c=0; c<17; c++){ lightLevel[c] = 0; } } #ifdef DA_DEBUG_photo Serial.print("Photo cell switch: "); Serial.println(photocellSwitch); for(int c=0; c<17; c++){ Serial.print("Light level "); Serial.print(c); Serial.print(" :"); Serial.println(lightLevel[c]); } #endif //////////////Holiday lighting/////////////////////////
As to days final the two functions
needed for the new code to work.
///////////////////some easy inline logical functions//////////////////////////////////// int IIFi( boolean iLogicalValue, int iWhenTrue, int iWhenFalse ) { if (iLogicalValue) return iWhenTrue; else return iWhenFalse; } String IIFs( boolean iLogicalValue, String iWhenTrue, String iWhenFalse ) { if (iLogicalValue) return iWhenTrue; else return iWhenFalse; }
Hey Dieter,
ReplyDeleteIn IIFi and IIFs => if (iLogicalValue)...
shoud read => if (iLogicalValue == true)...
We discussed this last weekend
Cheers, Rene
Hi Rene,
ReplyDeletesorry for the late reply, but I was pretty busy this week and I didn't look that much into my comments.
Your actual code was ok, it worked. The problem was again in the debug statement:
#ifdef DA_DEBUG_in // (RRKM-01) Only when debugging
for(int x=0; x<23; x++) {
Serial.println( "Status of Switch S" + String(x+1) + ": " +
IIFs((switchState[x] == ON), "ON", "OFF" ) //<<<<<<<< IIFs((switchState[x] = ON), ....
);
}
#endif
Instead of checking If the switch state is set to on (==) we where setting it to on (=) and that's why the debug information came all out wrong. And being everything set to on after debug nothing was working as it should have...