Rotary selector change output to lcd, and lcd clear only once per change

Hello,

I am trying to build a small home automator with an arduino mega 2560 r3, ethernet shield, a 20x4 lcd, a custom build 6 button board, 8 relay, a rotary selector, a real time clock, an SD card for data logging and website files, and a lot of sensors (3 temperature, 3 humidity, 2 LDR).

6 buttons are used for navigation in Menwiz menu.

The lcd display shows 6 different things according to the rotary selector possition.
Position:

  1. Line one: Clock and date. Line three and four: relay states
  2. Line one: Temp 1, Line two: Temp2, Line three: Temp 3, Line four: RTC Temp (in box temp)
  3. Line one: Humidity 1, Line two: Humidity 2, Line three: Humidity 3
  4. Line one: LDR 1, Line two: LDR 2, Line three: LDR 3
  5. MenWiz menu
  6. Serial console output for debug.

Temperature sensors triggers three relays
Humidity sensors triggers three relays
One relay is being triggered via one LDR sensor (the other LDR is there only for data log)
and the last relay is being triggered via time scedule.

my problem is that i want to clear the lcd when i change the output to it via the rotary selector, and prepare it for different data on it. But i want to do it only once after i change the rotary selector possition.

the code has become quite..... complex for me since i know nothing about programming.

I have found a threat here about the same thing but i really cannot understand how that works.

                                  /*------------------------------------*                                                 
 	                           *       PARAMETERS & LIBRARIES *
                                   *------------------------------------*/

                                                                    /*-----( Setup Pins for rotary button selector )-----*/
const int ROTARY_BUTTON_1_PIN = 22;                                                            // Pin for the Up button.
const int ROTARY_BUTTON_2_PIN = 24;                                                            // Pin for the Down button.
const int ROTARY_BUTTON_3_PIN = 26;                                                            // Pin for the Esc button.
const int ROTARY_BUTTON_4_PIN = 28;                                                            // Pin for the Enter button.
const int ROTARY_BUTTON_5_PIN = 30;                                                            // Pin for the Esc button.
const int ROTARY_BUTTON_6_PIN = 32;                                                            // Pin for the Enter button.
int ROTARY_BUTTON_1_State= 0;                                                                  // variable for reading the rotary button status
int ROTARY_BUTTON_2_State= 0;                                                                  // variable for reading the rotary button status
int ROTARY_BUTTON_3_State= 0;                                                                  // variable for reading the rotary button status
int ROTARY_BUTTON_4_State= 0;                                                                  // variable for reading the rotary button status
int ROTARY_BUTTON_5_State= 0;                                                                  // variable for reading the rotary button status
int ROTARY_BUTTON_6_State= 0;                                                                  // variable for reading the rotary button status
int ROTARY_BUTTON_1_Old_State= 0;                                                              // variable for storing the rotary button last state
int ROTARY_BUTTON_2_Old_State= 0;                                                              // variable for storing the rotary button last state
int ROTARY_BUTTON_3_Old_State= 0;                                                              // variable for storing the rotary button last state
int ROTARY_BUTTON_4_Old_State= 0;                                                              // variable for storing the rotary button last state
int ROTARY_BUTTON_5_Old_State= 0;                                                              // variable for storing the rotary button last state
int ROTARY_BUTTON_6_Old_State= 0;                                                              // variable for storing the rotary button last state



                                  /*------------------------------------* 
 	                           *         SETUP: RUNS ONCE           *
                                   *------------------------------------*/
void setup()
{
                                                                      /*----( Setup rotary button selector pins as inputs )----*/
  pinMode(ROTARY_BUTTON_1_PIN, INPUT);                                                         // Set up defined name/pin as input.
  pinMode(ROTARY_BUTTON_2_PIN, INPUT);                                                         // Set up defined name/pin as input.
  pinMode(ROTARY_BUTTON_3_PIN, INPUT);                                                         // Set up defined name/pin as input.
  pinMode(ROTARY_BUTTON_4_PIN, INPUT);                                                         // Set up defined name/pin as input.
  pinMode(ROTARY_BUTTON_5_PIN, INPUT);                                                         // Set up defined name/pin as input.
  pinMode(ROTARY_BUTTON_6_PIN, INPUT);                                                         // Set up defined name/pin as input.
  digitalWrite(ROTARY_BUTTON_1_PIN, HIGH);                                                     // Enable internal pull-up
  digitalWrite(ROTARY_BUTTON_2_PIN, HIGH);                                                     // Enable internal pull-up
  digitalWrite(ROTARY_BUTTON_3_PIN, HIGH);                                                     // Enable internal pull-up
  digitalWrite(ROTARY_BUTTON_4_PIN, HIGH);                                                     // Enable internal pull-up
  digitalWrite(ROTARY_BUTTON_5_PIN, HIGH);                                                     // Enable internal pull-up
  digitalWrite(ROTARY_BUTTON_6_PIN, HIGH);                                                     // Enable internal pull-up
}
                                                                         // Print this 
}
                                  /*------------------------------------* 
 	                           *       LOOP: RUNS CONSTANTLY        *
                                   *------------------------------------*/

void loop()
{
  ROTARY_BUTTON_1_State = digitalRead(ROTARY_BUTTON_1_PIN); 
  ROTARY_BUTTON_2_State = digitalRead(ROTARY_BUTTON_2_PIN); 
  ROTARY_BUTTON_3_State = digitalRead(ROTARY_BUTTON_3_PIN); 
  ROTARY_BUTTON_4_State = digitalRead(ROTARY_BUTTON_4_PIN); 
  ROTARY_BUTTON_5_State = digitalRead(ROTARY_BUTTON_5_PIN);
  ROTARY_BUTTON_6_State = digitalRead(ROTARY_BUTTON_6_PIN);


  if (ROTARY_BUTTON_1_State== LOW) 
  {
    digitalClockDisplayLcd();
    lcd.setCursor(0,1);                                                                        // Start at character 1 on line 2.
    lcd.print("                    ");                                                         // clear line 1
    lcd.setCursor(0,2);                                                                        // Start at character 1 on line 3.
    lcd.print("                    ");                                                         // clear line 1
    lcd.setCursor(0,3);                                                                        // Start at character 1 on line 4. 
    lcd.print("                    ");                                                         // clear line 1
      
  
  } 
  else if(ROTARY_BUTTON_2_State== LOW)
  { 
    lcd.clear();                                                                               // Clear the screen and prepare it for the data loop on it.
                                                                       /*----( DS18B20  Inside Temperature Sensor to LCD print in Celsius )----*/
    lcd.setCursor(2,0);                                                                        // Start at character 2 on line 1.
    lcd.print("Temp1: ");                                                                      // Print this.
      lcd.print(InsideTempC);                                                                  // Print the measurement (in Celsius units) on the LCD screen.
      lcd.print("  ");                                                                         // Print an empty character.
      lcd.print( (char)223);                                                                   // Print Celsius symbol.
      lcd.print("C");                                                                          // Print this.
      if(InsideTempC<100)                                                                      // If temp measurement goes from 3 characters to 2. Fix for old stacked character on screen when from 3 characters the measurement goes to 2.
        {
          lcd.print(" ");                                                                      // Print this.
        }                                                   
      if(InsideTempC<1000)                                                                     // If temp measurement goes from 4 characters to 3. Fix for old stacked character on screen when from 4 characters the measurement goes to 3.
        {
          lcd.print("  ");                                                                     // Print this.
        }
                                                                  /*----( DS18B20 Outside Temperature Sensor to LCD print in Celsius )----*/
    lcd.setCursor(2,1);                                                                        // Start at character 2 on line 2.
    lcd.print("Temp2: ");                                                                      // Print this.
      lcd.print(OutsideTempC);                                                                 // Print the measurement (in Celsius units) on the LCD screen.
      lcd.print("  ");                                                                          // Print an empty character.
      lcd.print( (char)223);                                                                   // Print Celsius symbol.
      lcd.print("C");                                                                          // Print this.
      if(OutsideTempC<100)                                                                     // If temp measurement goes from 3 characters to 2. Fix for old stacked character on screen when from 3 characters the measurement goes to 2.
        {
          lcd.print(" ");                                                                      // Print this.
        }                                                   
      if(OutsideTempC<1000)                                                                    // If temp measurement goes from 4 characters to 3. Fix for old stacked character on screen when from 4 characters the measurement goes to 3.
        {
          lcd.print("  ");                                                                     // Print this.
        }
                                                                    /*----( DHT22 Temperature Sensor to LCD print in Celsius )----*/
    lcd.setCursor(2,2);                                                                        // Start at character 2 on line 3.
    lcd.print("Temp3: ");                                                                      // Print this.
      lcd.print(DHT22tempC);                                                                   // Print the measurement (in Celsius units) on the LCD screen.
      lcd.print("  ");                                                                          // Print an empty character.
      lcd.print( (char)223);                                                                   // Print Celsius symbol.
      lcd.print("C");                                                                          // Print this.
      if(DHT22tempC<100)                                                                       // If temp measurement goes from 3 characters to 2. Fix for old stacked character on screen when from 3 characters the measurement goes to 2.
        {
          lcd.print(" ");                                                                      // Print this.
        }                                                   
      if(DHT22tempC<1000)                                                                      // If temp measurement goes from 4 characters to 3. Fix for old stacked character on screen when from 4 characters the measurement goes to 3.
        {
          lcd.print("  ");                                                                     // Print this.
        }
                                                                    /*----( RTC Temperature Sensor to LCD print in Celsius )----*/
    lcd.setCursor(1,3);                                                                        // Start at character 1 on line 4.
    lcd.print("AVR Temp: ");                                                                   // Print this.
      lcd.print(RTCTempC);                                                                     // Print the measurement (in Celsius units) on the LCD screen.
      lcd.print(" ");                                                                          // Print an empty character.
      lcd.print( (char)223);                                                                   // Print Celsius symbol.
      lcd.print("C");                                                                          // Print this.
      if(RTCTempC<100)                                                                         // If temp measurement goes from 3 characters to 2. Fix for old stacked character on screen when from 3 characters the measurement goes to 2.
        {
          lcd.print(" ");                                                                      // Print this.
        }                                                   
      if(RTCTempC<1000)                                                                        // If temp measurement goes from 4 characters to 3. Fix for old stacked character on screen when from 4 characters the measurement goes to 3.
        {
          lcd.print("  ");                                                                     // Print this.
        }
         delay(1500);                                                                                 // Adds delay before next step. 
  }

sorry for multi posting but 9000 chars limit.

The code goes as this and what i need to do is take away the lcd clear from running all the time in the loop and make the lcd screen flicker.

basically if someone is willing to explain my how do i compare theold state to the current state and run it in after the change of the rotary selector only once......

i really cannot get that.

Thanks in advance

and again sorry for multi posting.

god damn that was so easy.

I just had to think this with simple logic.

what i want to do and when.

so the logic is to have a variable for storing the current rotary state. then have a variable to store the last known state.

at the end of the loop i am updating the last known state with the current state.

the code that works right now is this

void loop()
{
   ROTARY_BUTTON_1_State = digitalRead(ROTARY_BUTTON_1_PIN);


   if (ROTARY_BUTTON_1_State== LOW) 
   {
      if (ROTARY_BUTTON_1_State != ROTARY_BUTTON_1_Old_State) 
      {
        lcd.clear();
      }
      else
      {
       digitalClockDisplayLcd();
      }
   }

  ROTARY_BUTTON_1_Old_State = ROTARY_BUTTON_1_State;
}