Translate

Friday, 16 May 2014

Room Management System – The Menu – part 7


First thing today, we add the last sub menu controlling the room lights. As mentioned in the last post, corridors are usually centralised little rooms connecting everything else with no windows what so ever. There fore it's no real use, using up space in programming timers for it, which are not used anyway. However, I did activate the option to adjust the delay timer for normal operation.
Let's go to the end of the selectMenu() function to the last mark “} //submenu end” and add the following bit of code just below:

if(menuOption == 16){ //and menu option is 16 (room 10)

subButton = 0; //resetting the button var

submenu = 1; //submenu counter

lcd.clear(); //clear screen

//retrieving and printing first sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[0]))));

lcd.print("10"); //printing assigned room number 10

while(submenu < submenus){ //loop through the sub menu points

subButton = read_act_buttons(); //checking for pressed buttons

if(subButton == btnMenu){ //if button Menu was pressed

submenu++; //add 1 - move to the next sub menu point

if(submenu == 2){ //if we are at sub menu 2

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[1]))));

lcd.print("10"); //printing assigned room number 10

lcd.setCursor(0, 1); //set cursor second row, first column

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0])))); //print NOT USED

}

if(submenu == 3){ //if we are at sub menu 3

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[2]))));

lcd.print("10"); //printing assigned room number 10

lcd.setCursor(0, 1); //set cursor second row, first column

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0])))); //print NOT USED

}

if(submenu == 4){ //if we are at sub menu 4

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[3]))));

lcd.print("10"); //printing assigned room number 10

lcd.setCursor(0, 1); //set cursor second row, first column

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0])))); //print NOT USED

}

if(submenu == 5){ //if we are at sub menu 5

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[4]))));

lcd.print("10"); //printing assigned room number 10

lcd.setCursor(0, 1); //set cursor second row, first column

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0])))); //print NOT USED

}

if(submenu == 6){ //if we are at sub menu 6

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[5]))));

lcd.print("10"); //printing assigned room number 10

lcd.setCursor(0, 1); //set cursor second row, first column

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0])))); //print NOT USED

}

if(submenu == 7){ //if we are at sub menu 7

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[6]))));

lcd.print("10"); //printing assigned room number 10

lcd.setCursor(0, 1); //set cursor second row, first column

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0])))); //print NOT USED

}

}

if(subButton == btnSelect){ //if we pressed btnSelect

if(submenu == 1){ //and submenu is 1

//call the function get_delay() to change the setting

delayTime[9] = get_delay(9, 10, dLiving);

return;

}

if(submenu == 2) return;

if(submenu == 3) return;

if(submenu == 4) return;

if(submenu == 5) return;

if(submenu == 6) return;

if(submenu == 7) return;

}

}

} //submenu end

Since we do not address any timers at this point, where variables have to be passed back in the get_setTime() function, we can skip this process for room 10. We will take care of this a little later, when we do the preparations for storing and reading variables from EEPROM.

Let's start again with some housekeeping. When I did the timers for the automated light operation while nobody is at home, I had a project in mind I am currently working on. However, at this state I would like to make the unit as universal to use as any possible. In conjunction with the preparation of using the EEPROM memory for the variable storage, the variables for the room timers go into a 3 dimensional array room_timers[room][timer][time]. Room is holding the assigned room number minus 1 since we start counting the rooms with 1 and in an array the count always starts with 0. The same goes for the timer. Since we are just implementing this partition, we start the timer count with 0, same as the array count and the 4 parts of the time settings, hour on, minute on, hour off and minute off. To make it a bit more flexible, I extended the timers to 4 for the main room like bed rooms and the living area. The bathrooms and the corridor is having two timers and for the kitchen we make it 2.

The first thing we do is building our array and add it to the declaration part of the sketch.

//////////////////////holiday timer settings//////////////////////

////////////Room 1 (Bed 1) ///////////

byte room1MActive = 1; //Set to 1 if you want to process

//Timer will be ignored when set to 0

byte room1O1Active = 1; //Set to 1 if you want to process

//Timer will be ignored when set to 0

byte room102Active = 1; //Set to 1 if you want to process

byte room103Active = 0;

////////////Room 2 (Bed 2) ///////////

byte room2MActive = 1; //Set to 1 if you want to process

//Timer will be ignored when set to 0

byte room201Active = 1; //Set to 1 if you want to process

byte room202Active = 0;

byte room203Active = 0

////////////Room 3 (Bed 3) ///////////

byte room3MActive = 1; //Set to 1 if you want to process

byte room301Active = 1; //Set to 1 if you want to process

byte room302Active = 1; //Set to 1 if you want to process

byte room303Active = 1; //Set to 1 if you want to process

///////////Room 4 {Living)

byte room4MActive = 0;

byte room401Active = 1; //Set to 1 if you want to process

byte room402Active = 0;

byte room403Active = 0;

//////////Room 5 (bath 1)//////////

byte room5MActive = 1; //Set to 1 if you want to process

byte room501Active = 1; //Set to 1 if you want to process

//////////Room 6 (bath 2)//////////

byte room6MActive = 1; //Set to 1 if you want to process

byte room601Active = 1; //Set to 1 if you want to process

//////////Room 7 (bath 3)//////////

byte room7MActive = 1; //Set to 1 if you want to process

byte room701Active = 1; //Set to 1 if you want to process

//Timer will be ignored when set to 0

//////////Room 8 (bath 4)//////////

byte room8MActive = 1; //Set to 1 if you want to process

byte room801Active = 0;

//////////Room 9 (Kitchen)//////////

byte room9MActive = 1; //Set to 1 if you want to process

byte room901Active = 1; //Set to 1 if you want to process

//////////Room 10 (corridor)///////

byte room10MActive = 0;

byte room1001Active = 0;

//Timer Settings room, timer, hour on, minute on, hour off, minute off

byte room_timers[10][4][4] = {

{

{5, 35, 6, 5}, //room 1 timer 1

{19, 35, 20, 15}, //room 1 timer 2

{21, 5, 21, 15}, //room 1 timer 3

{0, 0, 0, 0} //room 1 timer 4

},

{

{6, 30, 6, 50}, //room 2 timer 1

{19, 30, 20, 10}, //room 2 timer 2

{0, 0, 0, 0}, //room 2 timer 3

{0, 0, 0, 0} //room 2 timer 4

},

{

{5, 50, 6, 20}, //room 3 timer 1

{18, 10, 18, 25}, //room 3 timer 2

{19, 15, 19, 40}, //room 3 timer 3

{23, 20, 23, 35} //room 3 timer 4

},

{

{0, 0, 0, 0}, //room 4 timer 1

{17, 30, 23, 30}, //room 4 timer 2

{0, 0, 0, 0}, //room 4 timer 3

{0, 0, 0, 0} //room 4 timer 4

},

{

{5, 40, 5, 45}, //room 5 timer 1

{19, 55, 20, 10}, //room 5 timer 2

{0, 0, 0, 0}, //not used

{0, 0, 0, 0} //not used

},

{

{6, 35, 6, 45}, //room 6 timer 1

{19, 50, 20, 5}, //room 6 timer 2

{0, 0, 0, 0}, //not used

{0, 0, 0, 0} //not used

},

{

{6, 5, 6, 25}, //room 7 timer 1

{22, 50, 23, 15}, //room 7 timer 2

{0, 0, 0, 0}, //not used

{0, 0, 0, 0} //not used

},

{

{0, 0, 0, 0}, //room 8 timer 1

{22, 5, 22, 20}, //room 8 timer 2

{0, 0, 0, 0}, //not used

{0, 0, 0, 0} //not used

},

{

{5, 50, 6, 45}, //room 9 timer 1

{17, 45, 18, 30}, //room 9 timer 2

{0, 0, 0, 0}, //room 9 timer 3

{0, 0, 0, 0} //not used

},

{

{0, 0, 0, 0}, //room 10 timer 1

{0, 0, 0, 0}, //room 10 timer 2

{0, 0, 0, 0}, //not used

{0, 0, 0, 0} //not used

}

};

///////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////DO NOT MODIVY BELOW HERE///////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////

I think looking at the comments, it is pretty clear what belongs to what. But you may have noticed the changes in the part above the array. Since we put all the times in the new array, we don't need the single declarations any more and we can delete them.

////////////Room 1 (Bed 1) ///////////

byte room1MActive = 1; //Set to 1 if you want to process

//Timer will be ignored when set to 0

byte room1OnM[2] = {5, 35}; //>>>>>>>>>>>>>DELETE<<<<<<<<<<<<

byte room1OffM[2] = {6, 5}; //>>>>>>>>>>>>>DELETE<<<<<<<<<<<<

byte room1O1Active = 1; //Set to 1 if you want to process

//Timer will be ignored when set to 0

byte room1On1[2] = {19, 35}; //>>>>>>>>>>>>>DELETE<<<<<<<<<<<<

byte room1Off1[2] = {20, 15}; //>>>>>>>>>>>>>DELETE<<<<<<<<<<<<

byte room102Active = 1; //Set to 1 if you want to process

//Timer will be ignored when set to 0

byte room1On2[2] = {21, 5}; //>>>>>>>>>>>>>DELETE<<<<<<<<<<<<

byte room1Off2[2] = {21, 15}; //>>>>>>>>>>>>>DELETE<<<<<<<<<<<<

The same goes for the other rooms. We delete this statements until the code looks like the one above the room_timers[] array.

Since we add the corridor to the room timers, we need to add another variable. We move down to “////RTC and Holiday switch timers///”

/////////////////////////////RTC and Holiday switch timers///////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////

tmElements_t tm; //initializing RTC

byte room1Lights = 0; //var to hold the on command for room light

byte room2Lights = 0; //var to hold the on command for room light

byte room3Lights = 0; //var to hold the on command for room light

byte room4Lights = 0; //var to hold the on command for room light

byte room5Lights = 0; //var to hold the on command for room light

byte room6Lights = 0; //var to hold the on command for room light

byte room7Lights = 0; //var to hold the on command for room light

byte room8Lights = 0; //var to hold the on command for room light

byte room9Lights = 0; //var to hold the on command for room light

//>>>>>>>>>>>>>Add the line below<<<<<<<<<<<<<

byte room10Lights = 0; //var to hold the on command for room light

byte currentHour = 0; //var holding the time (hour 0-23)

byte currentMinute = 0; //var holding the time (minute 0-59)

byte currentDay = 0; //var holding the date (day 1-31)

byte currentDoM = 0; //var holding the weekday (Sun - Sat, 1-7)

byte currentMonth = 0; //var holding the date (month 1-12)

int currentYear = 0; //var holding the year (based on Unix time)

Next, we are adding the missing timers to the submenu. There fore we jump down to the “menu and user interface” section in the declaration part.

//storing the sub menu points in the program memory

prog_char submenu_0[] PROGMEM = "PIR delay R";

prog_char submenu_1[] PROGMEM = "HT1 Active R";

prog_char submenu_2[] PROGMEM = "Timer 1 R";

prog_char submenu_3[] PROGMEM = "HT2 Active R";

prog_char submenu_4[] PROGMEM = "Timer 2 R";

prog_char submenu_5[] PROGMEM = "HT3 Active R";

prog_char submenu_6[] PROGMEM = "Timer 3 R";

//>>>>>>>>>>>>>Addition starts here<<<<<<<<<<<<<<

prog_char submenu_7[] PROGMEM = "HT4 Active R";

prog_char submenu_8[] PROGMEM = "Timer 4 R";

//>>>>>>>>>>>>>Addition Ends here<<<<<<<<<<<<<<

PROGMEM const char *submenu_table[] = {

submenu_0,

submenu_1,

submenu_2,

submenu_3,

submenu_4,

submenu_5,

submenu_6,

//>>>>>>>>>>>>>Addition start here<<<<<<<<<<<<<

submenu_7,

submenu_8

//>>>>>>>>>>>>>Addition ends here<<<<<<<<<<<<<

};

void setup() {

//////////////Start Serial for Debugging/////////////////////

//Serial.begin(9600);

Now, we go down into the main loop again, where we are processing the Holiday lighting. We go down further just a bit to Room 1 (bed 1). If we look at the following to statements, we notice, that we are passing the variables, we just deleted in our declaration part. Here and at all the following statements where we check the room timers, we need to change the variables, so they match the 3-dimensional array we newly implemented.

//////////////Holiday lighting/////////////////////////

if(switchState[20] == 1) { //check if the holiday switch

//is activated

lightOutput[14] = 0; //make sure the master relay is off

//Serial.print("Current date: ");

//Serial.print(days[currentDay - 1]);

//Serial.print(", ");

//Serial.print(currentDoM);

//Serial.print("/");

//Serial.print(currentMonth);

//Serial.print("/");

//Serial.println(currentYear);

//Serial.print("Current Time: ");

//Serial.print(currentHour);

//Serial.print(" : ");

//Serial.println(currentMinute);

//Serial.print("Photo cell switch: ");

//Serial.println(photocellSwitch);

//Serial.print("Light level room 1 after: ");

//Serial.println(lightLevel[0]);

//Serial.print("photocell switch: ");

//Serial.println(photocellSwitch);

//Serial.print("Light level room 3 after: ");

//Serial.println(lightLevel[2]);

//Serial.print("Light level room 4 after: ");

//Serial.println(lightLevel[3]);

///////Room 1 (Bed 1) /////////////

if(room1MActive == 1 && currentHour >= room1OnM[0] &&

//changes to

if(room1MActive == 1 && currentHour >= room_timers[0][0][0] &&

//and

currentHour <= (room1OffM[0] + 1)){ //checking if we came passed

//changes to

currentHour <= (room_timers[0][0][2] + 1)){ //checking if we came passed

//the hour where the lights

//to be switched on

//and

//checking the times

room1Lights = checkOnTime(room1OnM[0], room1OnM[1],

//changes to

room1Lights = checkOnTime(room_timers[0][0][0], room_timers[0][0][1],

//and

room1OffM[0], room1OffM[1]);

//changes to

room_timers[0][0][2], room_timers[0][0][3]);

}

The complete revised statement for room1, timer 0 reads now:

if(room1MActive == 1 && currentHour >= room_timers[0][0][0] &&

currentHour <= (room_timers[0][0][2] + 1)){ //checking if we came passed

//the hour where the lights

//to be switched on

//checking the times

room1Lights = checkOnTime(room_timers[0][0][0], room_timers[0][0][1],

room_timers[0][0][2], room_timers[0][0][3]);

}

Here we go, we have to do this for every timer in every room. I guess, you can deal with the updates all the way through. Anyway, here is the part we just updated.

//////////////Holiday lighting/////////////////////////

if(switchState[20] == 1) { //check if the holiday switch

//is activated

lightOutput[14] = 0; //make sure the master relay is off

//Serial.print("Current date: ");

//Serial.print(days[currentDay - 1]);

//Serial.print(", ");

//Serial.print(currentDoM);

//Serial.print("/");

//Serial.print(currentMonth);

//Serial.print("/");

//Serial.println(currentYear);

//Serial.print("Current Time: ");

//Serial.print(currentHour);

//Serial.print(" : ");

//Serial.println(currentMinute);

//Serial.print("Photo cell switch: ");

//Serial.println(photocellSwitch);

//Serial.print("Light level room 1 after: ");

//Serial.println(lightLevel[0]);

//Serial.print("photocell switch: ");

//Serial.println(photocellSwitch);

//Serial.print("Light level room 3 after: ");

//Serial.println(lightLevel[2]);

//Serial.print("Light level room 4 after: ");

//Serial.println(lightLevel[3]);

///////Room 1 (Bed 1) /////////////

if(room1MActive == 1 && currentHour >= room_timers[0][0][0] &&

currentHour <= (room_timers[0][0][2] + 1)){ //checking if we came passed

//the hour where the lights

//to be switched on

//checking the times

room1Lights = checkOnTime(room_timers[0][0][0], room_timers[0][0][1],

room_timers[0][0][2], room_timers[0][0][3]);

}

if(room1O1Active == 1 && currentHour >= room_timers[0][1][0] &&

currentHour <= (room_timers[0][1][2] + 1)){ //checking if we came passed

//the hour where the lights

//to be switched on

//checking the times

room1Lights = checkOnTime(room_timers[0][1][0], room_timers[0][1][1],

room_timers[0][1][2], room_timers[0][1][3]);

}

if(room102Active == 1 && currentHour >= room_timers[0][2][0] &&

currentHour <= (room_timers[0][2][2] + 1)){ //checking if we came passed

//the hour where the lights

//to be switched on

//checking the times

room1Lights = checkOnTime(room_timers[0][2][0], room_timers[0][2][1],

room_timers[0][2][2], room_timers[0][2][3]);

}

if(room103Active == 1 && currentHour >= room_timers[0][3][0] &&

currentHour <= (room_timers[0][3][2] + 1)){ //checking if we came passed

//the hour where the lights

//to be switched on

//checking the times

room1Lights = checkOnTime(room_timers[0][3][0], room_timers[0][3][1],

room_timers[0][3][2], room_timers[0][3][3]);

}

if(room1Lights == 1 && lightLevel[0] == 1){ //if with in the on time

lightOutput[0] =1; //switch on the lights

}

else {

lightOutput[0] = 0; //other keep them off

lightLevel[0] = 0;

}

////////Room 2 (Bed 2)//////////////

if(room2MActive ==1 && currentHour >= room_timers[1][0][0]

&& currentHour <= (room_timers[1][0][2] + 1)){

room2Lights = checkOnTime(room_timers[1][0][0], room_timers[1][0][1],

room_timers[1][0][2], room_timers[1][0][3]);

}

if(room201Active == 1 && currentHour >= room_timers[1][1][0] &&

currentHour <= (room_timers[1][1][2] + 1)){

room2Lights = checkOnTime(room_timers[1][1][0], room_timers[1][1][1],

room_timers[1][1][2], room_timers[1][1][3]);

}

if(room202Active == 1 && currentHour >= room_timers[1][2][0] &&

currentHour <= (room_timers[1][2][2] + 1)){

room2Lights = checkOnTime(room_timers[1][2][0], room_timers[1][2][1],

room_timers[1][2][2], room_timers[1][2][3]);

}

if(room203Active == 1 && currentHour >= room_timers[1][3][0] &&

currentHour <= (room_timers[1][3][2] + 1)){

room2Lights = checkOnTime(room_timers[1][3][0], room_timers[1][3][1],

room_timers[1][3][2], room_timers[1][3][3]);

}

if(room2Lights == 1 && lightLevel[1] == 1){

lightOutput[1] = 2;

}

else {

lightOutput[1] = 0;

lightLevel[1] =0;

}

////////Room 3 (Bed 3) ////////////

if(room3MActive == 1 && currentHour >= room_timers[2][0][0] &&

currentHour <= (room_timers[2][0][2] + 1)){

room3Lights = checkOnTime(room_timers[2][0][0], room_timers[2][0][1],

room_timers[2][0][2], room_timers[2][0][3]);

}

if(room301Active == 1 && currentHour >= room_timers[2][1][0] &&

currentHour <= (room_timers[2][1][2] + 1)){

room3Lights = checkOnTime(room_timers[2][1][0], room_timers[2][1][1],

room_timers[2][1][2], room_timers[2][1][3]);

}

if(room302Active == 1 && currentHour >= room_timers[2][2][0] &&

currentHour <= (room_timers[2][2][2] + 1)){

room3Lights = checkOnTime(room_timers[2][2][0], room_timers[2][2][1],

room_timers[2][2][2], room_timers[2][2][3]);

}

if(room303Active == 1 && currentHour >= room_timers[2][3][0] &&

currentHour <= (room_timers[2][3][2] + 1)){

room3Lights = checkOnTime(room_timers[2][3][0], room_timers[2][3][1],

room_timers[2][3][2], room_timers[2][3][3]);

}

if(room3Lights == 1 && lightLevel[2] == 1){

lightOutput[2] = 4;

}

else {

lightOutput[2] = 0;

lightLevel[2] = 0;

}

////////Room 4 (living)/////////////////////

if(room4MActive == 1 && currentHour >= room_timers[3][0][0] &&

currentHour <= (room_timers[3][0][2] + 1)){

room4Lights = checkOnTime(room_timers[3][0][0], room_timers[3][0][1],

room_timers[3][0][2], room_timers[3][0][3]);

}

if(room401Active == 1 && currentHour >= room_timers[3][1][0] &&

currentHour <= (room_timers[3][1][2] + 1)){

room4Lights = checkOnTime(room_timers[3][1][0], room_timers[3][1][1],

room_timers[3][1][2], room_timers[3][1][3]);

}

if(room401Active == 1 && currentHour >= room_timers[3][2][0] &&

currentHour <= (room_timers[3][2][2] + 1)){

room4Lights = checkOnTime(room_timers[3][2][0], room_timers[3][2][1],

room_timers[3][2][2], room_timers[3][2][3]);

}

if(room401Active == 1 && currentHour >= room_timers[3][3][0] &&

currentHour <= (room_timers[3][3][2] + 1)){

room4Lights = checkOnTime(room_timers[3][3][0], room_timers[3][3][1],

room_timers[3][3][2], room_timers[3][3][3]);

}

if(room4Lights == 1 && lightLevel[3] == 1){

lightOutput[3] = 8;

}

else {

lightOutput[3] = 0;

lightLevel[3] = 0;

}

////////Room 5 (Bath 1)/////////////////////

if(room5MActive == 1 && currentHour >= room_timers[4][0][0] &&

currentHour <= (room_timers[4][0][2] + 1)){

room5Lights = checkOnTime(room_timers[4][0][0], room_timers[4][0][1],

room_timers[4][0][2], room_timers[4][0][3]);

}

if(room501Active == 1 && currentHour >= room_timers[4][1][0] &&

currentHour <= (room_timers[4][1][2] + 1)){

room5Lights = checkOnTime(room_timers[4][1][0], room_timers[4][1][1],

room_timers[4][1][2], room_timers[4][1][3]);

}

if(room5Lights == 1 && lightLevel[4] == 1){

lightOutput[4] = 16;

}

else {

lightOutput[4] = 0;

lightLevel[4] =0;

}

////////Room 6 (Bath 2)/////////////////////

if(room6MActive ==1 && currentHour >= room_timers[5][0][0] &&

currentHour <= (room_timers[5][0][2] + 1)){

room6Lights = checkOnTime(room_timers[5][0][0], room_timers[5][0][1],

room_timers[5][0][2], room_timers[5][0][3]);

}

if(room601Active == 1 && currentHour >= room_timers[5][1][0] &&

currentHour <= (room_timers[5][1][2] + 1)){

room6Lights = checkOnTime(room_timers[5][1][0], room_timers[5][1][1],

room_timers[5][1][2], room_timers[5][1][3]);

}

if(room6Lights == 1 && lightLevel[5] == 1){

lightOutput[5] = 32;

}

else {

lightOutput[5] = 0;

lightLevel[5] = 0;

}

////////Room 7 (Bath 3)/////////////////////

if(room7MActive == 1 && currentHour >= room_timers[6][0][0] &&

currentHour <= (room_timers[6][0][2])){

room7Lights = checkOnTime(room_timers[6][0][0], room_timers[6][0][1],

room_timers[6][0][2], room_timers[6][0][3]);

}

if(room701Active == 1 && currentHour >= room_timers[6][1][0] &&

currentHour <= (room_timers[6][1][2] + 1)){

room7Lights = checkOnTime(room_timers[6][1][0], room_timers[6][1][1],

room_timers[6][1][2], room_timers[6][1][3]);

}

if(room7Lights == 1 && lightLevel[6] == 1){

lightOutput[6] = 64;

}

else {

lightOutput[6] = 0;

lightLevel[6] = 0;

}

////////Room 8 (Bath 4)/////////////////////

if(room8MActive == 1 && currentHour >= room_timers[7][0][0] &&

currentHour <= (room_timers[7][0][2] + 1)){

room8Lights = checkOnTime(room_timers[7][0][0], room_timers[7][0][1],

room_timers[7][0][2], room_timers[7][0][3]);

}

if(room801Active == 1 && currentHour >= room_timers[7][1][0] &&

currentHour <= (room_timers[7][1][2] + 1)){

room8Lights = checkOnTime(room_timers[7][1][0], room_timers[7][1][1],

room_timers[7][1][2], room_timers[7][1][3]);

}

if(room8Lights == 1 && lightLevel[7] == 1){

lightOutput[7] = 128;

}

else {

lightOutput[7] = 0;

lightLevel[7] = 0;

}

////////Room 9 (kitchen)/////////////////////

if(room9MActive == 1 && currentHour >= room_timers[8][0][0] &&

currentHour <= (room_timers[8][0][2] + 1)){

room9Lights = checkOnTime(room_timers[8][0][0], room_timers[8][0][1],

room_timers[8][0][2], room_timers[8][0][3]);

}

if(room901Active == 1 && currentHour >= room_timers[8][1][0] &&

currentHour <= (room_timers[8][1][2] + 1)){

room9Lights = checkOnTime(room_timers[8][1][0], room_timers[8][1][1],

room_timers[8][1][2], room_timers[8][1][3]);

}

if(room9Lights == 1 && lightLevel[8] == 1){

lightOutput[8] = 256;

}

else {

lightOutput[8] = 0;

lightLevel[8] = 0;

}

////////Room 10 (corridor)/////////////////////

if(room10MActive == 1 && currentHour >= room_timers[9][0][0] &&

currentHour <= (room_timers[9][0][2] + 1)){

room10Lights = checkOnTime(room_timers[9][0][0], room_timers[9][0][1],

room_timers[9][0][2], room_timers[9][0][3]);

}

if(room1001Active == 1 && currentHour >= room_timers[9][1][0] &&

currentHour <= (room_timers[9][1][2] + 1)){

room9Lights = checkOnTime(room_timers[9][1][0], room_timers[9][1][1],

room_timers[9][1][2], room_timers[9][1][3]);

}

if(room10Lights == 1 && lightLevel[9] == 1){

lightOutput[9] = 512;

}

else {

lightOutput[9] = 0;

lightLevel[9] = 0;

}

////////Outside lights////////////////////

outsideOnTime = checkOnTime(17, 02, hourOutsideOff,

minuteOutsideOff); //function call to check time

//Serial.print("Timer: "); //debug only

Since we have updated the “Holiday light switching” part, we also need to update the menu points controlling the variables. There fore we move down to the selectMenu() function and find the first get_setTime() function call in the first sub menu.

if(submenu == 3){ //and submenu is 3

//call the function get_setTime() to change timer 1

get_setTime( room1OnM[0], room1OnM[1],

room1OffM[0], room1OffM[1], 1);

return;

}

As we can see, we still pass on the variables we have just deleted. We need to match the passed on variables again with the new implemented 3-dimensional array. The last variable we pass on also changes to 0 to match the room count in the array. We also need to pass another variable to tell the system which timer we are addressing. In this case it is the first timer, so we pass another 0. The updated function call reads like this:

if(submenu == 3){ //and submenu is 3

//call the function get_setTime() to change timer 1

get_setTime(room_timer[0][0][0], room_timer[0][0][1],

room_timer[0][0][2], room_timer[0][0][3],

0, 0);

return;

}

Since we extended the timers to 4 timers for the first four rooms, we also need to add the timers to the menu itself. Let's have a quick look at the beginning of the first submenu and add a couple of statements there. Here is the complete first sub menu with all changes made:

if(menuOption == 6) return; //and menu option is 6 return (not used)

if(menuOption == 7){ //and menu option is 7 (room 1)

subButton = 0; //resetting the button var

submenu = 1; //submenu counter

lcd.clear(); //clear screen

//retrieving and printing first sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[0]))));

lcd.write(pgm_read_byte(&char_table[5])); //printing assigned room number 1

while(submenu < submenus){ //loop through the sub menu points

subButton = read_act_buttons(); //checking for pressed buttons

if(subButton == btnMenu){ //if button Menu was pressed

submenu++; //add 1 - move to the next sub menu point

if(submenu == 2){ //if we are at sub menu 2

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[1]))));

lcd.write(pgm_read_byte(&char_table[5])); //printing assigned room number 1

}

if(submenu == 3){ //if we are at sub menu 3

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[2]))));

lcd.write(pgm_read_byte(&char_table[5])); //printing assigned room number 1

}

if(submenu == 4){ //if we are at sub menu 4

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[3]))));

lcd.write(pgm_read_byte(&char_table[5])); //printing assigned room number 1

}

if(submenu == 5){ //if we are at sub menu 5

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[4]))));

lcd.write(pgm_read_byte(&char_table[5])); //printing assigned room number 1

}

if(submenu == 6){ //if we are at sub menu 6

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[5]))));

lcd.write(pgm_read_byte(&char_table[5])); //printing assigned room number 1

}

if(submenu == 7){ //if we are at sub menu 7

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[6]))));

lcd.write(pgm_read_byte(&char_table[5])); //printing assigned room number 1

}

if(submenu == 8){ //if we are at sub menu 6

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[7]))));

lcd.write(pgm_read_byte(&char_table[5])); //printing assigned room number 1

}

if(submenu == 9){ //if we are at sub menu 7

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[8]))));

lcd.write(pgm_read_byte(&char_table[5])); //printing assigned room number 1

}

}

if(subButton == btnSelect){ //if we pressed btnSelect

if(submenu == 1){ //and submenu is 1

//call the function get_delay() to change the setting

delayTime[0] = get_delay(9, 1, dBed1);

return;

}

if(submenu == 2){ //and sub menu is 2

//call the function get_offon to change the setting

room1MActive = get_offon(10, 1, room1MActive);

return;

}

if(submenu == 3){ //and submenu is 3

//call the function get_setTime() to change timer 1

get_setTime(room_timer[0][0][0], room_timer[0][0][1],

room_timer[0][0][2], room_timer[0][0][3],

0, 0);

return;

}

if(submenu == 4){ //and submenu is 4

//call the function get_offon() to change the setting

room1O1Active = get_offon(11, 1, room1O1Active);

return;

}

if(submenu == 5){ //and submenu is 5

//call the function get_setTime() to change timer 2

get_setTime(room_timer[0][1][0], room_timer[0][1][1],

room_timer[0][1][2], room_timer[0][1][3],

0, 1);

return;

}

if(submenu == 6){ //and submenu is 6

//call the function get_offon() to change the setting

room102Active = get_offon(12, 1, room102Active);

return;

}

if(submenu == 7){ //and submenu == 7

//call function get_setTime() to change timer 3

get_setTime(room_timer[0][2][0], room_timer[0][2][1],

room_timer[0][2][2], room_timer[0][2][3],

0, 2);

return;

}

if(submenu == 8){ //and submenu is 6

//call the function get_offon() to change the setting

room103Active = get_offon(25, 1, room103Active);

return;

}

if(submenu == 9){ //and submenu == 7

//call function get_setTime() to change timer 3

get_setTime(room_timer[0][3][0], room_timer[0][3][1],

room_timer[0][3][2], room_timer[0][3][3],

0, 3);

return;

}

}

}

} //submenu end

Just adding the sub menu points and matching the variables for the time is pretty straight forward again. If you have a closer look at the “ room103Active = get_offon(25, 1, room103Active);” function call, there you find as first variable a “25”. Here we needed to add another info text in the program memory and not to rewrite the whole table and plenty of other statements, I just added it to the end of the message table in the declaration part under “menu and user interface. While we are back at this section, we also need to update the amount of submenu points.


///////////////////Menu and user interface/////////////////////////////////

///////////////////////////////////////////////////////////////////////////

const byte btnMenu = 1; //defining the menu button – moves through the menu

const byte btnSearch = 2; //defining the search button – moves through values

const byte btnSelect = 3; //defining the select button – selects a menu or a value

const byte btnNone = 0; //defining the non button pressed var

int act_key_in = 0; //var holding the key related sensor reading

byte menuOption = 0; //var to count current menu option

const byte menuOptions = 20; //available menu options

byte submenu = 0; //var to count current submenu option

//>>>>>>>>>>>>>Update to submenus = 9 in the line below<<<<<<<<<<<<<<

const byte submenus = 9; //available submenu options

char buffer_M[20]; //var holding the menu strings retrieved from

//the program memory

//Storing some menu messages in the program memory

prog_char msg_0[] PROGMEM = "Not Used";

prog_char msg_1[] PROGMEM = "Saving....";

prog_char msg_2[] PROGMEM = "Setup mode";

prog_char msg_3[] PROGMEM = "Starting....";

prog_char msg_4[] PROGMEM = "RMU 1.2.9";

prog_char msg_5[] PROGMEM = "Weekday";

prog_char msg_6[] PROGMEM = "On TIMER Off";

prog_char msg_7[] PROGMEM = "Off ";

prog_char msg_8[] PROGMEM = "Active";

prog_char msg_9[] PROGMEM = "PIR Delay R";

prog_char msg_10[] PROGMEM = "T1 On/Off R";

prog_char msg_11[] PROGMEM = "T2 On/Off R";

prog_char msg_12[] PROGMEM = "T3 On/Off R";

prog_char msg_13[] PROGMEM = "ADJ Hour On";

prog_char msg_14[] PROGMEM = "ADJ Minute On";

prog_char msg_15[] PROGMEM = "ADJ Hour Off";

prog_char msg_16[] PROGMEM = "ADJ Minute Off";

prog_char msg_17[] PROGMEM = "Set Sensitivity";

prog_char msg_18[] PROGMEM = "Set photocell R";

prog_char msg_19[] PROGMEM = "Set photocell O";

prog_char msg_20[] PROGMEM = "ADJ Time Minute";

prog_char msg_21[] PROGMEM = "ADJ Time Hour";

prog_char msg_22[] PROGMEM = "ADJ Date Day";

prog_char msg_23[] PROGMEM = "ADJ Date Month";

prog_char msg_24[] PROGMEM = "ADJ Date Year";

//>>>>>>>>>>>>>>Add the line below<<<<<<<<<<<<<

prog_char msg_25[] PROGMEM = "T4 On/Off R";

//Creating the table for the stored menu messages

PROGMEM const char *msg_table[] = {

msg_0,

msg_1,

msg_2,

msg_3,

msg_4,

msg_5,

msg_6,

msg_7,

msg_8,

msg_9,

msg_10,

msg_11,

msg_12,

msg_13,

msg_14,

msg_15,

msg_16,

msg_17,

msg_18,

msg_19,

msg_20,

msg_21,

msg_22,

msg_23,

msg_24,

//>>>>>>>>>>>>>Add below<<<<<<<<<<<<<<

msg_25

};

We have to do now the above described alterations with all the sub menus. I added below the complete selectMenu() function with all the alterations.


void selectMenu(){

//Serial.println("SelectMenu");

byte button = 0; //var holding the button value

byte subButton = 0; //var holding the subButton value

menuOption = 1; //current menu option

lcd.clear(); //clear screen

//print the retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[0]))));

while(menuOption <= menuOptions){ //loop through menu options

button = read_act_buttons(); //check if button was pressed

if(button == btnMenu){ //if it was btn menu

menuOption++; //add 1 to menu option

if(menuOption == 2){ //if it's menu option 2

lcd.clear(); //clear display

//print retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[1]))));

}

if(menuOption == 3){ //if it's menu option 3

lcd.clear(); //clear display

//print retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[2]))));

}

if(menuOption == 4){ //if it's menu option 4

lcd.clear(); //clear lcd

//print retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[3]))));

lcd.setCursor(0, 1); //set cursor to row 2 column 1

//print retrieved message srting

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(msg_table[0]))));

}

if(menuOption == 5){ //if it's menu option 5

lcd.clear(); //clear display

//print retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[4]))));

}

if(menuOption == 6){ //if it's menu option 6

lcd.clear(); //clear lcd

//print retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[5]))));

lcd.setCursor(0, 1); //set cursor to row 2 column 1

//print retrieved message string

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0]))));

}

if(menuOption == 7){ //if it's menu option 7

lcd.clear(); //clear lcd

//print retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[6]))));

lcd.setCursor(15, 0); //set cursor to row 2 column 1

//print retrieved message string

lcd.write(pgm_read_byte(&char_table[0]));

}

if(menuOption == 8){ //if it's menu option 8

lcd.clear(); //clear lcd

//print retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[7]))));

lcd.setCursor(15, 0); //set cursor to row 2 column 1

//print retrieved message string

lcd.write(pgm_read_byte(&char_table[0]));

}

if(menuOption == 9){ //if it's menu option 9

lcd.clear(); //clear lcd

//print retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[8]))));

lcd.setCursor(15, 0); //set cursor to row 2 column 1

//print retrieved message string

lcd.write(pgm_read_byte(&char_table[0]));

}

if(menuOption == 10){ //if it's menu option 10

lcd.clear(); //clear lcd

//print retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[9]))));

lcd.setCursor(15, 0); //set cursor to row 2 column 1

//print retrieved message string

lcd.write(pgm_read_byte(&char_table[0]));

}

if(menuOption == 11){ //if it's menu option 12

lcd.clear(); //clear lcd

//print retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[10]))));

lcd.setCursor(15, 0); //set cursor to row 2 column 1

//print retrieved message string

lcd.write(pgm_read_byte(&char_table[0]));

}

if(menuOption == 12){ //if it's menu option 13

lcd.clear(); //clear lcd

//print retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[11]))));

lcd.setCursor(15, 0); //set cursor to row 2 column 1

//print retrieved message string

lcd.write(pgm_read_byte(&char_table[0]));

}

if(menuOption == 13){ //if it's menu option 14

lcd.clear(); //clear lcd

//print retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[12]))));

lcd.setCursor(15, 0); //set cursor to row 2 column 1

//print retrieved message string

lcd.write(pgm_read_byte(&char_table[0]));

}

if(menuOption == 14){ //if it's menu option 15

lcd.clear(); //clear lcd

//print retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[13]))));

lcd.setCursor(15, 0); //set cursor to row 2 column 1

//print retrieved message string

lcd.write(pgm_read_byte(&char_table[0]));

}

if(menuOption == 15){ //if it's menu option 16

lcd.clear(); //clear lcd

//print retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[14]))));

lcd.setCursor(15, 0); //set cursor to row 2 column 1

//print retrieved message string

lcd.write(pgm_read_byte(&char_table[0]));

}

if(menuOption == 16){ //if it's menu option 17

lcd.clear(); //clear lcd

//print retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[15]))));

lcd.setCursor(15, 0); //set cursor to row 2 column 1

//print retrieved message string

lcd.write(pgm_read_byte(&char_table[0]));

}

if(menuOption == 17){ //if it's menu option 18

lcd.clear(); //clear lcd

//print retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[16]))));

lcd.setCursor(15, 0); //set cursor to row 2 column 1

//print retrieved message string

lcd.write(pgm_read_byte(&char_table[0]));

}

if(menuOption == 18){ //if it's menu option 19

lcd.clear(); //clear lcd

//print retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[17]))));

lcd.setCursor(15, 0); //set cursor to row 2 column 1

//print retrieved message string

lcd.write(pgm_read_byte(&char_table[0]));

}

if(menuOption == 19){ //if it's menu option 20

lcd.clear(); //clear lcd

//print retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[18]))));

lcd.setCursor(15, 0); //set cursor to row 2 column 1

//print retrieved message string

lcd.write(pgm_read_byte(&char_table[0]));

}

if(menuOption == 20){ //if it's menu option 21

lcd.clear(); //clear lcd

//print retrieved string on lcd

lcd.print(strcpy_P(buffer_M, (char*)pgm_read_word(&(menu_table[19]))));

lcd.setCursor(15, 0); //set cursor to row 2 column 1

//print retrieved message string

lcd.write(pgm_read_byte(&char_table[0]));

}

}

if(button == btnSelect){ //if the select button is pressed

if(menuOption == 1){ //and menu option is 1

adjust_date_time(); //go to adjust date and time

return;

}

if(menuOption == 2){ //and menu option is 2

sensitivity = get_Timer(17, sensitivity, 0, 1000); //go to function

return;

}

if(menuOption == 3){ //and menu option is 3

photoCellCutOff = get_Timer(18, photoCellCutOff, 0, 1024); //go to function

return;

}

if(menuOption == 4) return; //and menu option is 4 return (not used)

if(menuOption == 5){ //and menu option is 5

photoOutsideOff = get_Timer(19, photoOutsideOff, 0, 1024); //go to function

return;

}

if(menuOption == 6) return; //and menu option is 6 return (not used)

if(menuOption == 7){ //and menu option is 7 (room 1)

subButton = 0; //resetting the button var

submenu = 1; //submenu counter

lcd.clear(); //clear screen

//retrieving and printing first sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[0]))));

lcd.write(pgm_read_byte(&char_table[5])); //printing assigned room number 1

while(submenu < submenus){ //loop through the sub menu points

subButton = read_act_buttons(); //checking for pressed buttons

if(subButton == btnMenu){ //if button Menu was pressed

submenu++; //add 1 - move to the next sub menu point

if(submenu == 2){ //if we are at sub menu 2

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[1]))));

lcd.write(pgm_read_byte(&char_table[5])); //printing assigned room number 1

}

if(submenu == 3){ //if we are at sub menu 3

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[2]))));

lcd.write(pgm_read_byte(&char_table[5])); //printing assigned room number 1

}

if(submenu == 4){ //if we are at sub menu 4

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[3]))));

lcd.write(pgm_read_byte(&char_table[5])); //printing assigned room number 1

}

if(submenu == 5){ //if we are at sub menu 5

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[4]))));

lcd.write(pgm_read_byte(&char_table[5])); //printing assigned room number 1

}

if(submenu == 6){ //if we are at sub menu 6

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[5]))));

lcd.write(pgm_read_byte(&char_table[5])); //printing assigned room number 1

}

if(submenu == 7){ //if we are at sub menu 7

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[6]))));

lcd.write(pgm_read_byte(&char_table[5])); //printing assigned room number 1

}

if(submenu == 8){ //if we are at sub menu 6

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[7]))));

lcd.write(pgm_read_byte(&char_table[5])); //printing assigned room number 1

}

if(submenu == 9){ //if we are at sub menu 7

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[8]))));

lcd.write(pgm_read_byte(&char_table[5])); //printing assigned room number 1

}

}

if(subButton == btnSelect){ //if we pressed btnSelect

if(submenu == 1){ //and submenu is 1

//call the function get_delay() to change the setting

delayTime[0] = get_delay(9, 1, dBed1);

return;

}

if(submenu == 2){ //and sub menu is 2

//call the function get_offon to change the setting

room1MActive = get_offon(10, 1, room1MActive);

return;

}

if(submenu == 3){ //and submenu is 3

//call the function get_setTime() to change timer 1

get_setTime(room_timers[0][0][0], room_timers[0][0][1],

room_timers[0][0][2], room_timers[0][0][3],

0, 0);

return;

}

if(submenu == 4){ //and submenu is 4

//call the function get_offon() to change the setting

room1O1Active = get_offon(11, 1, room1O1Active);

return;

}

if(submenu == 5){ //and submenu is 5

//call the function get_setTime() to change timer 2

get_setTime(room_timers[0][1][0], room_timers[0][1][1],

room_timers[0][1][2], room_timers[0][1][3],

0, 1);

return;

}

if(submenu == 6){ //and submenu is 6

//call the function get_offon() to change the setting

room102Active = get_offon(12, 1, room102Active);

return;

}

if(submenu == 7){ //and submenu == 7

//call function get_setTime() to change timer 3

get_setTime(room_timers[0][2][0], room_timers[0][2][1],

room_timers[0][2][2], room_timers[0][2][3],

0, 2);

return;

}

if(submenu == 8){ //and submenu is 6

//call the function get_offon() to change the setting

room103Active = get_offon(25, 1, room103Active);

return;

}

if(submenu == 9){ //and submenu == 7

//call function get_setTime() to change timer 3

get_setTime(room_timers[0][3][0], room_timers[0][3][1],

room_timers[0][3][2], room_timers[0][3][3],

0, 3);

return;

}

}

}

} //submenu end

if(menuOption == 8){ //and menu option is 8 (room 2)

subButton = 0; //resetting the button var

submenu = 1; //submenu counter

lcd.clear(); //clear screen

//retrieving and printing first sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[0]))));

lcd.write(pgm_read_byte(&char_table[6])); //printing assigned room number 2

while(submenu < submenus){ //loop through the sub menu points

subButton = read_act_buttons(); //checking for pressed buttons

if(subButton == btnMenu){ //if button Menu was pressed

submenu++; //add 1 - move to the next sub menu point

if(submenu == 2){ //if we are at sub menu 2

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[1]))));

lcd.write(pgm_read_byte(&char_table[6])); //printing assigned room number 2

}

if(submenu == 3){ //if we are at sub menu 3

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[2]))));

lcd.write(pgm_read_byte(&char_table[6])); //printing assigned room number 2

}

if(submenu == 4){ //if we are at sub menu 4

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[3]))));

lcd.write(pgm_read_byte(&char_table[6])); //printing assigned room number 2

}

if(submenu == 5){ //if we are at sub menu 5

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[4]))));

lcd.write(pgm_read_byte(&char_table[6])); //printing assigned room number 2

}

if(submenu == 6){ //if we are at sub menu 6

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[5]))));

lcd.write(pgm_read_byte(&char_table[6])); //printing assigned room number 2

}

if(submenu == 7){ //if we are at sub menu 7

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[6]))));

lcd.write(pgm_read_byte(&char_table[6])); //printing assigned room number 2

}

if(submenu == 8){ //if we are at sub menu 6

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[7]))));

lcd.write(pgm_read_byte(&char_table[6])); //printing assigned room number 2

}

if(submenu == 9){ //if we are at sub menu 7

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[8]))));

lcd.write(pgm_read_byte(&char_table[6])); //printing assigned room number 2

}

}

if(subButton == btnSelect){ //if we pressed btnSelect

if(submenu == 1){ //and submenu is 1

//call the function get_delay() to change the setting

delayTime[1] = get_delay(9, 2, dBed2);

return;

}

if(submenu == 2){ //and sub menu is 2

//call the function get_offon to change the setting

room2MActive = get_offon(10, 2, room2MActive);

return;

}

if(submenu == 3){ //and submenu is 3

//call the function get_setTime() to change timer 1

get_setTime(room_timers[1][0][0], room_timers[1][0][1],

room_timers[1][0][2], room_timers[1][0][3],

1, 0);

return;

}

if(submenu == 4){ //and submenu is 4

//call the function get_offon() to change the setting

room201Active = get_offon(11, 2, room201Active);

return;

}

if(submenu == 5){ //and submenu is 5

//call the function get_setTime() to change timer 2

get_setTime(room_timers[1][1][0], room_timers[1][1][1],

room_timers[1][1][2], room_timers[1][1][3],

1, 1);

return;

}

if(submenu == 6){ //and submenu is 6

//call the function get_offon() to change the setting

room202Active = get_offon(12, 2, room202Active);

return;

}

if(submenu == 7){ //and submenu is 7

//call the function get_setTime() to change timer 2

get_setTime(room_timers[1][2][0], room_timers[1][2][1],

room_timers[1][2][2], room_timers[1][2][3],

1, 2);

return;

}

if(submenu == 8){ //and submenu is 8

//call the function get_offon() to change the setting

room203Active = get_offon(25, 2, room203Active);

return;

}

if(submenu == 9){ //and submenu is 9

//call the function get_setTime() to change timer 2

get_setTime(room_timers[1][3][0], room_timers[1][3][1],

room_timers[1][3][2], room_timers[1][3][3],

1, 3);

return;

}

}

}

} //submenu end

if(menuOption == 9){ //and menu option is 9 (room 3)

subButton = 0; //resetting the button var

submenu = 1; //submenu counter

lcd.clear(); //clear screen

//retrieving and printing first sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[0]))));

lcd.write(pgm_read_byte(&char_table[7])); //printing assigned room number 3

while(submenu < submenus){ //loop through the sub menu points

subButton = read_act_buttons(); //checking for pressed buttons

if(subButton == btnMenu){ //if button Menu was pressed

submenu++; //add 1 - move to the next sub menu point

if(submenu == 2){ //if we are at sub menu 2

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[1]))));

lcd.write(pgm_read_byte(&char_table[7])); //printing assigned room number 3

}

if(submenu == 3){ //if we are at sub menu 3

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[2]))));

lcd.write(pgm_read_byte(&char_table[7])); //printing assigned room number 3

}

if(submenu == 4){ //if we are at sub menu 4

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[3]))));

lcd.write(pgm_read_byte(&char_table[7])); //printing assigned room number 3

}

if(submenu == 5){ //if we are at sub menu 5

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[4]))));

lcd.write(pgm_read_byte(&char_table[7])); //printing assigned room number 3

}

if(submenu == 6){ //if we are at sub menu 6

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[5]))));

lcd.write(pgm_read_byte(&char_table[7])); //printing assigned room number 3

}

if(submenu == 7){ //if we are at sub menu 7

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[6]))));

lcd.write(pgm_read_byte(&char_table[7])); //printing assigned room number 3

}

if(submenu == 8){ //if we are at sub menu 8

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[7]))));

lcd.write(pgm_read_byte(&char_table[7])); //printing assigned room number 3

}

if(submenu == 9){ //if we are at sub menu 9

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[8]))));

lcd.write(pgm_read_byte(&char_table[7])); //printing assigned room number 3

}

}

if(subButton == btnSelect){ //if we pressed btnSelect

if(submenu == 1){ //and submenu is 1

//call the function get_delay() to change the setting

delayTime[2] = get_delay(9, 3, dBed3);

return;

}

if(submenu == 2){ //and sub menu is 2

//call the function get_offon to change the setting

room3MActive = get_offon(10, 3, room3MActive);

return;

}

if(submenu == 3){ //and submenu is 3

//call the function get_setTime() to change timer 1

get_setTime(room_timers[2][0][0], room_timers[2][0][1],

room_timers[2][0][2], room_timers[2][0][3],

2, 0);

return;

}

if(submenu == 4){ //and submenu is 4

//call the function get_offon() to change the setting

room301Active = get_offon(11, 3, room301Active);

return;

}

if(submenu == 5){ //and submenu is 5

//call the function get_setTime() to change timer 2

get_setTime(room_timers[2][1][0], room_timers[2][1][1],

room_timers[2][1][2], room_timers[2][1][3],

2, 1);

return;

}

if(submenu == 6){ //and submenu is 6

//call the function get_offon() to change the setting

room302Active = get_offon(12, 3, room302Active);

return;

}

if(submenu == 7){ //and submenu == 7

//call function get_setTime() to change timer 3

get_setTime(room_timers[2][2][0], room_timers[2][2][1],

room_timers[2][2][2], room_timers[2][2][3],

2, 2);

return;

}

if(submenu == 8){ //and submenu is 6

//call the function get_offon() to change the setting

room303Active = get_offon(25, 3, room302Active);

return;

}

if(submenu == 9){ //and submenu == 7

//call function get_setTime() to change timer 3

get_setTime(room_timers[2][3][0], room_timers[2][3][1],

room_timers[2][3][2], room_timers[2][3][3],

2, 3);

return;

}

}

}

} //submenu end

if(menuOption == 10){ //and menu option is 9 (room 4)

subButton = 0; //resetting the button var

submenu = 1; //submenu counter

lcd.clear(); //clear screen

//retrieving and printing first sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[0]))));

lcd.write(pgm_read_byte(&char_table[8])); //printing assigned room number 4

while(submenu < submenus){ //loop through the sub menu points

subButton = read_act_buttons(); //checking for pressed buttons

if(subButton == btnMenu){ //if button Menu was pressed

submenu++; //add 1 - move to the next sub menu point

if(submenu == 2){ //if we are at sub menu 2

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[1]))));

lcd.write(pgm_read_byte(&char_table[8])); //printing assigned room number 4

}

if(submenu == 3){ //if we are at sub menu 3

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[2]))));

lcd.write(pgm_read_byte(&char_table[8])); //printing assigned room number 4

}

if(submenu == 4){ //if we are at sub menu 4

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[3]))));

lcd.write(pgm_read_byte(&char_table[8])); //printing assigned room number 4

}

if(submenu == 5){ //if we are at sub menu 5

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[4]))));

lcd.write(pgm_read_byte(&char_table[8])); //printing assigned room number 4

}

if(submenu == 6){ //if we are at sub menu 6

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[5]))));

lcd.write(pgm_read_byte(&char_table[8])); //printing assigned room number 4

}

if(submenu == 7){ //if we are at sub menu 7

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[6]))));

lcd.write(pgm_read_byte(&char_table[8])); //printing assigned room number 4

}

if(submenu == 8){ //if we are at sub menu 6

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[7]))));

lcd.write(pgm_read_byte(&char_table[8])); //printing assigned room number 4

}

if(submenu == 9){ //if we are at sub menu 7

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[8]))));

lcd.write(pgm_read_byte(&char_table[8])); //printing assigned room number 4

}

}

if(subButton == btnSelect){ //if we pressed btnSelect

if(submenu == 1){ //and submenu is 1

//call the function get_delay() to change the setting

delayTime[3] = get_delay(9, 4, dLiving);

return;

}

if(submenu == 2) { //and submenu is 2

//call the function get_offon() to change the setting

room4MActive = get_offon(10, 4, room4MActive);

return;

}

if(submenu == 3){ //and submenu == 3

//call function get_setTime() to change timer 0

get_setTime(room_timers[3][0][0], room_timers[3][0][1],

room_timers[3][0][2], room_timers[3][0][3],

3, 0);

return;

}

if(submenu == 4){ //and submenu is 4

//call the function get_offon() to change the setting

room401Active = get_offon(11, 4, room401Active);

return;

}

if(submenu == 5){ //and submenu is 5

//call the function get_setTime() to change timer 1

get_setTime(room_timers[3][1][0], room_timers[3][1][1],

room_timers[3][1][2], room_timers[3][1][3],

3, 1);

return;

}

if(submenu == 6){ //and submenu is 6

//call the function get_offon() to change the setting

room402Active = get_offon(12, 4, room402Active);

return;

}

if(submenu == 7){ //and submenu is 7

//call the function get_setTime() to change timer 3

get_setTime(room_timers[3][2][0], room_timers[3][2][1],

room_timers[3][2][2], room_timers[3][2][3],

3, 2);

return;

}

if(submenu == 8){ //and submenu is 8

//call the function get_offon() to change the setting

room403Active = get_offon(25, 4, room403Active);

return;

}

if(submenu == 9){ //and submenu is 9

//call the function get_setTime() to change timer 1

get_setTime(room_timers[3][3][0], room_timers[3][3][1],

room_timers[3][3][2], room_timers[3][3][3],

3, 3);

return;

}

}

}

} //submenu end

if(menuOption == 11){ //and menu option is 11 (room 5)

subButton = 0; //resetting the button var

submenu = 1; //submenu counter

lcd.clear(); //clear screen

//retrieving and printing first sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[0]))));

lcd.write(pgm_read_byte(&char_table[9])); //printing assigned room number 5

while(submenu < submenus){ //loop through the sub menu points

subButton = read_act_buttons(); //checking for pressed buttons

if(subButton == btnMenu){ //if button Menu was pressed

submenu++; //add 1 - move to the next sub menu point

if(submenu == 2){ //if we are at sub menu 2

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[1]))));

lcd.write(pgm_read_byte(&char_table[9])); //printing assigned room number 5

}

if(submenu == 3){ //if we are at sub menu 3

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[2]))));

lcd.write(pgm_read_byte(&char_table[9])); //printing assigned room number 5

}

if(submenu == 4){ //if we are at sub menu 4

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[3]))));

lcd.write(pgm_read_byte(&char_table[9])); //printing assigned room number 5

}

if(submenu == 5){ //if we are at sub menu 5

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[4]))));

lcd.write(pgm_read_byte(&char_table[9])); //printing assigned room number 5

}

if(submenu == 6){ //if we are at sub menu 6

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[5]))));

lcd.write(pgm_read_byte(&char_table[9])); //printing assigned room number 5

lcd.setCursor(0, 1);

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0]))));

}

if(submenu == 7){ //if we are at sub menu 7

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[6]))));

lcd.write(pgm_read_byte(&char_table[9])); //printing assigned room number 5

lcd.setCursor(0, 1);

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0]))));

}

if(submenu == 8){ //if we are at sub menu 8

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[7]))));

lcd.write(pgm_read_byte(&char_table[9])); //printing assigned room number 5

lcd.setCursor(0, 1);

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0]))));

}

if(submenu == 9){ //if we are at sub menu 9

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[8]))));

lcd.write(pgm_read_byte(&char_table[9])); //printing assigned room number 5

lcd.setCursor(0, 1);

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0]))));

}

}

if(subButton == btnSelect){ //if we pressed btnSelect

if(submenu == 1){ //and submenu is 1

//call the function get_delay() to change the setting

delayTime[4] = get_delay(9, 5, dBath1);

return;

}

if(submenu == 2){ //and sub menu is 2

//call the function get_offon to change the setting

room5MActive = get_offon(10, 5, room5MActive);

return;

}

if(submenu == 3){ //and submenu is 3

//call the function get_setTime() to change timer 1

get_setTime(room_timers[4][0][0], room_timers[4][0][1],

room_timers[4][0][2], room_timers[4][0][3],

4, 0);

return;

}

if(submenu == 4){ //and submenu is 4

//call the function get_offon() to change the setting

room501Active = get_offon(11, 5, room501Active);

return;

}

if(submenu == 5){ //and submenu is 5

//call the function get_setTime() to change timer 2

get_setTime(room_timers[4][1][0], room_timers[4][1][1],

room_timers[4][1][2], room_timers[4][1][3],

4, 1);

return;

}

if(submenu == 6)return;

if(submenu == 7)return;

if(submenu == 8)return;

if(submenu == 9)return;

}

}

} //submenu end

if(menuOption == 12){ //and menu option is 12 (room 6)

subButton = 0; //resetting the button var

submenu = 1; //submenu counter

lcd.clear(); //clear screen

//retrieving and printing first sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[0]))));

lcd.write(pgm_read_byte(&char_table[10])); //printing assigned room number 6

while(submenu < submenus){ //loop through the sub menu points

subButton = read_act_buttons(); //checking for pressed buttons

if(subButton == btnMenu){ //if button Menu was pressed

submenu++; //add 1 - move to the next sub menu point

if(submenu == 2){ //if we are at sub menu 2

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[1]))));

lcd.write(pgm_read_byte(&char_table[10])); //printing assigned room number 6

}

if(submenu == 3){ //if we are at sub menu 3

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[2]))));

lcd.write(pgm_read_byte(&char_table[10])); //printing assigned room number 6

}

if(submenu == 4){ //if we are at sub menu 4

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[3]))));

lcd.write(pgm_read_byte(&char_table[10])); //printing assigned room number 6

}

if(submenu == 5){ //if we are at sub menu 5

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[4]))));

lcd.write(pgm_read_byte(&char_table[10])); //printing assigned room number 6

}

if(submenu == 6){ //if we are at sub menu 6

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[5]))));

lcd.write(pgm_read_byte(&char_table[10])); //printing assigned room number 6

lcd.setCursor(0, 1);

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0]))));

}

if(submenu == 7){ //if we are at sub menu 7

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[6]))));

lcd.write(pgm_read_byte(&char_table[10])); //printing assigned room number 6

lcd.setCursor(0, 1);

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0]))));

}

if(submenu == 8){ //if we are at sub menu 8

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[7]))));

lcd.write(pgm_read_byte(&char_table[10])); //printing assigned room number 6

lcd.setCursor(0, 1);

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0]))));

}

if(submenu == 9){ //if we are at sub menu 9

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[8]))));

lcd.write(pgm_read_byte(&char_table[10])); //printing assigned room number 6

lcd.setCursor(0, 1);

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0]))));

}

}

if(subButton == btnSelect){ //if we pressed btnSelect

if(submenu == 1){ //and submenu is 1

//call the function get_delay() to change the setting

delayTime[5] = get_delay(9, 6, dBath2);

return;

}

if(submenu == 2){ //and sub menu is 2

//call the function get_offon to change the setting

room6MActive = get_offon(10, 6, room6MActive);

return;

}

if(submenu == 3){ //and submenu is 3

//call the function get_setTime() to change timer 1

get_setTime(room_timers[5][0][0], room_timers[5][0][1],

room_timers[5][0][2], room_timers[5][0][3],

5, 0);

return;

}

if(submenu == 4){ //and submenu is 4

//call the function get_offon() to change the setting

room601Active = get_offon(11, 6, room601Active);

return;

}

if(submenu == 5){ //and submenu is 5

//call the function get_setTime() to change timer 2

get_setTime(room_timers[5][1][0], room_timers[5][1][1],

room_timers[5][1][2], room_timers[5][1][3],

5, 1);

return;

}

if(submenu == 6)return;

if(submenu == 7)return;

if(submenu == 8)return;

if(submenu == 9)return;

}

}

} //submenu end

if(menuOption == 13){ //and menu option is 13 (room 7)

subButton = 0; //resetting the button var

submenu = 1; //submenu counter

lcd.clear(); //clear screen

//retrieving and printing first sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[0]))));

lcd.write(pgm_read_byte(&char_table[11])); //printing assigned room number 7

while(submenu < submenus){ //loop through the sub menu points

subButton = read_act_buttons(); //checking for pressed buttons

if(subButton == btnMenu){ //if button Menu was pressed

submenu++; //add 1 - move to the next sub menu point

if(submenu == 2){ //if we are at sub menu 2

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[1]))));

lcd.write(pgm_read_byte(&char_table[11])); //printing assigned room number 7

}

if(submenu == 3){ //if we are at sub menu 3

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[2]))));

lcd.write(pgm_read_byte(&char_table[11])); //printing assigned room number 7

}

if(submenu == 4){ //if we are at sub menu 4

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[3]))));

lcd.write(pgm_read_byte(&char_table[11])); //printing assigned room number 7

}

if(submenu == 5){ //if we are at sub menu 5

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[4]))));

lcd.write(pgm_read_byte(&char_table[11])); //printing assigned room number 7

}

if(submenu == 6){ //if we are at sub menu 6

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[5]))));

lcd.write(pgm_read_byte(&char_table[11])); //printing assigned room number 7

lcd.setCursor(0, 1);

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0]))));

}

if(submenu == 7){ //if we are at sub menu 7

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[6]))));

lcd.write(pgm_read_byte(&char_table[11])); //printing assigned room number 7

lcd.setCursor(0, 1);

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0]))));

}

if(submenu == 8){ //if we are at sub menu 8

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[7]))));

lcd.write(pgm_read_byte(&char_table[11])); //printing assigned room number 7

lcd.setCursor(0, 1);

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0]))));

}

if(submenu == 9){ //if we are at sub menu 9

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[8]))));

lcd.write(pgm_read_byte(&char_table[11])); //printing assigned room number 7

lcd.setCursor(0, 1);

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0]))));

}

}

if(subButton == btnSelect){ //if we pressed btnSelect

if(submenu == 1){ //and submenu is 1

//call the function get_delay() to change the setting

delayTime[6] = get_delay(9, 7, dBath3);

return;

}

if(submenu == 2){ //and sub menu is 2

//call the function get_offon to change the setting

room7MActive = get_offon(10, 7, room7MActive);

return;

}

if(submenu == 3){ //and submenu is 3

//call the function get_setTime() to change timer 1

get_setTime(room_timers[6][0][0], room_timers[6][0][1],

room_timers[6][0][2], room_timers[6][0][3],

6, 0);

return;

}

if(submenu == 4){ //and submenu is 4

//call the function get_offon() to change the setting

room701Active = get_offon(11, 7, room701Active);

return;

}

if(submenu == 5){ //and submenu is 5

//call the function get_setTime() to change timer 2

get_setTime(room_timers[6][1][0], room_timers[6][1][1],

room_timers[6][1][2], room_timers[6][1][3],

6, 1);

return;

}

if(submenu == 6)return;

if(submenu == 7)return;

if(submenu == 8)return;

if(submenu == 9)return;

}

}

} //submenu end

if(menuOption == 14){ //and menu option is 14 (room 8)

subButton = 0; //resetting the button var

submenu = 1; //submenu counter

lcd.clear(); //clear screen

//retrieving and printing first sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[0]))));

lcd.write(pgm_read_byte(&char_table[12])); //printing assigned room number 7

while(submenu < submenus){ //loop through the sub menu points

subButton = read_act_buttons(); //checking for pressed buttons

if(subButton == btnMenu){ //if button Menu was pressed

submenu++; //add 1 - move to the next sub menu point

if(submenu == 2){ //if we are at sub menu 2

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[1]))));

lcd.write(pgm_read_byte(&char_table[12])); //printing assigned room number 7

}

if(submenu == 3){ //if we are at sub menu 3

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[2]))));

lcd.write(pgm_read_byte(&char_table[12])); //printing assigned room number 7

}

if(submenu == 4){ //if we are at sub menu 4

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[3]))));

lcd.write(pgm_read_byte(&char_table[12])); //printing assigned room number 7

}

if(submenu == 5){ //if we are at sub menu 5

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[4]))));

lcd.write(pgm_read_byte(&char_table[12])); //printing assigned room number 7

}

if(submenu == 6){ //if we are at sub menu 6

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[5]))));

lcd.write(pgm_read_byte(&char_table[12])); //printing assigned room number 7

lcd.setCursor(0, 1);

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0]))));

}

if(submenu == 7){ //if we are at sub menu 7

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[6]))));

lcd.write(pgm_read_byte(&char_table[12])); //printing assigned room number 7

lcd.setCursor(0, 1);

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0]))));

}

}

if(subButton == btnSelect){ //if we pressed btnSelect

if(submenu == 1){ //and submenu is 1

//call the function get_delay() to change the setting

delayTime[7] = get_delay(9, 8, dBath4);

return;

}

if(submenu == 2){ //and sub menu is 2

//call the function get_offon to change the setting

room8MActive = get_offon(10, 8, room8MActive);

return;

}

if(submenu == 3){ //and submenu is 3

//call the function get_setTime() to change timer 1

get_setTime(room_timers[7][0][0], room_timers[7][0][1],

room_timers[7][0][2], room_timers[7][0][3],

7, 0);

return;

}

if(submenu == 4){ //and submenu is 4

//call the function get_offon() to change the setting

room801Active = get_offon(11, 8, room801Active);

return;

}

if(submenu == 5){ //and submenu is 5

//call the function get_setTime() to change timer 2

get_setTime(room_timers[7][1][0], room_timers[7][1][1],

room_timers[7][1][2], room_timers[7][1][3],

7, 1);

return;

}

if(submenu == 6)return;

if(submenu == 7)return;

if(submenu == 8)return;

if(submenu == 9)return;

}

}

} //submenu end

if(menuOption == 15){ //and menu option is 15 (room 9)

subButton = 0; //resetting the button var

submenu = 1; //submenu counter

lcd.clear(); //clear screen

//retrieving and printing first sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[0]))));

lcd.write(pgm_read_byte(&char_table[13])); //printing assigned room number 7

while(submenu < submenus){ //loop through the sub menu points

subButton = read_act_buttons(); //checking for pressed buttons

if(subButton == btnMenu){ //if button Menu was pressed

submenu++; //add 1 - move to the next sub menu point

if(submenu == 2){ //if we are at sub menu 2

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[1]))));

lcd.write(pgm_read_byte(&char_table[13])); //printing assigned room number 7

}

if(submenu == 3){ //if we are at sub menu 3

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[2]))));

lcd.write(pgm_read_byte(&char_table[13])); //printing assigned room number 7

}

if(submenu == 4){ //if we are at sub menu 4

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[3]))));

lcd.write(pgm_read_byte(&char_table[13])); //printing assigned room number 7

}

if(submenu == 5){ //if we are at sub menu 5

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[4]))));

lcd.write(pgm_read_byte(&char_table[13])); //printing assigned room number 7

}

if(submenu == 6){ //if we are at sub menu 6

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[5]))));

lcd.write(pgm_read_byte(&char_table[13])); //printing assigned room number 7

lcd.setCursor(0, 1);

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0]))));

}

if(submenu == 7){ //if we are at sub menu 7

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[6]))));

lcd.write(pgm_read_byte(&char_table[13])); //printing assigned room number 7

lcd.setCursor(0, 1);

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0]))));

}

if(submenu == 8){ //if we are at sub menu 8

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[7]))));

lcd.write(pgm_read_byte(&char_table[13])); //printing assigned room number 7

lcd.setCursor(0, 1);

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0]))));

}

if(submenu == 9){ //if we are at sub menu 9

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[8]))));

lcd.write(pgm_read_byte(&char_table[13])); //printing assigned room number 7

lcd.setCursor(0, 1);

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0]))));

}

}

if(subButton == btnSelect){ //if we pressed btnSelect

if(submenu == 1){ //and submenu is 1

//call the function get_delay() to change the setting

delayTime[8] = get_delay(9, 9, dKitchen);

return;

}

if(submenu == 2){ //and sub menu is 2

//call the function get_offon to change the setting

room9MActive = get_offon(10, 9, room9MActive);

return;

}

if(submenu == 3){ //and submenu is 3

//call the function get_setTime() to change timer 1

get_setTime(room_timers[8][0][0], room_timers[8][0][1],

room_timers[8][0][2], room_timers[8][0][3],

8, 0);

return;

}

if(submenu == 4){ //and submenu is 4

//call the function get_offon() to change the setting

room901Active = get_offon(11, 9, room901Active);

return;

}

if(submenu == 5){ //and submenu is 5

//call the function get_setTime() to change timer 2

get_setTime(room_timers[8][1][0], room_timers[8][1][1],

room_timers[8][1][2], room_timers[8][1][3],

8, 0);

return;

}

if(submenu == 6)return;

if(submenu == 7)return;

if(submenu == 8)return;

if(submenu == 9)return;

}

}

} //submenu end

if(menuOption == 16){ //and menu option is 16 (room 10)

subButton = 0; //resetting the button var

submenu = 1; //submenu counter

lcd.clear(); //clear screen

//retrieving and printing first sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[0]))));

lcd.print("10"); //printing assigned room number 10

while(submenu < submenus){ //loop through the sub menu points

subButton = read_act_buttons(); //checking for pressed buttons

if(subButton == btnMenu){ //if button Menu was pressed

submenu++; //add 1 - move to the next sub menu point

if(submenu == 2){ //if we are at sub menu 2

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[1]))));

lcd.print("10"); //printing assigned room number 10

}

if(submenu == 3){ //if we are at sub menu 3

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[2]))));

lcd.print("10"); //printing assigned room number 10

}

if(submenu == 4){ //if we are at sub menu 4

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[3]))));

lcd.print("10"); //printing assigned room number 10

}

if(submenu == 5){ //if we are at sub menu 5

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[4]))));

lcd.print("10"); //printing assigned room number 10

}

if(submenu == 6){ //if we are at sub menu 6

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[5]))));

lcd.print("10"); //printing assigned room number 10

lcd.setCursor(0, 1); //set cursor second row, first column

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0])))); //print NOT USED

}

if(submenu == 7){ //if we are at sub menu 7

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[6]))));

lcd.print("10"); //printing assigned room number 10

lcd.setCursor(0, 1); //set cursor second row, first column

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0])))); //print NOT USED

}

if(submenu == 8){ //if we are at sub menu 8

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[5]))));

lcd.print("10"); //printing assigned room number 10

lcd.setCursor(0, 1); //set cursor second row, first column

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0])))); //print NOT USED

}

if(submenu == 9){ //if we are at sub menu 9

lcd.clear();

//retrieve and print second sub menu point

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(submenu_table[6]))));

lcd.print("10"); //printing assigned room number 10

lcd.setCursor(0, 1); //set cursor second row, first column

lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(msg_table[0])))); //print NOT USED

}

}

if(subButton == btnSelect){ //if we pressed btnSelect

if(submenu == 1){ //and submenu is 1

//call the function get_delay() to change the setting

delayTime[9] = get_delay(9, 10, dCorridor);

return;

}

if(submenu == 2){ //and sub menu is 2

//call the function get_offon to change the setting

room10MActive = get_offon(10, 10, room10MActive);

return;

}

if(submenu == 3){ //and submenu is 3

//call the function get_setTime() to change timer 1

get_setTime(room_timers[9][0][0], room_timers[9][0][1],

room_timers[9][0][2], room_timers[9][0][3],

9, 0);

return;

}

if(submenu == 4){ //and sub menu is 4

//call the function get_offon to change the setting

room10MActive = get_offon(11, 10, room10MActive);

return;

}

if(submenu == 5){ //and submenu is 5

//call the function get_setTime() to change timer 1

get_setTime(room_timers[9][1][0], room_timers[9][1][1],

room_timers[9][1][2], room_timers[9][1][3],

9, 1);

return;

}

if(submenu == 6) return;

if(submenu == 7) return;

if(submenu == 8) return;

if(submenu == 9) return;

}

}

} //submenu end

}

}

}

As today's final, we change the get_setTime() function to fit the new function calls in the sub menus.

byte get_setTime(char timeText[], byte onTimeH,

byte onTimeM, byte offTimeH,

byte offTimeM, byte room){

changes to

byte get_setTime( byte onTimeH, byte onTimeM, byte offTimeH,

byte offTimeM, byte room, byte timer){

Than we delete the complete part where we pass the updated variables back:


//This part to DELETE all!!

if(room == 1){

room1OnM[0] = onTimeH;

room1OnM[1] = onTimeM;

room1OffM[0] = offTimeH;

room1OffM[1] = offTimeM;

}

if(room == 2){

room1On1[0] = onTimeH;

room1On1[1] = onTimeM;

room1Off1[0] = offTimeH;

room1Off1[1] = offTimeM;

}

if(room == 3){

room1On2[0] = onTimeH;

room1On2[1] = onTimeM;

room1Off2[0] = offTimeH;

room1Off2[1] = offTimeM;

}

if(room = 11){

room2OnM[0] = onTimeH;

room2OnM[1] = onTimeM;

room2OffM[0] = offTimeH;

room2OffM[1] = offTimeM;

}

if(room = 12){

room2On1[0] = onTimeH;

room2On1[1] = onTimeM;

room2Off1[0] = offTimeH;

room2Off1[1] = offTimeM;

}

and we replace it with:


room_timers[room][timer][0] = onTimeH;

room_timers[room][timer][1] = onTimeM;

room_timers[room][timer][2] = offTimeH;

room_timers[room][timer][3] = offTimeM;

The next task on the to do list is getting the sub menu  into a function not to repeat the same bit of code 10 times as we are doing in the moment.

No comments:

Post a Comment