Adding a photocell
We managed to switch on all the lights
in the apartment and let them switch off again after we have left but
we don't want the lights to switch on while the sun is shining right
into the room. There for we will be adding a photocell preferably to
be mounted in the room with least light conditions. However, if the
light conditions vary to much or the rooms are on different building
sites we might consider of putting in 2 photocells.
Lets start with one photocell:
First we go back to our breadboard and
add a photocell. One end of the photocell connects to the 5V bus and
the other end to the analogue pin 0 of our Arduino board. The pin of
the photocell connecting to the Arduino analogue input, connects also
to a 10 K potentiometer. The centre pin of the potentiometer connects
to GND. The potentiometer we are using to adjust the sensitivity of
our photocell.
OK so far. Now we need to put a few
line of code in our sketch.
This time we start right at the top of
our sketch and add a few variables. We start at
/////////Timer and sensitivity
settings//////////////////////////////////////
and add
unsigned int photoCellCutOff = 280;
//var holding the value where the photocell cuts off
from here we go further down to where
it says
//////////////////////////////////all
the other variables////////////////////////////////
and add
int lightSensor = A0;
//defining the input for the photocell
int sensorValue = 0;
//holding the indicated sensor value of the photocell
and now we go further down to the point
where it says
//////////////////////////////////processing
the input/////////////////////////////////////
right above that line we add
sensorValue = analogRead(lightSensor);
//reading the photocell
//Serial.print("Sensor value:
"); //debug only
//Serial.println(sensorValue); //debug only
and finally we need to implement the
cut off in every room check statement where we have sufficient
daylight to prevent the main lights from coming on during daylight.
There for we go below the line where it
says
///////////////////////////////processing
the input/////////////////////////////////////
if(switchState[0] == 1 &&
lightStatus[14] == 1) { //checking if PIR in Room 1 was
//activated (bed 1)
lightStatus[14] = 0;
//resetting master off
digitalWrite(doorMonitor, LOW);
//resetting the door Monitor LED
}
//>>>>>>>>we
add below here in the if statement <<<<<<<<<<<<<<<<<<<<<<<<<<
if(switchState[1] == 0 &&
sensorValue <= photoCellCutOff) { //checking if S2 priority off
was
//set bed 1
if(switchState[0] == 1 &&
priorityStatus[0] == 0) { //check if the PIR in bed 1 was
//activated and no priority was set
//Serial.println("We
switch in the lights in bedroom 1"); //Debug only
lightOutput[0] = 1;
//switching on the lights – binary
//000000000000000000000001
lightStatus[0] = 1;
//setting the light status for bed 1
lightOutput[14] = 16384;
//make sure the master relay
//stays on
“ && sensorValue <=
photoCellCutOff” we need to add in the same if statement of every
room where we have big windows and we like to prevent the lights from
coming on during daylight. In my case it will be all the bedrooms and
the living area.
If you have to work with 2 photocells,
you got to do the same circuit again and connect it to the second
analogue input of the Arduino board and rename the variables to
unsigned int photoCellCutOff1 = 200;
//var holding the value where the second
//photocell cuts off
int lightSensor1 = A1;
//defining the input for the second photocell
int sensorValue1 = 0;
//holding the indicated sensor value of the
//second photocell
and insert them as described for the
first photocell. You may have noticed, that by now I am typing the
Serial.print statements already commented out. To find the right cut
off for the photocell please uncomment the read out statements and
check in the serial monitor the reading to get a bit of an idea how
to set the cut off point. You still might have to recheck after
installing the ready system since we are measuring resistance and
long, thin cables might increase the resistance so you have to adjust
the cut off a little. You still can change the sensitivity with the
in line potentiometer and if the range is to small you can also try
to increase the potentiometer value from 10 K up to a 100 K.
Adding a maintenance switch
Last, I also like to implement a
maintenance switch. This switch overrides all the priorities,
photocells, PIR's and switches on everything to check light bulbs and
AC functions even the doors are open etc.
Back to the breadboard and there, at
the end of the row with the buttons, we add a toggle switch, connect
the centre pin to the 5 V bus and and one switch side to the fourth
input pin of the third input shift register (CD4024B).
To add the code for the maintenance
switch we start again right at the top of our sketch. Where we
declare the variables, we find again the part where it says
/////////////////////all the other
variables////////////////////////////////////
and add
int maintenancePin = 0;
//defining the var for the maintenance switch
from here we go down to the end of our
input code just above the line
//////////////////////////////////////////checking
the light status////////////////////////////////////
we find the end of the input code and
add
if(switchVar3 & (1 <<
2)) { //checking S19
//Serial.println("Switch
19 was activated."); //debug only
switchState[18] = 1;
}
else {
switchState[18] = 0;
}
//>>>>>>>>>>>>>>>>>we
start adding here<<<<<<<<<<<<<<<<<<<<<<
if(switchVar3 & (1 <<
3)) { //checking S20
//Serial.println("Switch
20 was activated."); //debug only
maintenancePin = 1;
}
else {
maintenancePin = 0;
}
//>>>>>>>>>>>>>>>>>end
of addition<<<<<<<<<<<<<<<<<<<<<<<<
}
//////////////////////////////////////////checking
the light status////////////////////////////////////
Found the entry point again? OK, now we
go down to where we start the output processing and find the line
///////////////////////output////////////////////////////
for(int i=0; i<17; i++) {
/*Serial.print("Light Output
"); //debug only
Serial.print(i);
//debug only
Serial.print(": ");
//debug only
Serial.println(lightOutput[i]);
//debug only
Serial.print("Light status:
"); //debug only
Serial.println(lightStatus[i]);
//debug only
Serial.print("Room Timer: ");
//debug only
Serial.println(roomTimer[i]);
//debug only*/
outputL += lightOutput[i];
}
//>>>>>>>>>>>>>>>>>addition
starts here<<<<<<<<<<<<<<<<<<<<<<<
if(maintenancePin == 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();
//setting all the room timers
}
outputL = 32767;
//setting the output
//binary 0111111111111111
}
//>>>>>>>>>>>>>>>addition
ends here<<<<<<<<<<<<<<<<<<<<<<<<<<
If the maintenance switch is activated,
we want everything on. We loop through all our circuits, set the
timers and the light status and most important the output. The number
32767 we get by adding up all the numbers which go in the
lightOutput[n] array if everything switches on. Remember all the
statements:
if nothing else is set to stop the
lights from coming on
lightOutput[0] = 1;
lightOutput[1] = 2;
lightOutput[2] = 4;
and so on
This are the numbers we have to add up.
For all the ones building and coding
with me and are wondering why the master relay does not come on and
something else instead, I have to apologise because I did a small
mistake in adding binary numbers.
Please check all the statements where
we are making sure that the master relay stays on:
lightOutput[14] = 16348;
<<<<<<<<<<That's wrong!!!!!!!!!!!
Please change to
lightOutput[14] = 16384;
Again, please accept my apologies for
making you work a little more.
In the next chapter I will have a look
into how to connect the unit in the praxis and again the complete
revised code with everything in it, what we have done so far.
No comments:
Post a Comment