Problema centralina alba tramonto al settaggio dell'ora

Ciao a tutti.
Sto testando una centralina alba tramonto dotata di rtc, lcd, tre tasti per il settaggio dell’ora e sensore lm35 tutto collegato all’arduino uno.
Da LCD visualizzo potenza dei led caldi e freddi e temperatura dell’acqua il tutto collegato ad una ventola per il raffreddamento dell’acqua d’estate.
Ho da poco aggiunto i tasti per la selezione dell’ora con un menu per il settaggio dato che inizialmente settavo l’ora da PC.
Il problema si presenta quando inserisco nello sketch il menu di selezione per il settaggio dell’ora che nonostante mi faccia visualizzare il menù e settare l’ora, fa bloccare lo schermo senza visualizzare potenza dei led e temperature, ma solo l’ora inoltre si blocca anche la dissolvenza dei led che a quel punto rimangono accesi fissi senza mai spegnersi.
Vi posto lo scketch.

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
// inizializza la libreria con i Pin LCD
LiquidCrystal lcd(13, 12, 5, 4, 3, 2);
RTC_DS1307 RTC;
const int LedFreddo =10;
const int LedCaldo = 11;

//                         00  01  02  03  04  05  06  07  08  09  10  11  12  13  14  15  16  17  18  19  20  21  22  23   
const int ProgFreddo[24]={ 1,  0,  0,  0,  0,  0,  0,  0,  0,   5, 30, 60, 70, 75, 75, 75, 75, 75, 75, 75, 70, 60, 30, 5 };
const int ProgCaldo[24]= { 1,  1,  0,  0,  0,  0,  0,  0,  5,  20, 40, 70, 90, 90, 90, 90, 90, 90, 90, 90, 90, 70, 40, 20};
int OutFreddo, OutCaldo, OutVentola;
int Ventola = 9;
int P1=6;
int P2=7;
int P3=8;
int oraagg;
int minagg;
int annoagg;
int meseagg;
int dayagg;
int menu =0;

void setup()
{
 // Quante colonne e righe ha il display: 
 lcd.begin(16, 2);
 lcd.clear();
 // Inizializzazione dei pulsanti
 pinMode(P1,INPUT);
 pinMode(P2,INPUT);
 pinMode(P3,INPUT);
 pinMode(LedFreddo, OUTPUT);
 pinMode(LedCaldo, OUTPUT);
 pinMode(Ventola, OUTPUT);
 //inizializzo la libreria
 Serial.begin(9600);
 Wire.begin();
 RTC.begin();
 //RTC.sqw(1); 
 if (! RTC.isrunning()) {
   Serial.println("RTC is NOT running!");
   // settiamo la data e l'ora al momento della compilazione
   RTC.adjust(DateTime(__DATE__, __TIME__));
 }
   // di default il display visualizzerà data e ora
 int menu=0;
}

void loop()
{ 
// verifichiamo se viene premuto il pulsante SET e incrementiamo l'indice del menu
 if(digitalRead(P1))
 {
  menu=menu+1;
 }
// a quale subroutine dobbiamo andare?
 if (menu==0)
 {
   DisplayDateTime();
   delay (1000);
 }
 if (menu==1)
 {
   DisplaySetHour();
 }
 if (menu==2)
 {
   DisplaySetMinute();
 }
 if (menu==3)
 {
   DisplaySetYear();
 }
 if (menu==4)
 {
   DisplaySetMonth();
 }
 if (menu==5)
 {
   DisplaySetDay();
 }
 if (menu==6)
 {
   StoreAgg(); 
   delay(500);
   menu=0;
 }
 delay(100);
}

void DisplayDateTime ()
{
// mostriamo la data e l'ora correnti
 DateTime now = RTC.now();
 lcd.clear();
 lcd.setCursor(0, 1);
 if (now.hour()<=9)
 {
   lcd.print("0");
 }
 lcd.print(now.hour(), DEC);
 oraagg=now.hour();
 lcd.print(":");
 if (now.minute()<=9)
 {
   lcd.print("0");
 }
 lcd.print(now.minute(), DEC);
 minagg=now.minute();
 lcd.print(":");
 if (now.second()<=9)
 {
   lcd.print("0");
 }
 lcd.print(now.second(), DEC);
}

void DisplaySetHour()
{
// Impostazione dell'ora
 lcd.clear();
 DateTime now = RTC.now();
 if(digitalRead(P2)==HIGH)
 {
   if(oraagg==23)
   {
     oraagg=0;
   }
   else
   {
     oraagg=oraagg+1;
   }
 }
  if(digitalRead(P3)==HIGH)
 {
   if(oraagg==0)
   {
     oraagg=23;
   }
   else
   {
     oraagg=oraagg-1;
   }
 }
 lcd.setCursor(0,0);
 lcd.print("Imposta Ora:");
 lcd.setCursor(0,1);
 lcd.print(oraagg,DEC);
 delay(200);
}

void DisplaySetMinute()
{
// Impostazione dei minuti
 lcd.clear();
 if(digitalRead(P2)==HIGH)
 {
   if (minagg==59)
   {
     minagg=0;
   }
   else
   {
     minagg=minagg+1;
   }
 }
  if(digitalRead(P3)==HIGH)
 {
   if (minagg==0)
   {
     minagg=59;
   }
   else
   {
     minagg=minagg-1;
   }
 }
 lcd.setCursor(0,0);
 lcd.print("Imposta Minuti:");
 lcd.setCursor(0,1);
 lcd.print(minagg,DEC);
 delay(200);
}
 
void DisplaySetYear()
{
// Impostazione dell'anno
 lcd.clear();
 if(digitalRead(P2)==HIGH)
 {    
   annoagg=annoagg+1;
 }
  if(digitalRead(P3)==HIGH)
 {
   annoagg=annoagg-1;
 }
 lcd.setCursor(0,0);
 lcd.print("Imposta Anno:");
 lcd.setCursor(0,1);
 lcd.print(annoagg,DEC);
 delay(200);
}

void DisplaySetMonth()
{
// Impostazione del mese
 lcd.clear();
 if(digitalRead(P2)==HIGH)
 {
   if (meseagg==12)
   {
     meseagg=1;
   }
   else
   {
     meseagg=meseagg+1;
   }
 }
  if(digitalRead(P3)==HIGH)
 {
   if (meseagg==12)
   {
     meseagg=12;
   }
   else
   {
     meseagg=meseagg-1;
   }
 }
 lcd.setCursor(0,0);
 lcd.print("Imposta Mese:");
 lcd.setCursor(0,1);
 lcd.print(meseagg,DEC);
 delay(200);
}

void DisplaySetDay()
{
// Impostazione del giorno
 lcd.clear();
 if(digitalRead(P2)==HIGH)
 {
   if (dayagg==31)
   {
     dayagg=1;
   }
   else
   {
     dayagg=dayagg+1;
   }
 }
  if(digitalRead(P3)==HIGH)
 {
   if (dayagg==1)
   {
     dayagg=31;
   }
   else
   {
     dayagg=dayagg-1;
   }
 }
 lcd.setCursor(0,0);
 lcd.print("Imposta Giorno:");
 lcd.setCursor(0,1);
 lcd.print(dayagg,DEC);
 delay(200);
}

void StoreAgg()
{
// Salvataggio delle variabili
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("SALVATAGGIO IN");
 lcd.setCursor(0,1);
 lcd.print("CORSO");
 RTC.adjust(DateTime(annoagg,meseagg,dayagg,oraagg,minagg,0));
 delay(200);  
 
 CalcolaLed();
 DisplayDateTime ();
 lcd.clear();
}
void CalcolaLed() {
 DateTime now = RTC.now();
 int OraAttuale, OraFutura, Minuto, Differenza;
 float Incremento, Attuale, T1;
 OraFutura = (now.hour()%24+1)%24;
//---------------------------------------------------------------------------  
 Differenza=ProgFreddo[OraFutura]-ProgFreddo[now.hour()%24];
 Incremento=Differenza/60.0;
 Attuale=Incremento*now.minute()+ProgFreddo[now.hour()%24];
 OutFreddo= Attuale * 255 / 100 ;
 lcd.setCursor(0,0);
 lcd.print("F");
 lcd.print((int)Attuale);
//---------------------------------------------------------------------------  
 Differenza=ProgCaldo[OraFutura]-ProgCaldo[now.hour()%24];
 Incremento=Differenza/60.0;
 Attuale=Incremento*now.minute()+ProgCaldo[now.hour()%24];
 OutCaldo= Attuale * 255 / 100 ;
 lcd.setCursor(5,0);
 lcd.print("C");
 lcd.print((int)Attuale);
 analogWrite(LedFreddo, OutFreddo); 
 analogWrite(LedCaldo, OutCaldo); 
 T1=analogRead(A0)*0.51;
 lcd.setCursor(9,0);
 lcd.print("T:");
 lcd.print((int)T1); 
 lcd.print(" C ");
 analogRead(A0);
 if(T1 <29)
 analogWrite(Ventola,HIGH);
 else
 analogWrite(Ventola,LOW);
 }

Ho fatto diverse ricerche su internet e quì nel forum, ma sto provando a capire come mai non va anche se effettivamente i led si accendono quando setto l’ora ad esempio si nota che se setto da pulsanti le 12 i led risultano molto più luminosi rispetto a quando setto le 23.
Sarà mica qualche delay di troppo?

Prima impressione "a caldo": ma tu quando premi il pulsante dove verifichi che l'utente non lo stia ancora premendo? Nel loop() non ci sono verifiche di questo tipo, quindi mi sembra molto probabile che il tempo che intercorre tra quando premi il pulsante e quando lo lasci sia superiore a quei delay() quindi la variabile menu varia molto rapidamente per tutti i valori, impedendoti di gestire correttamente la pressione del tasto.

Quando rilevi che il tasto è premuto, devi attendere che venga rilasciato prima di verificare nuovamente (ed ovviamente questo non devi farlo con delay() o while. Vedi i vari esempi di gestione della pressione di un pulsante, questo è un classico spezzone di codice per gestire questo:

   ...
int val = 0;
int vecchio_val = 0;
int stato = 0;

void loop() {  
  val = digitalRead(BUTTON);
  
  if ((val == HIGH) && (vecchio_val == LOW)){  
    stato = 1 - stato;  
  }   
  vecchio_val = val;            // ricordiamo il valore precedente di val  
  
  if (stato == 1) {
    // Pulsante premito, faccio qualcosa
  ....

Credo di aver risolto. In realta il delay(1000) su DisplayDateTime del menu ==0 bloccava il ciclo loop sull'ora senza far visualizzare nient'altro su lcd e bloccando la dissolvenza dei led. Ho risolto posizionando il CalcolaLed() in if(menù == 0) insieme a DisplayDateTime();

if (menu==0) { DisplayDateTime(); CalcolaLed(); } Ora sta andando vediamo come va Arduino è davvero un portento anche se ho poche basi di programmazione fa fare delle cose incredibili. Prossimamente Rele shild o meglio ancora relè per pilotaggio carichi a 220 volt. Immagino che servirà un circuito di pilotaggio.

Ok, ma per me resta il problema che ti ho segnalato, ti conviene gestire meglio le pressioni del tasto…