Translate

Friday, 14 March 2014

Room Management System – Coding the output


About bits, bytes and binary

As previously mentioned, we are working with bit, bytes and binary to make our room management system work. A quick review, 1 byte holds 8 bits and 1 bit can store 1 single digit. The shift registers we are using have 8 in- or output pins. Every in- or output pin is allowed to use one bit of data.
Computer chips or microprocessor, also commonly known are pretty dumb. They only know what we are telling them in a very simple form – 0 and 1 of on and off. That's where our binary numbers come in. Binary code or numbers consisting only of 0's and 1's what we again use to read the data the input shift registers are giving us or to send the data to the output shift register.
The only trick is now to find the position which has to be set to 1 or 0 to switch the right LED or relay on or off. The normal state of our shift register pins will be 0 and we have 8 of them. A input shifter will send us 00000000 unless we give a input to one of the pins. Output shifter will be set off unless we are sending a 1 to the shift register. Now we want to control which pin is set to on. There for we have to know our binary numbers. Since I have explained this subject already with the input coding, we only have a little bit a closer look at controlling the output shifters.
Please recheck with the data sheet of the shift register you are using about any of the following pin names, position and numbering. On a 8 bit shift register the pins are usually numbered from 1 to 8 or 0 to 7. As usual, we have to pay a little more attention to numbering starting with 0. I'll be referring to pins at there position like first, second, third ….
If we want to address the first pin of our shift register we need to send the number 1 which reeds in a 8 bit binary 00000001.
Since we are working with 2 shift register, we double the output pins and also the the storage we have to address to working on 16 bits the first output pin of our daisy chained shift registers is also the pin 1 in the chain of shift registers 0000000000000001.
To address the second pin in our chain we need to send the number 2 controlling the second pin of the first shift register in the chain and converts in binary to 0000000000000010.
To cut a long story short, I made a small table with integer to binary conversion and which pin in our chain will be addressed.

1..........0000000000000001..........first output pin..........first shift register
2..........0000000000000010..........second output pin.....first shift register
4..........0000000000000100..........third output pin........ first shift register
8..........0000000000001000..........fourth output pin......first shift register
16........0000000000010000..........fifth output pin.........first shift register
32........0000000000100000..........sixth output pin........first shift register
64....... 0000000001000000..........seventh output pin....first shift register
128..... 0000000010000000..........eight output pin........first shift register
------------------------------------------------------------------------------------------
256......0000000100000000..........first output pin..........second shift register
512......0000001000000000..........second output pin.....second shift register
1024....0000010000000000..........third output pin.........second shift register
2048... 0000100000000000..........fourth output pin......second shift register
4096....0001000000000000..........fifth output pin.........second shift register
8192....0010000000000000..........sixth output pin........second shift register
16384..0100000000000000..........seventh output pin...second shift register
32768..1000000000000000..........eight output pin........second shift register

For everybody needing a small refresher how binary works. The next place in a binary represents always the double integer of the current place. Check back on the above table. The first place in a binary is a 1. The second place is a 2, double of 1. The third place is a 4, double of 2. The fourth place is a 8, double of 4 and so on.
If we want to address pin 4 of the first shift register and pin 2 of the second shift register we would need to send the following binary 0000001000001000 or take the equivalent integer of each pin which would be for pin 4 first shift register a 8 and for pin 2 second shift register a 512 and simply add them together like 8 add 512 equals 520 and converts in binary back to 0000001000001000.
That's what we will be using for the out put code. If you recheck the processing part and have a look at the lightOutput[n] = x; statement, you will notice that starting from room 1 the statement will read lightOutput[0] = 1; //switching on the lights or
lightOutput[0] = 0; //switching off the lights and
at room 2
lightOutput[1] = 2; //switching on the lights or
lightOutput[1] = 0; //switching off the lights and
for room 3
lightOutput[2] = 4; //switching on the lights or
lightOutput[2] = 0; //switching off the lights and
for room 4
lightOutput[3] = 8; //switching on the lights or
lightOutput[3] = 0; //switching off the lights
and so on.

Now we only need to add up the numbers held in the lightOutput array, convert the result to binary and send it to the output shift register chain.

Here we go. Again we find the end of our main loop:

if(mainOff == 0) {                                                           //master off command is 0
Serial.println("switching off everything and reset all");       //debug only
for(int i=0; i<12; i++) {                                                   //looping through the circuits
lightStatus[i] = 0;                                                            //resetting all light status
lightOutput[i] = 0;                                                          //switching off all lights
priorityStatus[i] = 0;                                                      //resetting all set priorities
roomTimer[i] = 0;                                                          //resetting all room timers
}
digitalWrite(doorMonitor, LOW);                                 //resetting the control LED
mainOff = 1;                                                                 //resetting master off command
}
}
masterSwitchStateOld = switchState[18];                      //setting the switchState to old

//>>>>>>>>>>>>>>>we start adding here<<<<<<<<<<<<<<<<<<<

//////////////////////////Output Stage//////////////////////////////////////////////////////////

for(int i=0; i<17; i++) {                                          //loop through the light output array
//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];                                      //adding up the numbers
}

//Serial.print("Output value: ");                                //debug only
//Serial.print(outputL);                                            //debug only
//Serial.print(" ");                                                    //debug only
//Serial.println(outputL, BIN);                                //debug only
digitalWrite(latchPinOut, LOW);                            //setting the latch pin to low to
                                                                             //be able to send the data
shiftOut(dataPinOut, clockPinOut, MSBFIRST, (outputL >> 8));   //sending the date for the
                                                                             //second shift register
shiftOut(dataPinOut, clockPinOut, MSBFIRST, outputL);             //sending the data for the
                                                                                                    //first shift register
digitalWrite(latchPinOut, HIGH);                                                  //setting the latch pin back to
                                                                                                    //high to finish the data transmission
outputL = 0;                                                                                 //setting the var holding the output
                                                                                                    //number back to 0
delay(sensitivity);                                                                          //delay to adjust how responsive the
                                                                                                    //system will react

}
//>>>>>>>>>>>>>>end of main loop<<<<<<<<<<<<<<<<<<<<<<

All set, now we have to add a couple of variables again. All the way up to the part where we are declaring our variables and there we find again the part where it says

/////////////////time and sensitivity settings//////////////////////////////////////////

here we add:

unsigned int sensitivity = 500;                                       //should be between 200 and 1000 as
                                                                                   //lower the number as more responsive
                                                                                   //the system will be

now we move down to the line where it says

////////////////////////////all the other variables///////////////////////////////
unsigned long delayTime[16] = {dBed1, dBed2, dBed3, dLiving, dBath1, dBath2, dBath3,
dBath4, dKitchen, dCorridor, dAC1, dAC2, dAC3, dAC4,
dMaster, 0};

and here we add

unsigned long outputL = 0;                                         //variable to hold the output

We are nearly done for today. If you are testing your sketch now, you might notice a warning in the progress window of your Arduino IDE saying something like memory low and system might get unstable. If everything is working, start commenting out the Serial.print statements which are in for debugging only anyway and to follow the work flow of the sketch.

In the next chapter we stop lights from coming on while there is bright daylight in a room and we will also implement a maintenance switch to switch on everything any time to check bulbs, AC-functions etc.


No comments:

Post a Comment