swich case aiuto

buona sera a tutti, ho fatto questo programma, che funziona. ho messo degli swich case per scrivere su lcd i vari dati.
ora io vorrei che quando if (voltage <= 4.9) e vera andasse nello swich page = 5 e vi restasse per tot tempo, finito il tempo ritorni in page 1 e che cambi in base alla pressione del tasto.
e si ripresentasse dopo tot tempo, so che e’ una stipudata ma non riiesco a vedere dove sbaglio
ringrazio in anticipo per il vostro aiuto

#include <SPI.h>
#include <RF24.h>
//#include <Adafruit_Sensor.h>
#include <nRF24L01.h>
#include <Wire.h>
RF24 radio (10, 9);
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 8, 4, 3, 2);

const byte addresses[6] = {"00001" };


byte fuori [8] = {
  B11111,
  B10001,
  B10001,
  B00100,
  B00100,
  B11111,
  B01110,
  B00100
};
int den;
byte dentro[8] = {
  B11111,
  B10001,
  B10001,
  B00100,
  B01110,
  B11111,
  B00100,
  B00100
};
byte up[8] = {
  B00000,
  B00100,
  B01110,
  B11111,
  B00100,
  B00100,
  B00100,
  B00100
};
byte down[8] = {
  B00000,
  B00100,
  B00100,
  B00100,
  B11111,
  B01110,
  B00100,
  B00000
};
byte stabile[8] = {
  B00100,
  B01110,
  B11111,
  B00100,
  B00100,
  B11111,
  B01110,
  B00100
};
int sensorValue;
float voltage ;
int a;

bool tab = 1; //

boolean old_lcd;  //pulsante luce
int pulsante = LOW;
int stato = 0;
int page = 1;
int P_old = 0;
int led = 2;
int old_lcd_page;
int lcd_page = 1;
unsigned long tempo;
unsigned long tempo1;
unsigned long tempo2;
unsigned long lettura;
unsigned long millisbatt;
//------------dati in arrivo------------
struct Ricezione
{

  bool stato;
  bool errore = 0;
  float volt = 4100.00;
  float humi = 0.0 ;
  float temp = 0.0;
};
struct Ricezione  ricezione;
float  volts = 0.00;
float batt = 4000.0 ;
float temp_new;
float humi_new;
float temp_old;
float humi_old;
boolean flag = 1;
boolean flag1 = 1;
void setup()
{
  pinMode (20, OUTPUT);
  pinMode (5, OUTPUT);
  pinMode (6, INPUT_PULLUP);
  pinMode (A1, INPUT);
  pinMode (16, INPUT_PULLUP);
  pinMode (14, INPUT_PULLUP);

  lcd.begin(16, 2);                     // initialize the lcd
  lcd.begin(16, 2);
  lcd.createChar(0, dentro);
  lcd.createChar(1, fuori);
  lcd.createChar(3, up);
  lcd.createChar(4, down);
  lcd.createChar(5, stabile);
  Serial.begin(9600);

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Hello world...");
  radio.begin();
  radio.setChannel(100);
  radio.setPALevel(RF24_PA_MIN);
  radio.setDataRate( RF24_250KBPS ) ;
  //radio.openWritingPipe( addresses); //( addresses[0]);
  radio.openReadingPipe(1, addresses[0]); // (1, addresses[1]);
  //radio.openReadingPipe(2, addresses[1]);
  radio.startListening();
  delay(1500);
  lcd.clear();

}
void loop() {
  volts = ricezione.volt / 1000;
  if (voltage <= 4.9) {     //funzione rele' carica
    digitalWrite(20, LOW);  //batteria base
    // page = 5;
  }
  if (voltage >= 4.2) {
    digitalWrite(20, HIGH);
  }
  if (volts <= 2.9) {     //funzione rele' carica
    digitalWrite(20, LOW);  //batteria tx
    // page = 4;

  }
  if (volts  >= 4.2) {
    digitalWrite(20, HIGH);

  }


  if (millis() - lettura > 5000) {
    lettura = millis();
    sensorValue = analogRead(A1);
    voltage = sensorValue * (4.9 / 1023.0);

  }
  if (led == 0) {
    analogWrite(5, 0);
  }
  if (led == 1) {
    analogWrite(5, 64);
  }
  if (led == 2) {
    analogWrite(5, 128);
  }

  Serial.println(page);
  if (millis() -  tempo1 > 50000) { //azioni da fare
    tempo1 = millis(); //ogni  interval2=1000 ms
    temp_new = ricezione.temp;
    humi_new = ricezione.humi;
  }

  if (radio.available()) {
    radio.read(&ricezione, sizeof(ricezione));
    led = 2;
    tempo2 = millis();
    a++;
  }
  if (millis() -  tempo2 > 5000) { //azioni da fare
    if (!radio.available()) {
      led = 1;
    }
  }
  if (millis() -  tempo2 > 20000) { //azioni da fare
    led = 0;
  }
  pulsante = digitalRead(16) ;             //cosi evita i
  if (pulsante == LOW && stato == 0) {
    if (page > 3) {
      page = 1;
    }
    led = 2;
    tempo2 = millis();
    tempo = millis();
    page = page + 1;
    stato = 1;
  }
  else if (pulsante == HIGH) {
    stato = 0;
  }
  if (pulsante == LOW && page > 3) {
    page = 1;
  }

  if (page != 1 && flag == 1) {
    tempo = millis();
    flag = 0;
  }
  if (millis() - tempo > 15000  ) {
    led = 0;
    page = 1;
    flag = 1;
  }
  if (page != old_lcd_page) {
    lcd.clear();
  }
  old_lcd_page = page;
  switch (page) {
    case 1: {
        lcd.setCursor(0, 6 );
        if (ricezione.temp != temp_old ||  tab == 1) { //se cambia
          lcd.setCursor(0, 1 );
          lcd.print(ricezione.temp, 1);
          lcd.print((char)223);
        }
        temp_old = ricezione.temp;
        if (ricezione.humi != humi_old ||  tab == 1) {
          lcd.setCursor(0, 0 );
          lcd.print(ricezione.humi, 1);
          lcd.print("%");
        }
        humi_old = ricezione.humi;
        if (ricezione.humi < humi_new || tab == 1) {
          lcd.setCursor(6, 0);
          lcd.write(byte(4));
        }
        if (ricezione.humi >  humi_new || tab == 1) {
          lcd.setCursor(6, 0);
          lcd.write(byte(3));
        }
        if (ricezione.humi ==  humi_new || tab == 1) {
          lcd.setCursor(6, 0);
          lcd.write(byte(5));
        }
        if (ricezione.temp < temp_new || tab == 1) {
          lcd.setCursor(6, 1);
          lcd.write(byte(4));
        }
        if (ricezione.temp > temp_new || tab == 1) {
          lcd.setCursor(6, 1);
          lcd.write(byte(3));
        }
        if (ricezione.temp == temp_new || tab == 1) {
          lcd.setCursor(6, 1);
          lcd.write(byte(5));
        }
        tab = 0;

        if (ricezione.volt < 4100.00  ) {
          lcd.setCursor(7, 0 );
          lcd.print("Bat");
        }
        else {
          lcd.setCursor(7, 0 );
          lcd.print("   ");
        }
        lcd.setCursor(10, 0 );
        // lcd.print(ricezione.volt / 1000, 1);
        //lcd.print("V");


        if (ricezione.errore == 1) {
          lcd.setCursor(7, 1 );
          lcd.print("E");
        }
        else {
          lcd.setCursor(7, 1 );
          lcd.print(" ");
        }
        if (ricezione.stato == 1) {
          lcd.setCursor(15, 1 );
          lcd.print("*");
          //lcd.print((char)255);
        }
        else {
          lcd.setCursor(15, 1 );
          lcd.print("  ");

        }
        break;
      case 2: {
          tab = 1;
          lcd.setCursor(0, 0 );
          lcd.print("n.  data ");
          lcd.setCursor(0, 1 );
          lcd.print(a);

        }
        break;
      case 3: {
          tab = 1;
          lcd.setCursor(0, 0 );
          lcd.print(volts );
          lcd.print("V tx");
          lcd.setCursor(0, 1 );
          lcd.print( voltage);
          lcd.print("V rx");
        }
        break;
      case 4: {
          tab = 1;
          lcd.setCursor(0, 0 );
          lcd.print(F("Ricarica tx"));
          if (digitalRead(14) == HIGH) {
            lcd.setCursor(0, 1 );
            lcd.print(F("errore cavo "));
          }
          else {
            lcd.setCursor(0, 1 );
            lcd.print(F("              "));
          }
        }
        break;
      case 5: {
          tab = 1;
          lcd.setCursor(0, 0 );
          lcd.print(F("Ricarica base"));
          if (digitalRead(14) == HIGH) {
            lcd.setCursor(0, 1 );
            lcd.print(F("errore cavo "));
          }
          else {
            lcd.setCursor(0, 1 );
            lcd.print(F("              "));
          }
        }
        break;
      }
  }
}

Quanti if!! Tutti questi if rendono il tuo codice difficile da capire (almeno per me!)
Ne puoi toglierne qualcuno! Esempio:

if (led == 0) {
    analogWrite(5, 0);
  }
  if (led == 1) {
    analogWrite(5, 64);
  }
  if (led == 2) {
    analogWrite(5, 128);
  }

Puoi sostituirlo con un semplice

analogWrite(5, 64 * led)

Se vuoi che se voltage <= 4.9 va alla page 5 perché l’hai messo in commento?

 if (voltage <= 4.9) {     //funzione rele' carica
    digitalWrite(20, LOW);  //batteria base
    // page = 5;
  }
int a;

Personalmente uso le variabile a una sola lettera nei casi veramente locali (es in un ciclo for).

for (int a = 0; a < 0; a++)

Usare una variabile chiamata “a”, primo, non hai nessuna idea di cosa possa essere,secondo, se fai una ricerca di dove usi questa variabile la cosa diventa molto complicata.

grazie delle tue risposte,e dei tuoi consigli
stavo provando in vari modi ed i segni // mi sono rimasti quando ho copiato il programma, che nella realta' non ci sono
mettendolo cosi , va alla page 5 ma ci resta ed anche premendo il tasto non cambia.
perche' la if presta vera.e mi ritorna a page 5.

mettendolo cosi , va alla page 5 ma ci resta ed anche premendo il tasto non cambia.

Cosi' com'è il tuo programma è normale.
Devi aggiungere un flag

 if (voltage <= 4.9 && flagPage5) {     //funzione rele' carica
    digitalWrite(20, LOW);  //batteria base
    flagPage5 = false;
    page = 5;
  }

  if (millis() - tPage5 > 5000) 
  {
    flagPage5 = true;
    tPage5 = millis();
  }

Prova una cosa cosi!

Rileggi il mio primo post dato che ho aggiunto altre cose.

ora provo, ma scusa il mio dubbio facendo cosi non vado a influenzare anche il comando digitaRead (20)

if (voltage <= 4.9 && flagPage5) {     //funzione rele' carica
    digitalWrite(20, LOW);  //batteria base
    flagPage5 = false;
    page = 5;
  }

non sarebbe meglio cosi?

(voltage <= 4.9) {     //funzione rele' carica
    digitalWrite(20, LOW);  //batteria base
if (flagPage5) {    
flagPage5 = false;
    page = 5;
 } }

ora provo, ma scusa il mio dubbio facendo cosi non vado a influenzare anche il comando digitaRead (20)

Vero.

non sarebbe meglio cosi?

Buona idea. Prova e ci dirai.

allro, seguendo i tuoi consigli ho provato e funziona.
in piu’ ho fatto in modo che dopo 4 secondi ritorna alla page1 ed eventualmente cambiare in base al tasto.
fo scritto correttamente?provando funziona

 if (voltage <= 4.9) {     //funzione rele' carica
    digitalWrite(20, LOW);  //batteria base
    if (flagPage5) {
      voltage_millis = millis();  //richiamo page1
      page = 5;
      flagPage5 = false;

    }
  }
  if (millis() - tPage5 > 15000) {
    flagPage5 = true;
    tPage5 = millis();
}
  if (millis() - voltage_millis > 4000) {
    flagPage = true;
    if (!flagPage5 && flagPage ) {
      page = 1;
      flagPage = false;
      voltage_millis = millis();
    }
  }

fo scritto correttamente

Si, e poi se funziona ancora meglio.

Perché usi una variabile float per la tensione della batteria?... Già la misuri in mV, con una risoluzione dello 0,025% (!). Non ti servono i decimali. Inoltre, potresti usare direttamente la lettura 0...1023 negli if.
Per gli lcd.print nei case, metti un lcd.setCursor(0,0); prima dello switch e ripetilo solo quando serve una posizione diversa.