Progetto Sistema di irrigazione automatizzato

Buonasera,

nel mio piccolo ho realizzato un sistema di irrigazione automatizzato a 4 zone che al momento è perfettamente funzionante
ma vorrei effettuare degli upgrade ma sto trovando molta difficoltà nella realizzazione
mi spiego meglio sto già utilizzando 5 tasti per poter sistemare l'ora del modulo RTC
e 4 tasti per l'attivazione manuale dei vari settori
ora vorrei poter impostare tramite i tasti e il display anche le ore di attivazione e spegnimento dei vari settori che (al momento posso solo modificare tramite codice da poi ricaricare su Arduino) utilizzando un menu simile a quello già utilizzato per l'impostazione delle ore
qualcuno di voi mi potrebbe aiutare premetto di essere un neofita di Arduino

Allego il codice completo:

/**********************************************************
 *
 * Created by Tizianoz
 * Ultima modifica 24 marzo 2024
 *
/**********************************************************/

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>


/**********************************************************/
 
#define pinSettore1 13
#define pinSettore2 12
#define pinSettore3 11
#define pinSettore4 10
 
#define BUTTON A0


/**********************************************************/
 
int settore1[] = {05,00,05,20};
int settore2[] = {05,30,05,50};
int settore3[] = {06,00,06,20};
int settore4[] = {21,19,21,20};
 
int SELECT[]  =  {0,60};     // pulsante A
int LEFT[]    =  {490,550};  // pulsante B
int RIGTH[]   =  {650,710};  // pulsante C
int UP[]      =  {740,790};  // pulsante D
int DOWN[]    =  {800,860};  // pulsante E
 
char buffer[10];
unsigned long time=0;
unsigned long timeSet=0;
int  setModeTime=2000;

/**********************************************************/
 
RTC_DS1307 RTC;
LiquidCrystal_I2C lcd(0x27,16,2);
char daysOfTheWeek[7][12] = {"DOM", "LUN", "MAR", "MER", "GIO", "VEN", "SAB"};

/**********************************************************/

//ATTIVAZIONE SETTORI MANUALE

//Settore 1

int ManSettore1=6;
int bottone1=2;
int statoLed1=LOW;

//Settore 2

int ManSettore2=7;
int bottone2=3;
int statoLed2=LOW;

//Settore 3

int ManSettore3=8;
int bottone3=4;
int statoLed3=LOW;

//Settore 4

int ManSettore4=9;
int bottone4=5;
int statoLed4=LOW;

/**********************************************************/

void setup() {
  Serial.begin(9600);
  Serial.println( "START" );
 
  
  Wire.begin();
  RTC.begin();
  lcd.begin(16, 2);
  lcd.backlight();

  pinMode( pinSettore1,OUTPUT );
  pinMode( pinSettore2,OUTPUT );
  pinMode( pinSettore3,OUTPUT );
  pinMode( pinSettore4,OUTPUT );
  
  // ASSEGNAZIONE PIN SETTORE MANUALE
  pinMode(ManSettore1, OUTPUT);  
  pinMode(bottone1, INPUT);     
  pinMode(ManSettore2, OUTPUT);  
  pinMode(bottone2, INPUT); 
  pinMode(ManSettore3, OUTPUT);  
  pinMode(bottone3, INPUT); 
  pinMode(ManSettore4, OUTPUT);  
  pinMode(bottone4, INPUT); 

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
 
  digitalWrite( pinSettore1,LOW );
  digitalWrite( pinSettore2,LOW );
  digitalWrite( pinSettore3,LOW );
  digitalWrite( pinSettore4,LOW );
 
  lcd.clear();
}
 
/**********************************************************/
 
void loop() {
  
  int leggiBottone1=digitalRead(bottone1);
 
  if (leggiBottone1 == 1)
  {
     if (statoLed1 == LOW)
     {
 
       statoLed1=HIGH;
       digitalWrite(ManSettore1, statoLed1);
       delay(1000);
 
     } else {
 
       statoLed1=LOW;
       digitalWrite(ManSettore1, statoLed1);
       delay(1000);
 
     }
  }
  
  int leggiBottone2=digitalRead(bottone2);
 
  if (leggiBottone2 == 1)
  {
     if (statoLed2 == LOW)
     {
 
       statoLed2=HIGH;
       digitalWrite(ManSettore2, statoLed2);
       delay(1000);
 
     } else {
 
       statoLed2=LOW;
       digitalWrite(ManSettore2, statoLed2);
       delay(1000);
 
     }
  }
  
  int leggiBottone3=digitalRead(bottone3);
 
  if (leggiBottone3 == 1)
  {
     if (statoLed3 == LOW)
     {
 
       statoLed3=HIGH;
       digitalWrite(ManSettore3, statoLed3);
       delay(1000);
 
     } else {
 
       statoLed3=LOW;
       digitalWrite(ManSettore3, statoLed3);
       delay(1000);
 
     }
  }

  int leggiBottone4=digitalRead(bottone4);
 
  if (leggiBottone4 == 1)
  {
     if (statoLed4 == LOW)
     {
 
       statoLed4=HIGH;
       digitalWrite(ManSettore4, statoLed4);
       delay(1000);
 
     } else {
 
       statoLed4=LOW;
       digitalWrite(ManSettore4, statoLed4);
       delay(1000);
 
     }
  }

  if ( RTC.isrunning()) {
 
    DateTime now = RTC.now();
    int _button = ctrlButton( analogRead( BUTTON ) );
 
    if ( _button == 0 || _button > 1) { time = millis(); }
 
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
 
    int _hour   = now.hour();
    int _minute = now.minute();
    int _current   = (now.hour() * 60) + now.minute();
   
    startArea(1, _current);  // Settore Uno
    startArea(2, _current);  // Settore Due
    startArea(3, _current);  // Settore Tre
    startArea(4, _current);  // Settore Quattro
  
    delay( 30 );

    view_date_time( now );
 
    if (time > 0 && setModeTime < (millis() - time) ) { setMode( now ); }
  }
  

}
 
/**********************************************************/
 
void startArea(byte area, int current) {
 
    int  _currStart; 
    int  _currStop;
    byte _currPin;
     
    switch(area) {
        case 1:
           _currStart = (settore1[0]*60) + settore1[1];
           _currStop  = (settore1[2]*60) + settore1[3];
           _currPin   = pinSettore1;
        break;
         
        case 2:
           _currStart = (settore2[0]*60) + settore2[1];
           _currStop  = (settore2[2]*60) + settore2[3];
           _currPin   = pinSettore2;
        break;
         
        case 3:
           _currStart = (settore3[0]*60) + settore3[1];
           _currStop  = (settore3[2]*60) + settore3[3];
           _currPin   = pinSettore3;
        break;
         
        case 4:
           _currStart = (settore4[0]*60) + settore4[1];
           _currStop  = (settore4[2]*60) + settore4[3];
           _currPin   = pinSettore4;
        break;
    }
     
    if ((_currStart<=current) && (current<=_currStop)) {
        digitalWrite( _currPin,HIGH );
    } else {
        digitalWrite( _currPin,LOW );
    }
}
 
/**********************************************************/
 
int ctrlButton( int button ) {
 
  if ( SELECT[0] <= button && button <= SELECT[1] )  { return 1; }
  if ( LEFT[0] <= button && button <= LEFT[1] )      { return 2; }
  if ( RIGTH[0] <= button && button <= RIGTH[1] )    { return 3; }
  if ( UP[0] <= button && button <= UP[1] )          { return 4; }
  if ( DOWN[0] <= button && button <= DOWN[1] )      { return 5; }
 
  return 0;
 
}
 
/**********************************************************/
 
void view_date_time ( DateTime now ) {
 
    lcd.clear();
    
    lcd.setCursor(1,0);
    switch (now.dayOfTheWeek() ) {   
    case 0:
      lcd.print("DOM");
      break;
    case 1:
      lcd.print("LUN");
      break;
    case 2:
      lcd.print("MAR");
      break;
    case 3:
      lcd.print("MER");
      break;
    case 4:
      lcd.print("GIO");
      break;
    case 5:
      lcd.print("VEN");
      break;
    case 6:
      lcd.print("SAB");
      break;
    }
    
    sprintf(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());
    lcd.setCursor(5,0);
    lcd.print( buffer );
 
    char buffer[10] = "";
 
    sprintf(buffer,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
    lcd.setCursor(4,1);
    lcd.print( buffer );
 
    delay(1000);
}

/**********************************************************/
 
void setMode( DateTime now ) {
    boolean setMode = true;
    int setModeLevel = 0;
 
    int _day = now.day();
    int _month = now.month();
    int _year = now.year();
    int _hour = now.hour();
    int _min = now.minute();
    int _sec = now.second();
    
    lcd.clear();
    lcd.setCursor(0,0);
    sprintf(buffer,  "%s: %02d", "Giorno", _day);
    delay( 1000 );
    timeSet = millis();
 
    while ( setMode ) {
      int _button = ctrlButton( analogRead( BUTTON ) );
 
      if ( _button > 1 ) { timeSet = millis(); }
 
      lcd.setCursor(0,0);
 
      // Set Day
      if ( setModeLevel == 0 ) {
        if ( _button == 3 && _day < 31) { _day++; }
        if ( _button == 2 && _day > 1) { _day--; }
 
        sprintf(buffer,  "%s: %02d", "Giorno", _day);
      }
      // Set Month
      if ( setModeLevel == 1 ) {
        if ( _button == 3 && _month < 12) { _month++; }
        if ( _button == 2 && _month > 1) { _month--; }
 
        sprintf(buffer,  "%s: %02d", "Mese", _month);
      }
      // Set Year
      if ( setModeLevel == 2 ) {
        if ( _button == 3 && _year < 9999) { _year++; }
        if ( _button == 2 && _year > 1900) { _year--; }
 
        sprintf(buffer,  "%s: %02d", "Anno", _year);
      }
      // Set Hour
      if ( setModeLevel == 3 ) {
        if ( _button == 3 && _hour < 24) { _hour++; }
        if ( _button == 2 && _hour > 1) { _hour--; }
 
        sprintf(buffer,  "%s: %02d", "Ora", _hour);
      }
      // Set Minute
      if ( setModeLevel == 4 ) {
        if ( _button == 3 && _min < 59) { _min++; }
        if ( _button == 2 && _min > 0) { _min--; }
 
        sprintf(buffer,  "%s: %02d", "Minuti", _min);
      }
      // Set Second
      if ( setModeLevel == 5 ) {
        if ( _button == 3 && _sec < 59) { _sec++; }
        if ( _button == 2 && _sec > 0) { _sec--; }
 
        sprintf(buffer,  "%s: %02d", "Secondi", _sec);
      }
    

      lcd.print( buffer );
      if ( _button == 5 ) { lcd.clear(); setModeLevel++;  }
      if ( _button == 4 ) { lcd.clear(); setModeLevel--;  }
      if ( setModeLevel > 5 ) { setModeLevel=0; }
 
      if (timeSet > 0 && (setModeTime*2) < (millis() - timeSet) ) {
         RTC.adjust(DateTime(_year, _month, _day, _hour, _min, _sec));
         setMode = false;
      }
      delay(200);
    }
}

/**********************************************************/

vorrei poter modificare queste variabili da menu

int settore1[] = {05,00,05,20};
int settore2[] = {05,30,05,50};
int settore3[] = {06,00,06,20};
int settore4[] = {21,19,21,20};

ed eventualmente sarlvarle in EEPRON in caso di interruzione di corrente

La gestione di un menu non è semplicissima, sia per le limitazioni dello schermo, sia perché devi "inserire" questa cosa nel tuo attuale menu, il tutto collegato al fatto che non hai ancora una gran esperienza con Arduino. Tra l'altro non hai specificato quale board usi (UNO R3? Nano? Cosa?) e come sono connessi gli elementi (a proposito: parli di 5 pulsanti, usi forse un display shield, quello con un LCD e 5 tasti?).

Personalmente per una cosa simile (e non solo) ho scelto 3-4 anni fa un approccio diverso, ossia ho intanto usato una board con WiFi (io ho usato spesso le WeMos D1 R2, ma ti consiglierei una ESP32 molto più recente, potente e versatile) e, tramite un piccolo protocollo che ho disegnato in UDP, ricevo informazioni e posso dargli comandi, oltre a poter fare sincronizzare automaticamente l'RTC da server NTP (come fa il PC per capirci). Se hai connettività WiFi dove hai la centralina, anche se introdurre WiFi comporterebbe (forse?) cambiare board per una dotata di WiFi ed una revisione del tuo codice, diciamo che si snellirebbe molto visto che si potrebbe rimuovere tutta la gestione dell'attuale menu per impostare l'ora dell'RTC, e da qui estendere alle funzioni che ti occorrono gestibili anche da remoto.

Nel tuo caso comunque parliamo di operazioni da fare molto raramente: l'RTC se non è difettoso mantiene l'ora al limite da correggere si e no un paio di volte l'anno, lo stesso varrebbe anche per gli orari di irrigazione (al limite un tasto per impostare la percentuale di irrigazione) che vanno salvati sicuramente in EEPROM. Per cui per provare a darti qualche spunto (utile anche per fare pratica ed apprendere cose nuove).

Ti direi di iniziare a gestire gli orari salvandolo su EEPROM, cosa per la quale possiamo anche aiutarti se provi a farlo (ovviamente possiamo darti una mano, ma non vorrei darti la "pappa pronta" che non ti permetterebbe di imparare qualcosa, per cui devi iniziare tu a scrivere qualcosa, e nel caso postando qui il "nuovo" codice e le difficoltà che hai riscontrato, ti aiuteremo sicuramente).

Però dato che RTC ed orari di irrigazione sono operazioni non frequenti, potresti in prima battuta spostare la loro gestione tramite seriale per cui quando necessario ti basterebbe collegare la centralina ad un portatile e fare tutto in modo più semplice tramite monitor seriale.

Una volta che questa cosa funziona, potresti pensare ad una soluzione intermedia, ossia portare su bluetooth la comunicazione seriale, per cui aggiungendo un modulino BT e collegandolo con SoftwareSerial ti basta aggiungere l'attivazione del BT: il protocollo seriale resterebbe invariato ma potrai evitare di dover collegare un cavo al portatile, e/o potresti persino usare il cellulare (creando una piccola app magari con App Inventor che rende la cosa più semplice).

Se invece preferisci mantenere tutto su menu locale, il problema per noi è dover prima studiare il tuo codice per capire come lo hai fatto, e poi provare a proporti delle modifiche per aggiungere la nuova funzione. Anche per quest'ultimo caso, anche perché non parliamo di fare 3 o 4 modifiche o correzioni, è necessario che quantomeno tu faccia un tentativo, per poi postare qui il "nuovo" codice descrivendo quali difficoltà hai riscontrato (ossia cosa fa o non fa).

PS: poi nel codice mi sembra che molte variabili sia meglio trasformarle in array, perché oltre ad essere più compatte si semplificano molto alcune porzioni di codice praticamente identico...

Buonasera,

per prima cosa ringrazio per la risposta data e per i molteplici consigli che mi hai dato

per correttezza come mi hai fatto notare non ho detto che componenti stò utilizzando per fare il tutto

Arduino uno
LCD 16x2 I2C
sheald 4 relè
modulo RTC 1307
pulsanti generici normalmente aperti

allego foto del progetto che al momento stà correttamente funzionando


pulsante SET permette di entrare nel menu di modifica orario RTC
i 4 pulsanti sotto permettono la navigazione e modifica dei valori

a sinistra invece i 4 pulsanti che permettono l'attivazione manuale dei 4 settori
avrei potuto semplicemente mettere 4 interruttori che attivavano i relè ma invece ho voluto volontariamente complicarmi la vita per farli attivare con Arduino

immagini interno


premetto che vorrei farlo lavorare in locale quindi poter come già anticipato avere la possibilità di modificare come faccio già attualmente sull RTC gli orari di apertura e chiusura o se rimesse più semplice ma non credo poter settare l'orario di apertura settore ed eventualemente settare un tempo
ho già provato tramite menù esempio modificare settore1[0] che corrisponderebbe al mio attuale 05 ora con questo codice:

// Set Start1
    if ( setModeLevel == 6 ) {
        if ( _button == 3 && settore1[0] < 24) { settore1[0]++; }
        if ( _button == 2 && settore1[0] > 1) { settore1[0]--; }
 
        sprintf(buffer,  "%s: %02d", "Start1 Ora", settore1[0]);
      }
    // Set Start1
      if ( setModeLevel == 7 ) {
        if ( _button == 3 && settore1[1] < 59) { settore1[1]++; }
        if ( _button == 2 && settore1[1] > 0) { settore1[1]--; }
 
        sprintf(buffer,  "%s: %02d", "Start1 Min", settore1[1]);
      }

me li lascia modificare ma non funzionano in realtà
per questo motivo mi trovo in gran difficoltà

il mio primo step è riuscire a modificare che correttamente funzioni ancora tutto
il secondo luogo cercare di riordinare il menu
terzo fissarli poi in Eepron (marginale al momento visto che lavoro con 9 v posso utilizzare una batteria tamponeche in assenza di tensione mi lavora con la batteriae non perdo i dati modificati)

grazie anticipatamente per aiuto

A me sembra strano che quel pezzo di codice funzioni per quanto riguarda la modifica del ora di partenza settore 1 ma poi il resto non lo "senta". Secondo me sei sulla strada giusta.
Devi postare tutto il codice completo con questa modifica. Forse hai inserito quel pezzo di codice nel posto sbagliato.

Per la eeprom, non è complicato. Senza farti tanti problemi, devi fare 2 funzioni nuove, una da chiamare in setup(), esempio LeggiEeprom() e una da chiamare alla fine delle modifiche degli orari, esempio ScriviEeprom()
Per sapere se in eeprom c'e' qualcosa usarei la prima cella eeprom verificando ci sia un valore specifico, esempio esadecimale AA (ovvero 170) se c'e', leggi da eeprom ogni singolo byte e lo metti in ogni array settoreX. Fai una cosa "brutale", 4x4 letture. Se non c'e' 170 non leggi e lasci i valori di default
In scrittura scrivi il primo byte 170 e poi anche qui brutale, 16 scritture. Poi si potrà migliorare il codice.

#include <EEPROM.h>
...
void ScriviEeprom()
{ EEPROM.update(0, 170);
  EEPROM.update(1, settore1[0]);
  EEPROM.update(2, settore1[1]);
...etc
}

void LeggiEeprom()
{ if(EEPROM.read(0)!=170) return;    // se non 170 su primo byte, esce
  settore1[0]=EEPROM.read(1);
  settore1[1]=EEPROM.read(2);
...etc
}

Ok, non penso di riuscire oggi o domani, ma forse nel weekend dovrei avere un po' di tempo per provare a vedere. Ad esempio potresti pensare che tenendo premuto il tasto "Set" per 1 secondo accedi all'impostazione degli orari di irrigazione mentre premendolo brevemente imposti l'ora.

Il codice attuale e funzionante qual è, quello del post #2, esatto? Potresti postare anche quello completo dove hai cercato di aggiungere la modifica?

Buongiorno,

allego il codice completo con le ultime modifiche applicate

/**********************************************************
 *
 * Created by Tizianoz
 * Ultima modifica 24 marzo 2024
 *
/**********************************************************/

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>


/**********************************************************/
 
#define pinSettore1 13
#define pinSettore2 12
#define pinSettore3 11
#define pinSettore4 10
 
#define BUTTON A0


/**********************************************************/
 
int settore1[] = {05,00,05,20};
int settore2[] = {05,30,05,50};
int settore3[] = {06,00,06,20};
int settore4[] = {21,19,21,20};
 
int SELECT[]  =  {0,60};     // pulsante A
int LEFT[]    =  {490,550};  // pulsante B
int RIGTH[]   =  {650,710};  // pulsante C
int UP[]      =  {740,790};  // pulsante D
int DOWN[]    =  {800,860};  // pulsante E
 
char buffer[10];
unsigned long time=0;
unsigned long timeSet=0;
int  setModeTime=2000;

/**********************************************************/
 
RTC_DS1307 RTC;
LiquidCrystal_I2C lcd(0x27,16,2);
char daysOfTheWeek[7][12] = {"DOM", "LUN", "MAR", "MER", "GIO", "VEN", "SAB"};

/**********************************************************/

//ATTIVAZIONE SETTORI MANUALE

//Settore 1

int ManSettore1=6;
int bottone1=2;
int statoLed1=LOW;

//Settore 2

int ManSettore2=7;
int bottone2=3;
int statoLed2=LOW;

//Settore 3

int ManSettore3=8;
int bottone3=4;
int statoLed3=LOW;

//Settore 4

int ManSettore4=9;
int bottone4=5;
int statoLed4=LOW;

/**********************************************************/

void setup() {
  Serial.begin(9600);
  Serial.println( "START" );
 
  
  Wire.begin();
  RTC.begin();
  lcd.begin(16, 2);
  lcd.backlight();

  pinMode( pinSettore1,OUTPUT );
  pinMode( pinSettore2,OUTPUT );
  pinMode( pinSettore3,OUTPUT );
  pinMode( pinSettore4,OUTPUT );
  
  // ASSEGNAZIONE PIN SETTORE MANUALE
  pinMode(ManSettore1, OUTPUT);  
  pinMode(bottone1, INPUT);     
  pinMode(ManSettore2, OUTPUT);  
  pinMode(bottone2, INPUT); 
  pinMode(ManSettore3, OUTPUT);  
  pinMode(bottone3, INPUT); 
  pinMode(ManSettore4, OUTPUT);  
  pinMode(bottone4, INPUT); 

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
 
  digitalWrite( pinSettore1,LOW );
  digitalWrite( pinSettore2,LOW );
  digitalWrite( pinSettore3,LOW );
  digitalWrite( pinSettore4,LOW );
 
  lcd.clear();
}
 
/**********************************************************/
 
void loop() {
  
  int leggiBottone1=digitalRead(bottone1);
 
  if (leggiBottone1 == 1)
  {
     if (statoLed1 == LOW)
     {
 
       statoLed1=HIGH;
       digitalWrite(ManSettore1, statoLed1);
       delay(1000);
 
     } else {
 
       statoLed1=LOW;
       digitalWrite(ManSettore1, statoLed1);
       delay(1000);
 
     }
  }
  
  int leggiBottone2=digitalRead(bottone2);
 
  if (leggiBottone2 == 1)
  {
     if (statoLed2 == LOW)
     {
 
       statoLed2=HIGH;
       digitalWrite(ManSettore2, statoLed2);
       delay(1000);
 
     } else {
 
       statoLed2=LOW;
       digitalWrite(ManSettore2, statoLed2);
       delay(1000);
 
     }
  }
  
  int leggiBottone3=digitalRead(bottone3);
 
  if (leggiBottone3 == 1)
  {
     if (statoLed3 == LOW)
     {
 
       statoLed3=HIGH;
       digitalWrite(ManSettore3, statoLed3);
       delay(1000);
 
     } else {
 
       statoLed3=LOW;
       digitalWrite(ManSettore3, statoLed3);
       delay(1000);
 
     }
  }

  int leggiBottone4=digitalRead(bottone4);
 
  if (leggiBottone4 == 1)
  {
     if (statoLed4 == LOW)
     {
 
       statoLed4=HIGH;
       digitalWrite(ManSettore4, statoLed4);
       delay(1000);
 
     } else {
 
       statoLed4=LOW;
       digitalWrite(ManSettore4, statoLed4);
       delay(1000);
 
     }
  }

  if ( RTC.isrunning()) {
 
    DateTime now = RTC.now();
    int _button = ctrlButton( analogRead( BUTTON ) );
 
    if ( _button == 0 || _button > 1) { time = millis(); }
 
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(' ');
    Serial.print(now.day(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.year(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.print(' ');
    Serial.print(settore1[0]);
    Serial.print(':');
    Serial.print(settore1[1]);
    Serial.print(' ');
    Serial.print(settore1[2]);
    Serial.print(':');
    Serial.print(settore1[3]);
    Serial.println();
 
    int _hour   = now.hour();
    int _minute = now.minute();
    int _current   = (now.hour() * 60) + now.minute();
   
    startArea(1, _current);  // Settore Uno
    startArea(2, _current);  // Settore Due
    startArea(3, _current);  // Settore Tre
    startArea(4, _current);  // Settore Quattro
  
    delay( 30 );

    view_date_time( now );
 
    if (time > 0 && setModeTime < (millis() - time) ) { setMode( now ); }
  }
  

}
 
/**********************************************************/
 
void startArea(byte area, int current) {
 
    int  _currStart; 
    int  _currStop;
    byte _currPin;
     
    switch(area) {
        case 1:
           _currStart = (settore1[0]*60) + settore1[1];
           _currStop  = (settore1[2]*60) + settore1[3];
           _currPin   = pinSettore1;
        break;
         
        case 2:
           _currStart = (settore2[0]*60) + settore2[1];
           _currStop  = (settore2[2]*60) + settore2[3];
           _currPin   = pinSettore2;
        break;
         
        case 3:
           _currStart = (settore3[0]*60) + settore3[1];
           _currStop  = (settore3[2]*60) + settore3[3];
           _currPin   = pinSettore3;
        break;
         
        case 4:
           _currStart = (settore4[0]*60) + settore4[1];
           _currStop  = (settore4[2]*60) + settore4[3];
           _currPin   = pinSettore4;
        break;
    }
     
    if ((_currStart<=current) && (current<=_currStop)) {
        digitalWrite( _currPin,HIGH );
    } else {
        digitalWrite( _currPin,LOW );
    }
}
 
/**********************************************************/
 
int ctrlButton( int button ) {
 
  if ( SELECT[0] <= button && button <= SELECT[1] )  { return 1; }
  if ( LEFT[0] <= button && button <= LEFT[1] )      { return 2; }
  if ( RIGTH[0] <= button && button <= RIGTH[1] )    { return 3; }
  if ( UP[0] <= button && button <= UP[1] )          { return 4; }
  if ( DOWN[0] <= button && button <= DOWN[1] )      { return 5; }
 
  return 0;
 
}
 
/**********************************************************/
 
void view_date_time ( DateTime now ) {
 
    lcd.clear();
    
    lcd.setCursor(1,0);
    switch (now.dayOfTheWeek() ) {   
    case 0:
      lcd.print("DOM");
      break;
    case 1:
      lcd.print("LUN");
      break;
    case 2:
      lcd.print("MAR");
      break;
    case 3:
      lcd.print("MER");
      break;
    case 4:
      lcd.print("GIO");
      break;
    case 5:
      lcd.print("VEN");
      break;
    case 6:
      lcd.print("SAB");
      break;
    }
    
    sprintf(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());
    lcd.setCursor(5,0);
    lcd.print( buffer );
 
    char buffer[10] = "";
 
    sprintf(buffer,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
    lcd.setCursor(4,1);
    lcd.print( buffer );
 
    delay(1000);
}

/**********************************************************/
 
void setMode( DateTime now ) {
    boolean setMode = true;
    int setModeLevel = 0;
 
    int _day = now.day();
    int _month = now.month();
    int _year = now.year();
    int _hour = now.hour();
    int _min = now.minute();
    int _sec = now.second();
    
    lcd.clear();
    lcd.setCursor(0,0);
    sprintf(buffer,  "%s: %02d", "Giorno", _day);
    delay( 1000 );
    timeSet = millis();
 
    while ( setMode ) {
      int _button = ctrlButton( analogRead( BUTTON ) );
 
      if ( _button > 1 ) { timeSet = millis(); }
 
      lcd.setCursor(0,0);
 
      // Set Day
      if ( setModeLevel == 0 ) {
        if ( _button == 3 && _day < 31) { _day++; }
        if ( _button == 2 && _day > 1) { _day--; }
 
        sprintf(buffer,  "%s: %02d", "Giorno", _day);
      }
      // Set Month
      if ( setModeLevel == 1 ) {
        if ( _button == 3 && _month < 12) { _month++; }
        if ( _button == 2 && _month > 1) { _month--; }
 
        sprintf(buffer,  "%s: %02d", "Mese", _month);
      }
      // Set Year
      if ( setModeLevel == 2 ) {
        if ( _button == 3 && _year < 9999) { _year++; }
        if ( _button == 2 && _year > 1900) { _year--; }
 
        sprintf(buffer,  "%s: %02d", "Anno", _year);
      }
      // Set Hour
      if ( setModeLevel == 3 ) {
        if ( _button == 3 && _hour < 24) { _hour++; }
        if ( _button == 2 && _hour > 1) { _hour--; }
 
        sprintf(buffer,  "%s: %02d", "Ora", _hour);
      }
      // Set Minute
      if ( setModeLevel == 4 ) {
        if ( _button == 3 && _min < 59) { _min++; }
        if ( _button == 2 && _min > 0) { _min--; }
 
        sprintf(buffer,  "%s: %02d", "Minuti", _min);
      }
      // Set Second
      if ( setModeLevel == 5 ) {
        if ( _button == 3 && _sec < 59) { _sec++; }
        if ( _button == 2 && _sec > 0) { _sec--; }
 
        sprintf(buffer,  "%s: %02d", "Secondi", _sec);
      }
      //Set Start1
      if ( setModeLevel == 6 ) {
        if ( _button == 3 && settore1[0] < 24) { settore1[0]++; }
        if ( _button == 2 && settore1[0] > 1) { settore1[0]--; }
 
        sprintf(buffer,  "%s: %02d", "Start1 Ora", settore1[0]);
      }
     //Set Start1
      if ( setModeLevel == 7 ) {
        if ( _button == 3 && settore1[1] < 59) { settore1[1]++; }
        if ( _button == 2 && settore1[1] > 0) { settore1[1]--; }
 
        sprintf(buffer,  "%s: %02d", "Start1 Min", settore1[1]);
      }

      lcd.print( buffer );
      if ( _button == 5 ) { lcd.clear(); setModeLevel++;  }
      if ( _button == 4 ) { lcd.clear(); setModeLevel--;  }
      if ( setModeLevel > 7 ) { setModeLevel=0; }
 
      if (timeSet > 0 && (setModeTime*2) < (millis() - timeSet) ) {
         RTC.adjust(DateTime(_year, _month, _day, _hour, _min, _sec));
         setMode = false;
      }
      delay(200);
    }
}

/**********************************************************/

ho anche aggiunto dei serial print per vedere da monitor seriale se i volari vengono modificati
cosa che veramente accade ma non vengono presi in considerazione da qualche parte

sembra che gli piacciano solo quelli di default precaricati

al momento se tengo premuto il tasto SET per 2 secondi entro in modalità modifica ora RTC
quando sono all'interno se non faccio nulla per 2 secondi esce e conferma le modifiche

vi ringrazio ancora per l'enorme aiuto che mi state dando

A vedere questo codice non mi sembra ci siano errori di logica.
Prova a stampare su Serial gli orari dentro a startArea()

Questo codice è un pò prolisso, si può accorciare usando if in linea:

  if (digitalRead(bottone1) == HIGH)          
  {  statoLed1= ( statoLed1 == LOW ? HIGH : LOW )    // x=iif(x==low,high,low)
    digitalWrite(ManSettore1, statoLed1);
    delay(1000);
  }

Beh allora visto che lo usa solo per l'ouput, forse ancora più semplicemente:

  statoLed1= !statoLed1;

:sunglasses:

Calma Calma,

parlate con un linguaggio che un comune umano capisca :grinning:

spiegatemi in modo che capisca bene quello che intendete

:thinking:

  1. hai una variabile leggibottone1 inutile, quindi basta e avanza:
    if (digitalRead(bottone1) == 1)

  2. hai due righe identiche ripetute sia nel ramo vero che nel ramo falso

     if (statoLed1 == LOW)
     { statoLed1=HIGH;
     } else
     { statoLed1=LOW;
     }
     digitalWrite(ManSettore1, statoLed1);
     delay(1000);
  1. in realtà LOW vale 0 e HIGH vale 1, usare il not (esclamativo) permette di passare da 0 a 1 o da 1 a 0
    statoLed1= !statoLed1; // not di bit se 1 diventa 0 se 0 diventa 1

Ok pensavo che visto che utilizzo lo stesso bottone sia per attivare che disattivare andasse bene per quel poco che capisco
:sweat_smile:

sono solo ottimizzazioni (accorciamenti) di codice, eliminazione di ridondanze

Anche qui:

int _hour   = now.hour();
int _minute = now.minute();
int _current   = (now.hour() * 60) + now.minute();

a cosa servono _hour e _minute visto che poi mai le usi ??
se le usi nel calcolo di _current okay, ma non le usi

int _hour   = now.hour();
int _minute = now.minute();
int _current   =  _hour * 60 + _minute;         

ok chiaro inutile dichiararle se poi non le usi
stasera appena torno da lavoro comincio opera di alleggerimento codice come da tuo consiglio

Buonasera,

dopo un paio di modifiche qua e la e sinceramente non ho capito che cavolo ho toccato ora funziona tutto settaggio orari compreso e salvataggio degli orari in EEPRON

/**********************************************************
 *
 * Created by Tizianoz
 * Ultima modifica 24 marzo 2024
 *
/**********************************************************/

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>

/**********************************************************/
 
#define pinSettore1 13
#define pinSettore2 12
#define pinSettore3 11
#define pinSettore4 10
 
#define BUTTON A0


/**********************************************************/
 
int settore1[] = {05,00,05,20};
int settore2[] = {05,30,05,50};
int settore3[] = {06,00,06,20};
int settore4[] = {21,25,21,20};
 
int SELECT[]  =  {0,60};     // pulsante A
int LEFT[]    =  {490,550};  // pulsante B
int RIGTH[]   =  {650,710};  // pulsante C
int UP[]      =  {740,790};  // pulsante D
int DOWN[]    =  {800,860};  // pulsante E
 
char buffer[10];
unsigned long time=0;
unsigned long timeSet=0;
int  setModeTime=2000;

/**********************************************************/
 
RTC_DS1307 RTC;
LiquidCrystal_I2C lcd(0x27,16,2);
char daysOfTheWeek[7][12] = {"DOM", "LUN", "MAR", "MER", "GIO", "VEN", "SAB"};

/**********************************************************/

//ATTIVAZIONE SETTORI MANUALE

//Settore 1

int ManSettore1=6;
int bottone1=2;
int statoLed1=LOW;

//Settore 2

int ManSettore2=7;
int bottone2=3;
int statoLed2=LOW;

//Settore 3

int ManSettore3=8;
int bottone3=4;
int statoLed3=LOW;

//Settore 4

int ManSettore4=9;
int bottone4=5;
int statoLed4=LOW;

/**********************************************************/

void setup() {
  Serial.begin(9600);
  Serial.println( "START" );
 
  
  Wire.begin();
  RTC.begin();
  lcd.begin(16, 2);
  lcd.backlight();

  pinMode( pinSettore1,OUTPUT );
  pinMode( pinSettore2,OUTPUT );
  pinMode( pinSettore3,OUTPUT );
  pinMode( pinSettore4,OUTPUT );
  
  // ASSEGNAZIONE PIN SETTORE MANUALE
  pinMode(ManSettore1, OUTPUT);  
  pinMode(bottone1, INPUT);     
  pinMode(ManSettore2, OUTPUT);  
  pinMode(bottone2, INPUT); 
  pinMode(ManSettore3, OUTPUT);  
  pinMode(bottone3, INPUT); 
  pinMode(ManSettore4, OUTPUT);  
  pinMode(bottone4, INPUT); 

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
 
  digitalWrite( pinSettore1,LOW );
  digitalWrite( pinSettore2,LOW );
  digitalWrite( pinSettore3,LOW );
  digitalWrite( pinSettore4,LOW );
 
  lcd.clear();

  LeggiEeprom();
}
 
/**********************************************************/
 
void loop() {
   
  if (digitalRead(bottone1) == 1)
  {
     if (statoLed1 == LOW)
     { statoLed1=HIGH;
     } else
     { statoLed1=LOW;
     }
     digitalWrite(ManSettore1, statoLed1);
     delay(1000);
  }
  
  if (digitalRead(bottone2) == 1)
  {
     if (statoLed2 == LOW)
     { statoLed2=HIGH;
     } else
     { statoLed2=LOW;
     }
     digitalWrite(ManSettore2, statoLed2);
     delay(1000);
  }
  
  if (digitalRead(bottone3) == 1)
  {
     if (statoLed3 == LOW)
     { statoLed3=HIGH;
     } else
     { statoLed3=LOW;
     }
     digitalWrite(ManSettore3, statoLed3);
     delay(1000);
  }

  if (digitalRead(bottone4) == 1)
  {
    if (statoLed4 == LOW)
     { statoLed4=HIGH;
     } else
     { statoLed4=LOW;
     }
     digitalWrite(ManSettore4, statoLed4);
     delay(1000);
  }

  if ( RTC.isrunning()) {
 
    DateTime now = RTC.now();
    int _button = ctrlButton( analogRead( BUTTON ) );
 
    if ( _button == 0 || _button > 1) { time = millis(); }
 
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(' ');
    Serial.print(now.day(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.year(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.print(' ');
    Serial.print('-');
    Serial.print(' ');
    Serial.print("Settore 1");
    Serial.print(' ');
    Serial.print('(');
    Serial.print(settore1[0]);
    Serial.print(':');
    Serial.print(settore1[1]);
    Serial.print(' ');
    Serial.print(settore1[2]);
    Serial.print(':');
    Serial.print(settore1[3]);
    Serial.print(')');
    Serial.print(' ');
    Serial.print('-');
    Serial.print(' ');
    Serial.print("Settore 2");
    Serial.print(' ');
    Serial.print('(');
    Serial.print(settore2[0]);
    Serial.print(':');
    Serial.print(settore2[1]);
    Serial.print(' ');
    Serial.print(settore2[2]);
    Serial.print(':');
    Serial.print(settore2[3]);
    Serial.print(')');
    Serial.print(' ');
    Serial.print('-');
    Serial.print(' ');
    Serial.print("Settore 3");
    Serial.print(' ');
    Serial.print('(');
    Serial.print(settore3[0]);
    Serial.print(':');
    Serial.print(settore3[1]);
    Serial.print(' ');
    Serial.print(settore3[2]);
    Serial.print(':');
    Serial.print(settore3[3]);
    Serial.print(')');  
    Serial.print(' ');
    Serial.print('-');
    Serial.print(' ');
    Serial.print("Settore 4");
    Serial.print(' ');
    Serial.print('(');
    Serial.print(settore4[0]);
    Serial.print(':');
    Serial.print(settore4[1]);
    Serial.print(' ');
    Serial.print(settore4[2]);
    Serial.print(':');
    Serial.print(settore4[3]);
    Serial.print(')');
    Serial.println();
 
    int _hour   = now.hour();
    int _minute = now.minute();
    int _current   = (now.hour() * 60) + now.minute();
   
    startArea(1, _current);  // Settore Uno
    startArea(2, _current);  // Settore Due
    startArea(3, _current);  // Settore Tre
    startArea(4, _current);  // Settore Quattro
  
    delay( 30 );

    view_date_time( now );
 
    if (time > 0 && setModeTime < (millis() - time) ) { setMode( now ); }
  }
  

}
 
/**********************************************************/
 
void startArea(byte area, int current) {
 
    int  _currStart; 
    int  _currStop;
    byte _currPin;
     
    switch(area) {
        case 1:
           _currStart = (settore1[0]*60) + settore1[1];
           _currStop  = (settore1[2]*60) + settore1[3];
           _currPin   = pinSettore1;
        break;
         
        case 2:
           _currStart = (settore2[0]*60) + settore2[1];
           _currStop  = (settore2[2]*60) + settore2[3];
           _currPin   = pinSettore2;
        break;
         
        case 3:
           _currStart = (settore3[0]*60) + settore3[1];
           _currStop  = (settore3[2]*60) + settore3[3];
           _currPin   = pinSettore3;
        break;
         
        case 4:
           _currStart = (settore4[0]*60) + settore4[1];
           _currStop  = (settore4[2]*60) + settore4[3];
           _currPin   = pinSettore4;
        break;
    }
     
    if ((_currStart<=current) && (current<=_currStop)) {
        digitalWrite( _currPin,HIGH );
    } else {
        digitalWrite( _currPin,LOW );
    }
}
 
/**********************************************************/
 
int ctrlButton( int button ) {
 
  if ( SELECT[0] <= button && button <= SELECT[1] )  { return 1; }
  if ( LEFT[0] <= button && button <= LEFT[1] )      { return 2; }
  if ( RIGTH[0] <= button && button <= RIGTH[1] )    { return 3; }
  if ( UP[0] <= button && button <= UP[1] )          { return 4; }
  if ( DOWN[0] <= button && button <= DOWN[1] )      { return 5; }
 
  return 0;
 
}
 
/**********************************************************/
 
void view_date_time ( DateTime now ) {
 
    lcd.clear();
    
    lcd.setCursor(1,0);
    switch (now.dayOfTheWeek() ) {   
    case 0:
      lcd.print("DOM");
      break;
    case 1:
      lcd.print("LUN");
      break;
    case 2:
      lcd.print("MAR");
      break;
    case 3:
      lcd.print("MER");
      break;
    case 4:
      lcd.print("GIO");
      break;
    case 5:
      lcd.print("VEN");
      break;
    case 6:
      lcd.print("SAB");
      break;
    }
    
    sprintf(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());
    lcd.setCursor(5,0);
    lcd.print( buffer );
 
    char buffer[10] = "";
 
    sprintf(buffer,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
    lcd.setCursor(4,1);
    lcd.print( buffer );
 
    delay(1000);
}

/**********************************************************/
 
void setMode( DateTime now ) {
    boolean setMode = true;
    int setModeLevel = 0;
 
    int _day = now.day();
    int _month = now.month();
    int _year = now.year();
    int _hour = now.hour();
    int _min = now.minute();
    int _sec = now.second();
    
    lcd.clear();
    lcd.setCursor(0,0);
    sprintf(buffer,  "%s: %02d", "Giorno", _day);
    delay( 2000 );
    timeSet = millis();
 
    while ( setMode ) {
      int _button = ctrlButton( analogRead( BUTTON ) );
 
      if ( _button > 1 ) { timeSet = millis(); }
 
      lcd.setCursor(0,0);
 
      // Set Day
      if ( setModeLevel == 0 ) {
        if ( _button == 3 && _day < 31) { _day++; }
        if ( _button == 2 && _day > 1) { _day--; }
 
        sprintf(buffer,  "%s: %02d", "Giorno", _day);
      }
      // Set Month
      if ( setModeLevel == 1 ) {
        if ( _button == 3 && _month < 12) { _month++; }
        if ( _button == 2 && _month > 1) { _month--; }
 
        sprintf(buffer,  "%s: %02d", "Mese", _month);
      }
      // Set Year
      if ( setModeLevel == 2 ) {
        if ( _button == 3 && _year < 9999) { _year++; }
        if ( _button == 2 && _year > 1900) { _year--; }
 
        sprintf(buffer,  "%s: %02d", "Anno", _year);
      }
      // Set Hour
      if ( setModeLevel == 3 ) {
        if ( _button == 3 && _hour < 24) { _hour++; }
        if ( _button == 2 && _hour > 1) { _hour--; }
 
        sprintf(buffer,  "%s: %02d", "Ora", _hour);
      }
      // Set Minute
      if ( setModeLevel == 4 ) {
        if ( _button == 3 && _min < 59) { _min++; }
        if ( _button == 2 && _min > 0) { _min--; }
 
        sprintf(buffer,  "%s: %02d", "Minuti", _min);
      }
      // Set Second
      if ( setModeLevel == 5 ) {
        if ( _button == 3 && _sec < 59) { _sec++; }
        if ( _button == 2 && _sec > 0) { _sec--; }
 
        sprintf(buffer,  "%s: %02d", "Secondi", _sec);
      }
      //Set Start1
      if ( setModeLevel == 6 ) {
        if ( _button == 3 && settore1[0] < 24) { settore1[0]++; }
        if ( _button == 2 && settore1[0] > 1) { settore1[0]--; }
 
        sprintf(buffer,  "%s: %02d", "START 1 Ora", settore1[0]);
      }
     //Set Start1
      if ( setModeLevel == 7 ) {
        if ( _button == 3 && settore1[1] < 59) { settore1[1]++; }
        if ( _button == 2 && settore1[1] > 0) { settore1[1]--; }
 
        sprintf(buffer,  "%s: %02d", "START 1 Min", settore1[1]);
      }
      //Set Stop1
      if ( setModeLevel == 8 ) {
        if ( _button == 3 && settore1[2] < 24) { settore1[2]++; }
        if ( _button == 2 && settore1[2] > 1) { settore1[2]--; }
 
        sprintf(buffer,  "%s: %02d", "STOP 1 Ora", settore1[2]);
      }
     //Set Stop1
      if ( setModeLevel == 9 ) {
        if ( _button == 3 && settore1[3] < 59) { settore1[3]++; }
        if ( _button == 2 && settore1[3] > 0) { settore1[3]--; }
 
        sprintf(buffer,  "%s: %02d", "STOP 1 Min", settore1[3]);
      }
      //Set Start2
      if ( setModeLevel == 10 ) {
        if ( _button == 3 && settore2[0] < 24) { settore2[0]++; }
        if ( _button == 2 && settore2[0] > 1) { settore2[0]--; }
 
        sprintf(buffer,  "%s: %02d", "START 2 Ora", settore2[0]);
      }
     //Set Start2
      if ( setModeLevel == 11 ) {
        if ( _button == 3 && settore2[1] < 59) { settore2[1]++; }
        if ( _button == 2 && settore2[1] > 0) { settore2[1]--; }
 
        sprintf(buffer,  "%s: %02d", "START 2 Min", settore2[1]);
      }
      //Set Stop2
      if ( setModeLevel == 12 ) {
        if ( _button == 3 && settore2[2] < 24) { settore2[2]++; }
        if ( _button == 2 && settore2[2] > 1) { settore2[2]--; }
 
        sprintf(buffer,  "%s: %02d", "STOP 2 Ora", settore2[2]);
      }
     //Set Stop2
      if ( setModeLevel == 13 ) {
        if ( _button == 3 && settore2[3] < 59) { settore2[3]++; }
        if ( _button == 2 && settore2[3] > 0) { settore2[3]--; }
 
        sprintf(buffer,  "%s: %02d", "STOP 2 Min", settore2[3]);
      }
      //Set Start3
      if ( setModeLevel == 14 ) {
        if ( _button == 3 && settore3[0] < 24) { settore3[0]++; }
        if ( _button == 2 && settore3[0] > 1) { settore3[0]--; }
 
        sprintf(buffer,  "%s: %02d", "START 3 Ora", settore3[0]);
      }
     //Set Start3
      if ( setModeLevel == 15 ) {
        if ( _button == 3 && settore3[1] < 59) { settore3[1]++; }
        if ( _button == 2 && settore3[1] > 0) { settore3[1]--; }
 
        sprintf(buffer,  "%s: %02d", "START 3 Min", settore3[1]);
      }
      //Set Stop3
      if ( setModeLevel == 16 ) {
        if ( _button == 3 && settore3[2] < 24) { settore3[2]++; }
        if ( _button == 2 && settore3[2] > 1) { settore3[2]--; }
 
        sprintf(buffer,  "%s: %02d", "STOP 3 Ora", settore3[2]);
      }
     //Set Stop3
      if ( setModeLevel == 17 ) {
        if ( _button == 3 && settore3[3] < 59) { settore3[3]++; }
        if ( _button == 2 && settore3[3] > 0) { settore3[3]--; }
 
        sprintf(buffer,  "%s: %02d", "STOP 3 Min", settore3[3]);
      }
      //Set Start4
      if ( setModeLevel == 18 ) {
        if ( _button == 3 && settore4[0] < 24) { settore4[0]++; }
        if ( _button == 2 && settore4[0] > 1) { settore4[0]--; }
 
        sprintf(buffer,  "%s: %02d", "START 4 Ora", settore4[0]);
      }
     //Set Start4
      if ( setModeLevel == 19 ) {
        if ( _button == 3 && settore4[1] < 59) { settore4[1]++; }
        if ( _button == 2 && settore4[1] > 0) { settore4[1]--; }
 
        sprintf(buffer,  "%s: %02d", "START 4 Min", settore4[1]);
      }
      //Set Stop4
      if ( setModeLevel == 20 ) {
        if ( _button == 3 && settore4[2] < 24) { settore4[2]++; }
        if ( _button == 2 && settore4[2] > 1) { settore4[2]--; }
 
        sprintf(buffer,  "%s: %02d", "STOP 4 Ora", settore4[2]);
      }
     //Set Stop4
      if ( setModeLevel == 21 ) {
        if ( _button == 3 && settore4[3] < 59) { settore4[3]++; }
        if ( _button == 2 && settore4[3] > 0) { settore4[3]--; }
 
        sprintf(buffer,  "%s: %02d", "STOP 4 Min", settore4[3]);
      }

      lcd.print( buffer );
      if ( _button == 5 ) { lcd.clear(); setModeLevel++;  }
      if ( _button == 4 ) { lcd.clear(); setModeLevel--;  }
      if ( setModeLevel > 21 ) { setModeLevel=0; }
 
      if (timeSet > 0 && (setModeTime*2) < (millis() - timeSet) ) {
         RTC.adjust(DateTime(_year, _month, _day, _hour, _min, _sec));
         setMode = false;
      }
      delay(200);
    }

    ScriviEeprom();

}

/**********************************************************/

void ScriviEeprom()
{ 
  EEPROM.update(0, 170);
  EEPROM.update(1, settore1[0]);
  EEPROM.update(2, settore1[1]);
  EEPROM.update(3, settore1[2]);
  EEPROM.update(4, settore1[3]);
  EEPROM.update(5, settore2[0]);
  EEPROM.update(6, settore2[1]);
  EEPROM.update(7, settore2[2]);
  EEPROM.update(8, settore2[3]);
  EEPROM.update(9, settore3[0]);
  EEPROM.update(10, settore3[1]);
  EEPROM.update(11, settore3[2]);
  EEPROM.update(12, settore3[3]);
  EEPROM.update(13, settore4[0]);
  EEPROM.update(14, settore4[1]);
  EEPROM.update(15, settore4[2]);
  EEPROM.update(16, settore4[3]);
}

/**********************************************************/

void LeggiEeprom()
{ 
  if(EEPROM.read(0)!=170) return;    // se non 170 su primo byte, esce
  settore1[0]=EEPROM.read(1);
  settore1[1]=EEPROM.read(2);
  settore1[2]=EEPROM.read(3);
  settore1[3]=EEPROM.read(4);
  settore2[0]=EEPROM.read(5);
  settore2[1]=EEPROM.read(6);
  settore2[2]=EEPROM.read(7);
  settore2[3]=EEPROM.read(8);
  settore3[0]=EEPROM.read(9);
  settore3[1]=EEPROM.read(10);
  settore3[2]=EEPROM.read(11);
  settore3[3]=EEPROM.read(12);
  settore4[0]=EEPROM.read(13);
  settore4[1]=EEPROM.read(14);
  settore4[2]=EEPROM.read(15);
  settore4[3]=EEPROM.read(16);
}

/**********************************************************/

L'unica pecca che rimane è il menù ora diventato lunghissimo
dovrei trovare il modi di spezzarlo in qualche modo in più parti

del tipo:
premo SET per entrare in programmazione
sotto 2 scelte (Settaggio Ora - Settaggio Settori)
successivamente poterne selezionare uno ed entrare in un submenù magari sempre utilizzando il tasto SET per confermare
sotto settaggio ora tutto quello che concerne
metre per il settaggio settori la scelta del settore SET per confermare e sotto di nuovo i settaggi del singolo settore

penso sia un po fantascenza ma penso che con il vostro aiuto dovrei riuscirci

un ulteriore cosa che vorrei fare è far accendere la retroilluminazione solo quando si entra in modalità programmazione o alla pressione di un tasto

grazie in anticipo

Buonasera,

sto provando in tutti i modi a me conosciuti a sistemare il menù ma non ne sto uscendo vivo
avrei bisogno di capire come gestirlo

o comunque come poterlo spezzare in 2 un lato gestione ora e l'altra settaggio orari

Visto che la tua difficoltà è nel gestire un menu, perché non provi una di queste librerie (che trovi nel Library manager) che per l'appunto consentono di creare menu su un LCD?

Io non ho mai avuto necessità di usarle (come ti dicevo io preferisco gestire cose di quel tipo o tramite comandi da seriale o via Wifi ossia http o tramite pacchetti UDP) ma forse ti potrebbe aiutare ad uscire dal "pantano"...

Potresti farlo semplicemente con una macchina a stati finiti: 0 è fuori dal menù; 1, 2, 3, ... sono le diverse voci.

Buonasera,

preso da un attimo di pazzia sono riuscito a creare un menu completo come volevo ora però devo riuscire ad integrarlo nel mio progetto originale e qui mi servono delle dritte d voi GURU del settore

Allego codice del Menù

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//#include "Tasti.h"

#define KY_NONE 0
#define KY_LEFT 1
#define KY_RIGHT 2
#define KY_UP 3
#define KY_DOWN 4
#define KY_SEL 5

#define TH_NONE 1021
#define TH_LEFT 810
#define TH_RIGHT 760
#define TH_UP 680
#define TH_DOWN 510
#define TH_SEL 30

int readKeys() {
  int n = analogRead(A0);
  if ((n >= TH_LEFT-30) && (n <= TH_LEFT+30)) {
    return KY_LEFT;
  } else if ((n >= TH_RIGHT-30) && (n <= TH_RIGHT+30)) {
    return KY_RIGHT;
  } else if ((n >= TH_UP-30) && (n <= TH_UP+30)) {
    return KY_UP;
  } else if ((n >= TH_DOWN-30) && (n <= TH_DOWN+30)) {
    return KY_DOWN;
  } else if ((n >= TH_SEL-30) && (n <= TH_SEL+30)) {
    return KY_SEL;
  } else return KY_NONE;
}

LiquidCrystal_I2C lcd(0x27,16,2);


void setup() {
  Serial.begin(9600);
  Serial.println( "START" );
  
  Wire.begin();
  lcd.begin(16,2);
  lcd.backlight();
  lcd.setCursor(0,0); 
  lcd.print("Progetto Menu");
  delay( 2000 );
  lcd.clear(); 
}

int stato = 0;
bool FIRST = true;

void loop() {
  
  Serial.print("Valore Letto: ");
  Serial.print(analogRead(A0));
  Serial.print("  ");
  Serial.print("Tasto Assegnato: ");
  Serial.print(readKeys());
  Serial.print("  ");
  Serial.print(stato);
  Serial.println();
  delay(500);


  switch(stato) {
    case 0:
      Principale();
    break;
    case 5:
      Set_Data_Ora();
    break;
    case 10:
      Set_Giorno();
    break;
    case 15:
      Set_Mese();
    break;
    case 20:
      Set_Anno();
    break;
    case 25:
      Set_Ora();
    break;
    case 30:
      Set_Min();
    break;
    case 35:
      Set_Sec();
    break;
    case 40:
      Set_Data_Ora_Exit();
    break;
    case 50:
      Set_Settori();
    break;
    case 60:
      Esci_Menu();
    break;
    case 100:
      Settore_1();
    break;
    case 110:
      Settore_1_Start_Ora();
    break;
    case 120:
      Settore_1_Start_Min();
    break;
    case 130:
      Settore_1_Stop_Ora();
    break;
    case 140:
      Settore_1_Stop_Min();
    break;
    case 150:
      Settore_1_Exit();
    break;
    case 200:
      Settore_2();
    break;
    case 210:
      Settore_2_Start_Ora();
    break;
    case 220:
      Settore_2_Start_Min();
    break;
    case 230:
      Settore_2_Stop_Ora();
    break;
    case 240:
      Settore_2_Stop_Min();
    break;
    case 250:
      Settore_2_Exit();
    break;
    case 300:
      Settore_3();
    break;
    case 310:
      Settore_3_Start_Ora();
    break;
    case 320:
      Settore_3_Start_Min();
    break;
    case 330:
      Settore_3_Stop_Ora();
    break;
    case 340:
      Settore_3_Stop_Min();
    break;
    case 350:
      Settore_3_Exit();
    break;
    case 400:
      Settore_4();
    break;
    case 410:
      Settore_4_Start_Ora();
    break;
    case 420:
      Settore_4_Start_Min();
    break;
    case 430:
      Settore_4_Stop_Ora();
    break;
    case 440:
      Settore_4_Stop_Min();
    break;
    case 450:
      Settore_4_Exit();
    break;
    case 500:
      Settore_Esci();
   break;
  }
}

void setStato(int s){
  stato = s;
  FIRST = true;
  lcd.clear();
  delay(500);
}

void Principale() {
  if (FIRST = true) {
    lcd.setCursor(0,0);
    lcd.print(" MER 03/04/2024 ");
    lcd.setCursor(0,1);
    lcd.print("    21:25:15   ");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_SEL:
      setStato(5);
    break;
  }
}

void Set_Data_Ora() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print(" Set Data e Ora ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX    Set:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(50);
    break;
    case KY_LEFT:
      setStato(60);
    break;
    case KY_SEL:
      setStato(10);
    break;
  }  
}

void Set_Giorno() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("Set Giorno: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(15);
    break;
    case KY_LEFT:
      setStato(40);
    break;
    case KY_UP:
      //Modifica giorno +
    break;
    case KY_DOWN:
      //Modifica giorno -
    break;
  }  
}

void Set_Mese() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("Set Mese: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(20);
    break;
    case KY_LEFT:
      setStato(10);
    break;
    case KY_UP:
      //Modifica Mese +
    break;
    case KY_DOWN:
      //Modifica Mese -
    break;
  }  
}

void Set_Anno() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("Set Anno: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(25);
    break;
    case KY_LEFT:
      setStato(15);
    break;
    case KY_UP:
      //Modifica Anno +
    break;
    case KY_DOWN:
      //Modifica Anno -
    break;
  }  
}

void Set_Ora() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("Set Ora: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(30);
    break;
    case KY_LEFT:
      setStato(20);
    break;
    case KY_UP:
      //Modifica Ora +
    break;
    case KY_DOWN:
      //Modifica Ora -
    break;
  }  
}

void Set_Min() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("Set Minuti: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(35);
    break;
    case KY_LEFT:
      setStato(25);
    break;
    case KY_UP:
      //Modifica Min +
    break;
    case KY_DOWN:
      //Modifica Min -
    break;
  }  
}

void Set_Sec() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("Set Secondi: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(40);
    break;
    case KY_LEFT:
      setStato(30);
    break;
    case KY_UP:
      //Modifica sec +
    break;
    case KY_DOWN:
      //Modifica sec -
    break;
  }  
}

void Set_Data_Ora_Exit() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print(" Data/Ora  EXIT ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX   Set:EXIT");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(10);
    break;
    case KY_LEFT:
      setStato(35);
    break;
    case KY_SEL:
      setStato(5);
    break;
  }  
}

void Set_Settori() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("  Set. Settori  ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX    Set:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(60);
    break;
    case KY_LEFT:
      setStato(5);
    break;
    case KY_SEL:
      setStato(100);
    break;
  }  
}

void Settore_1() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print(" Set. Settore 1 ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX    Set:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(200);
    break;
    case KY_LEFT:
      setStato(500);
    break;
    case KY_SEL:
      setStato(110);
    break;
  }  
}

void Settore_1_Start_Ora() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("START 1 Ora: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(120);
    break;
    case KY_LEFT:
      setStato(150);
    break;
    case KY_UP:
      //Modifica Ora Settore 1 Start +
    break;
    case KY_DOWN:
      //Modifica Ora Settore 1 Start -
    break;
  }  
}

void Settore_1_Start_Min() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("START 1 Min: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(130);
    break;
    case KY_LEFT:
      setStato(110);
    break;
    case KY_UP:
      //Modifica Min Settore 1 Start +
    break;
    case KY_DOWN:
      //Modifica Min Settore 1 Start -
    break;
  }  
}

void Settore_1_Stop_Ora() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("STOP 1 Ora: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(140);
    break;
    case KY_LEFT:
      setStato(120);
    break;
    case KY_UP:
      //Modifica Ora Settore 1 Stop +
    break;
    case KY_DOWN:
      //Modifica Ora Settore 1 Stop -
    break;
  }  
}

void Settore_1_Stop_Min() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("STOP 1 Min: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(150);
    break;
    case KY_LEFT:
      setStato(130);
    break;
    case KY_UP:
      //Modifica Min Settore 1 Stop +
    break;
    case KY_DOWN:
      //Modifica Min Settore 1 Stop -
    break;
  }  
}

void Settore_1_Exit() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("Mod Sett. 1 EXIT");
    lcd.setCursor(0,1);
    lcd.print("DX/SX   Set:EXIT");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(110);
    break;
    case KY_LEFT:
      setStato(140);
    break;
    case KY_SEL:
      setStato(100);
    break;
  }  
}

void Settore_2() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print(" Set. Settore 2 ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX    Set:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(300);
    break;
    case KY_LEFT:
      setStato(100);
    break;
    case KY_SEL:
      setStato(210);
    break;
  }  
}

void Settore_2_Start_Ora() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("START 2 Ora: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(220);
    break;
    case KY_LEFT:
      setStato(250);
    break;
    case KY_UP:
      //Modifica Ora Settore 2 Start +
    break;
    case KY_DOWN:
      //Modifica Ora Settore 2 Start -
    break;
  }  
}

void Settore_2_Start_Min() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("START 2 Min: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(230);
    break;
    case KY_LEFT:
      setStato(210);
    break;
    case KY_UP:
      //Modifica Min Settore 2 Start +
    break;
    case KY_DOWN:
      //Modifica Min Settore 2 Start -
    break;
  }  
}

void Settore_2_Stop_Ora() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("STOP 2 Ora: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(240);
    break;
    case KY_LEFT:
      setStato(220);
    break;
    case KY_UP:
      //Modifica Ora Settore 2 Stop +
    break;
    case KY_DOWN:
      //Modifica Ora Settore 2 Stop -
    break;
  }  
}

void Settore_2_Stop_Min() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("STOP 2 Min: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(250);
    break;
    case KY_LEFT:
      setStato(230);
    break;
    case KY_UP:
      //Modifica Min Settore 2 Stop +
    break;
    case KY_DOWN:
      //Modifica Min Settore 2 Stop -
    break;
  }  
}

void Settore_2_Exit() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("Mod Sett. 2 EXIT");
    lcd.setCursor(0,1);
    lcd.print("DX/SX   Set:EXIT");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(210);
    break;
    case KY_LEFT:
      setStato(240);
    break;
    case KY_SEL:
      setStato(200);
    break;
  }  
}

void Settore_3() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print(" Set. Settore 3 ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX    Set:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(400);
    break;
    case KY_LEFT:
      setStato(200);
    break;
    case KY_SEL:
      setStato(310);
    break;
  }  
}

void Settore_3_Start_Ora() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("START 3 Ora: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(320);
    break;
    case KY_LEFT:
      setStato(350);
    break;
    case KY_UP:
      //Modifica Ora Settore 3 Start +
    break;
    case KY_DOWN:
      //Modifica Ora Settore 3 Start -
    break;
  }  
}

void Settore_3_Start_Min() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("START 3 Min: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(330);
    break;
    case KY_LEFT:
      setStato(310);
    break;
    case KY_UP:
      //Modifica Min Settore 3 Start +
    break;
    case KY_DOWN:
      //Modifica Min Settore 3 Start -
    break;
  }  
}

void Settore_3_Stop_Ora() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("STOP 3 Ora: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(340);
    break;
    case KY_LEFT:
      setStato(320);
    break;
    case KY_UP:
      //Modifica Ora Settore 3 Stop +
    break;
    case KY_DOWN:
      //Modifica Ora Settore 3 Stop -
    break;
  }  
}

void Settore_3_Stop_Min() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("STOP 3 Min: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(350);
    break;
    case KY_LEFT:
      setStato(330);
    break;
    case KY_UP:
      //Modifica Min Settore 3 Stop +
    break;
    case KY_DOWN:
      //Modifica Min Settore 3 Stop -
    break;
  }  
}

void Settore_3_Exit() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("Mod Sett. 3 EXIT");
    lcd.setCursor(0,1);
    lcd.print("DX/SX   Set:EXIT");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(310);
    break;
    case KY_LEFT:
      setStato(340);
    break;
    case KY_SEL:
      setStato(300);
    break;
  }  
}

void Settore_4() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print(" Set. Settore 4 ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX    Set:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(500);
    break;
    case KY_LEFT:
      setStato(300);
    break;
    case KY_SEL:
      setStato(410);
    break;
  }  
}

void Settore_4_Start_Ora() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("START 4 Ora: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(420);
    break;
    case KY_LEFT:
      setStato(450);
    break;
    case KY_UP:
      //Modifica Ora Settore 4 Start +
    break;
    case KY_DOWN:
      //Modifica Ora Settore 4 Start -
    break;
  }  
}

void Settore_4_Start_Min() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("START 4 Min: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(430);
    break;
    case KY_LEFT:
      setStato(410);
    break;
    case KY_UP:
      //Modifica Min Settore 4 Start +
    break;
    case KY_DOWN:
      //Modifica Min Settore 4 Start -
    break;
  }  
}

void Settore_4_Stop_Ora() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("STOP 4 Ora: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(440);
    break;
    case KY_LEFT:
      setStato(420);
    break;
    case KY_UP:
      //Modifica Ora Settore 4 Stop +
    break;
    case KY_DOWN:
      //Modifica Ora Settore 4 Stop -
    break;
  }  
}

void Settore_4_Stop_Min() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("STOP 4 Min: ");
    lcd.setCursor(0,1);
    lcd.print("DX/SX  UP/DW:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(450);
    break;
    case KY_LEFT:
      setStato(430);
    break;
    case KY_UP:
      //Modifica Min Settore 4 Stop +
    break;
    case KY_DOWN:
      //Modifica Min Settore 4 Stop -
    break;
  }  
}

void Settore_4_Exit() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("Mod Sett. 4 EXIT");
    lcd.setCursor(0,1);
    lcd.print("DX/SX   Set:EXIT");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(410);
    break;
    case KY_LEFT:
      setStato(440);
    break;
    case KY_SEL:
      setStato(400);
    break;
  }  
}

void Settore_Esci() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("Set Settore EXIT");
    lcd.setCursor(0,1);
    lcd.print("DX/SX    Set:Mod");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(100);
    break;
    case KY_LEFT:
      setStato(400);
    break;
    case KY_SEL:
      setStato(50);
    break;
  }  
}

void Esci_Menu() {
  if (FIRST) {
    lcd.setCursor(0,0);
    lcd.print("Torna Principale");
    lcd.setCursor(0,1);
    lcd.print("DX/SX   Set:EXIT");  
    FIRST = false;
  }

  int key = readKeys();
  switch (key) {
    case KY_RIGHT:
      setStato(5);
    break;
    case KY_LEFT:
      setStato(50);
    break;
    case KY_SEL:
      setStato(0);
    break;
  }  
}


mi è venuto un po lunghino ma alla fine era quello che volevo come posso integrarlo?? tutta la parte che prima era in setMode dovrebbe finire qui soprattutto con le stesse condizioni

capisco bene che tutto il mio programma dovrà essere stravolto ma se mi date dritte posso provarci

Grazie in anticipo

Buonasera,

torno qui da voi per avere un consiglio su un problema che mi ritrovo nel codice che non riesco a trovare soluzione

nei mesi sono andato avanti nell'evoluzione del mio progetto cercando di semplificarlo e renderlo più snello nelle sue funzionalità

il problema che mi ritrovo e far andar d'accordo il comando automatico di attivazione gestito da RTC con quello manuale gestito da pulsanti

ovviamente i pin di uscita comando sono gli stessi e ovviamente mi ritrovo con la condizione e una funzione disabilita l'altra in funzione della loro posizione nel codice in loop

qualcuno di voi saprebbe consigliarmi come far capire ad arduino che le 2 funzioni sono complementari??

allego codice completo

 *
 * Created by Tizianoz
 * Ultima modifica 31 Luglio 2024
 *
/**********************************************************/

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include <avr/wdt.h>


/**********************************************************/
 
#define pinSettore1 6
#define pinSettore2 7
#define pinSettore3 8
#define pinSettore4 9

const int SW_pin = 13; // Joystick digital pin connected to switch output
const int X_pin = A0; // Joystick analog pin connected to X output
const int Y_pin = A1; // Joystick analog pin connected to Y output

/**********************************************************/
//Caratteri Speciali

byte frecciasu [8] = {	
0b00100,	
0b01110,	
0b11111,	
0b00100,	
0b00100,	
0b00100,	
0b00100,	
0b00100	
};	

byte frecciagiu [8] = {	
0b00100,
0b00100,
0b00100,
0b00100,
0b00100,
0b11111,
0b01110,
0b00100
};	

byte frecciasinistra [8] = {	
0b00001,
0b00011,
0b00111,
0b01111,
0b01111,
0b00111,
0b00011,
0b00001
};	

byte frecciadestra [8] = {	
0b10000,
0b11000,
0b11100,
0b11110,
0b11110,
0b11100,
0b11000,
0b10000
};	

/**********************************************************/
 
int settore1[] = {05,00,05,20};
int settore2[] = {05,30,05,50};
int settore3[] = {06,00,06,20};
int settore4[] = {21,25,21,20};
 
char buffer[16];
unsigned long time=0;
unsigned long timeSet=0;
int  setModeTime=2000;

/**********************************************************/
 
RTC_DS1307 RTC;
LiquidCrystal_I2C lcd(0x27,16,2);
char daysOfTheWeek[7][12] = {"DOM", "LUN", "MAR", "MER", "GIO", "VEN", "SAB"};

/**********************************************************/

//ATTIVAZIONE SETTORI MANUALE

int val;
int bottone1 = 2;
int statoLed1=LOW;
int bottone2 = 3;
int statoLed2=LOW;
int bottone3 = 4;
int statoLed3=LOW;
int bottone4 = 5;
int statoLed4=LOW;


/**********************************************************/

void setup() {

  wdt_disable();

  Serial.begin(9600);
  Serial.println( "START" );
 
  Wire.begin();
  RTC.begin();
  lcd.begin(16, 2);
  lcd.backlight();

  lcd.createChar (0, frecciasu);
  lcd.createChar (1, frecciagiu);
  lcd.createChar (2, frecciasinistra);
  lcd.createChar (3, frecciadestra);

  pinMode( pinSettore1,OUTPUT );
  pinMode( pinSettore2,OUTPUT );
  pinMode( pinSettore3,OUTPUT );
  pinMode( pinSettore4,OUTPUT );
  
  // ASSEGNAZIONE PIN SETTORE MANUALE
   
  pinMode(bottone1, INPUT);     
  pinMode(bottone2, INPUT); 
  pinMode(bottone3, INPUT); 
  pinMode(bottone4, INPUT); 

  pinMode(SW_pin, INPUT);             //Set joystick pushbutton as input
  digitalWrite(SW_pin, HIGH);         //Set joystick SW_pin High  

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
 
  digitalWrite( pinSettore1,LOW );
  digitalWrite( pinSettore2,LOW );
  digitalWrite( pinSettore3,LOW );
  digitalWrite( pinSettore4,LOW );
  
  lcd.clear();
  lcd.setCursor(0,0); 
  lcd.print("Irrigazione V1.0");
  lcd.setCursor(0,1); 
  lcd.print("Created Tizianoz");
  delay( 5000 );
  lcd.clear();

  LeggiEeprom();

  //abilito il watchdog e imposto come tempo di reser 8 secondi 
  wdt_enable(WDTO_8S);
}
 
/**********************************************************/
 
void loop() {
   
  int _button = ctrlButton(); 
  
  Serial.print (digitalRead(bottone1));
  Serial.print(' ');
  Serial.print (digitalRead(bottone2));
  Serial.print(' ');
  Serial.print (digitalRead(bottone3));
  Serial.print(' ');
  Serial.print (digitalRead(bottone4));
  Serial.print(' ');
  Serial.print (_button);
  Serial.println();


  if ( RTC.isrunning()) {
 
    DateTime now = RTC.now();
    int _button = ctrlButton();
 
    if ( _button == 0 || _button > 1) { time = millis(); }
 
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(' ');
    Serial.print(now.day(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.year(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.print(' ');
    Serial.print('-');
    Serial.print(' ');
    Serial.print("Settore 1");
    Serial.print(' ');
    Serial.print('(');
    Serial.print(settore1[0]);
    Serial.print(':');
    Serial.print(settore1[1]);
    Serial.print(' ');
    Serial.print(settore1[2]);
    Serial.print(':');
    Serial.print(settore1[3]);
    Serial.print(')');
    Serial.print(' ');
    Serial.print('-');
    Serial.print(' ');
    Serial.print("Settore 2");
    Serial.print(' ');
    Serial.print('(');
    Serial.print(settore2[0]);
    Serial.print(':');
    Serial.print(settore2[1]);
    Serial.print(' ');
    Serial.print(settore2[2]);
    Serial.print(':');
    Serial.print(settore2[3]);
    Serial.print(')');
    Serial.print(' ');
    Serial.print('-');
    Serial.print(' ');
    Serial.print("Settore 3");
    Serial.print(' ');
    Serial.print('(');
    Serial.print(settore3[0]);
    Serial.print(':');
    Serial.print(settore3[1]);
    Serial.print(' ');
    Serial.print(settore3[2]);
    Serial.print(':');
    Serial.print(settore3[3]);
    Serial.print(')');  
    Serial.print(' ');
    Serial.print('-');
    Serial.print(' ');
    Serial.print("Settore 4");
    Serial.print(' ');
    Serial.print('(');
    Serial.print(settore4[0]);
    Serial.print(':');
    Serial.print(settore4[1]);
    Serial.print(' ');
    Serial.print(settore4[2]);
    Serial.print(':');
    Serial.print(settore4[3]);
    Serial.print(')');
    Serial.println();
 
    int _hour   = now.hour();
    int _minute = now.minute();
    int _current   = (now.hour() * 60) + now.minute();

    startArea(1, _current);  // Settore Uno
    startArea(2, _current);  // Settore Due
    startArea(3, _current);  // Settore Tre
    startArea(4, _current);  // Settore Quattro
    Manuale();
    delay( 30 );

    view_date_time( now );
 
    if (time > 0 && setModeTime < (millis() - time) ) { setMode( now ); }
  }
  
  //resetto il watchdog 
  wdt_reset();

}
 
/**********************************************************/
 
void startArea(byte area, int current) {
 
    int  _currStart; 
    int  _currStop;
    byte _currPin;
     
    switch(area) {
        case 1:
           _currStart = (settore1[0]*60) + settore1[1];
           _currStop  = (settore1[2]*60) + settore1[3];
           _currPin   = pinSettore1;
        break;
         
        case 2:
           _currStart = (settore2[0]*60) + settore2[1];
           _currStop  = (settore2[2]*60) + settore2[3];
           _currPin   = pinSettore2;
        break;
         
        case 3:
           _currStart = (settore3[0]*60) + settore3[1];
           _currStop  = (settore3[2]*60) + settore3[3];
           _currPin   = pinSettore3;
        break;
         
        case 4:
           _currStart = (settore4[0]*60) + settore4[1];
           _currStop  = (settore4[2]*60) + settore4[3];
           _currPin   = pinSettore4;
        break;
    }
     
    if ((_currStart<=current) && (current<=_currStop)) {
        digitalWrite( _currPin,HIGH );
        
         
    } else {
        digitalWrite( _currPin,LOW );
        
    } 
}
 
/**********************************************************/

void Manuale() {

  int _button = ctrlButton();

  if ((_button == 2) || (digitalRead(bottone1) == 1))
  {
     if (statoLed1 == LOW)
     { statoLed1=HIGH;
     } else
     { statoLed1=LOW;
     }
     digitalWrite(pinSettore1, statoLed1);
     delay(300);
  }
  if ((_button == 3) || (digitalRead(bottone2) == 1))
  {
     if (statoLed2 == LOW)
     { statoLed2=HIGH;
     } else
     { statoLed2=LOW;
     }
     digitalWrite(pinSettore2, statoLed2);
     delay(300);
  }
  
  if ((_button == 4) || (digitalRead(bottone3) == 1))
  {
     if (statoLed3 == LOW)
     { statoLed3=HIGH;
     } else
     { statoLed3=LOW;
     }
     digitalWrite(pinSettore3, statoLed3);
     delay(300);
  }

  if ((_button == 5) || (digitalRead(bottone4) == 1))
  {
    if (statoLed4 == LOW)
     { statoLed4=HIGH;
     } else
     { statoLed4=LOW;
     }
     digitalWrite(pinSettore4, statoLed4);
     delay(300);
  }
}

/**********************************************************/
 
int ctrlButton() {
 
  int XValue = analogRead(X_pin);     // Read the analog value from The X-axis from the joystick
  int YValue = analogRead(Y_pin);     // Read the analog value from The Y-axis from the joystick
  int SwValue = digitalRead(SW_pin);  // Read the digital value from The Button from the joystick
 
  if ( SwValue == 0 )      { return 1; }
  if ( XValue < 200 )      { return 2; }
  if ( XValue > 800 )      { return 3; }
  if ( YValue < 200 )      { return 4; }
  if ( YValue > 800 )      { return 5; }

  return 0;
 
}
 
/**********************************************************/
 
void view_date_time ( DateTime now ) {
 
    lcd.clear();
    
    lcd.setCursor(1,0);
    switch (now.dayOfTheWeek() ) {   
    case 0:
      lcd.print("DOM");
      break;
    case 1:
      lcd.print("LUN");
      break;
    case 2:
      lcd.print("MAR");
      break;
    case 3:
      lcd.print("MER");
      break;
    case 4:
      lcd.print("GIO");
      break;
    case 5:
      lcd.print("VEN");
      break;
    case 6:
      lcd.print("SAB");
      break;
    }
    
    sprintf(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());
    lcd.setCursor(5,0);
    lcd.print( buffer );
 
    char buffer[10] = "";
 
    sprintf(buffer,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
    lcd.setCursor(4,1);
    lcd.print( buffer );
 
    delay(1000);
}

/**********************************************************/
 
void setMode( DateTime now ) {
    boolean setMode = true;
    int setModeLevel = 0;
 
    int _day = now.day();
    int _month = now.month();
    int _year = now.year();
    int _hour = now.hour();
    int _min = now.minute();
    int _sec = now.second();
    
    lcd.clear();
    lcd.setCursor(0,0);
    sprintf(buffer,  "%s: %02d", "Giorno", _day);
    delay( 500 );
    timeSet = millis();
 
    while ( setMode ) {
      int _button = ctrlButton();
 
      if ( _button > 1 ) { timeSet = millis(); }
 
      lcd.setCursor(0,0);
 
      // Set Day
      if ( setModeLevel == 0 ) {
        if ( _button == 3 && _day < 31) { wdt_reset(); _day++; }
        if ( _button == 2 && _day > 1) { wdt_reset(); _day--; }
        
        sprintf(buffer,  "%s: %02d", "Giorno", _day);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
      // Set Month
      if ( setModeLevel == 1 ) {
        if ( _button == 3 && _month < 12) { wdt_reset(); _month++; }
        if ( _button == 2 && _month > 1) { wdt_reset(); _month--; }
 
        sprintf(buffer,  "%s: %02d", "Mese", _month);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
      // Set Year
      if ( setModeLevel == 2 ) {
        if ( _button == 3 && _year < 9999) { wdt_reset(); _year++; }
        if ( _button == 2 && _year > 1900) { wdt_reset(); _year--; }
 
        sprintf(buffer,  "%s: %02d", "Anno", _year);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
      // Set Hour
      if ( setModeLevel == 3 ) {
        if ( _button == 3 && _hour < 24) { wdt_reset(); _hour++; }
        if ( _button == 2 && _hour > 1) { wdt_reset(); _hour--; }
 
        sprintf(buffer,  "%s: %02d", "Ora", _hour);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
      // Set Minute
      if ( setModeLevel == 4 ) {
        if ( _button == 3 && _min < 59) { wdt_reset(); _min++; }
        if ( _button == 2 && _min > 0) { wdt_reset(); _min--; }
 
        sprintf(buffer,  "%s: %02d", "Minuti", _min);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
      // Set Second
      if ( setModeLevel == 5 ) {
        if ( _button == 3 && _sec < 59) { wdt_reset(); _sec++; }
        if ( _button == 2 && _sec > 0) { wdt_reset(); _sec--; }
 
        sprintf(buffer,  "%s: %02d", "Secondi", _sec);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
      //Set Start1
      if ( setModeLevel == 6 ) {
        if ( _button == 3 && settore1[0] < 24) { wdt_reset(); settore1[0]++; }
        if ( _button == 2 && settore1[0] > 1) { wdt_reset(); settore1[0]--; }
 
        sprintf(buffer,  "%s: %02d", "START 1 Ora", settore1[0]);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
     //Set Start1
      if ( setModeLevel == 7 ) {
        if ( _button == 3 && settore1[1] < 59) { wdt_reset(); settore1[1]++; }
        if ( _button == 2 && settore1[1] > 0) { wdt_reset(); settore1[1]--; }
 
        sprintf(buffer,  "%s: %02d", "START 1 Min", settore1[1]);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
      //Set Stop1
      if ( setModeLevel == 8 ) {
        if ( _button == 3 && settore1[2] < 24) { wdt_reset(); settore1[2]++; }
        if ( _button == 2 && settore1[2] > 1) { wdt_reset(); settore1[2]--; }
 
        sprintf(buffer,  "%s: %02d", "STOP 1 Ora", settore1[2]);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
     //Set Stop1
      if ( setModeLevel == 9 ) {
        if ( _button == 3 && settore1[3] < 59) { wdt_reset(); settore1[3]++; }
        if ( _button == 2 && settore1[3] > 0) { wdt_reset(); settore1[3]--; }
 
        sprintf(buffer,  "%s: %02d", "STOP 1 Min", settore1[3]);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
      //Set Start2
      if ( setModeLevel == 10 ) {
        if ( _button == 3 && settore2[0] < 24) { wdt_reset(); settore2[0]++; }
        if ( _button == 2 && settore2[0] > 1) { wdt_reset(); settore2[0]--; }
 
        sprintf(buffer,  "%s: %02d", "START 2 Ora", settore2[0]);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
     //Set Start2
      if ( setModeLevel == 11 ) {
        if ( _button == 3 && settore2[1] < 59) { wdt_reset(); settore2[1]++; }
        if ( _button == 2 && settore2[1] > 0) { wdt_reset(); settore2[1]--; }
 
        sprintf(buffer,  "%s: %02d", "START 2 Min", settore2[1]);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
      //Set Stop2
      if ( setModeLevel == 12 ) {
        if ( _button == 3 && settore2[2] < 24) { wdt_reset(); settore2[2]++; }
        if ( _button == 2 && settore2[2] > 1) { wdt_reset(); settore2[2]--; }
 
        sprintf(buffer,  "%s: %02d", "STOP 2 Ora", settore2[2]);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
     //Set Stop2
      if ( setModeLevel == 13 ) {
        if ( _button == 3 && settore2[3] < 59) { wdt_reset(); settore2[3]++; }
        if ( _button == 2 && settore2[3] > 0) { wdt_reset(); settore2[3]--; }
 
        sprintf(buffer,  "%s: %02d", "STOP 2 Min", settore2[3]);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
      //Set Start3
      if ( setModeLevel == 14 ) {
        if ( _button == 3 && settore3[0] < 24) { wdt_reset(); settore3[0]++; }
        if ( _button == 2 && settore3[0] > 1) { wdt_reset(); settore3[0]--; }
 
        sprintf(buffer,  "%s: %02d", "START 3 Ora", settore3[0]);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
     //Set Start3
      if ( setModeLevel == 15 ) {
        if ( _button == 3 && settore3[1] < 59) { wdt_reset(); settore3[1]++; }
        if ( _button == 2 && settore3[1] > 0) { wdt_reset(); settore3[1]--; }
 
        sprintf(buffer,  "%s: %02d", "START 3 Min", settore3[1]);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
      //Set Stop3
      if ( setModeLevel == 16 ) {
        if ( _button == 3 && settore3[2] < 24) { wdt_reset(); settore3[2]++; }
        if ( _button == 2 && settore3[2] > 1) { wdt_reset(); settore3[2]--; }
 
        sprintf(buffer,  "%s: %02d", "STOP 3 Ora", settore3[2]);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
     //Set Stop3
      if ( setModeLevel == 17 ) {
        if ( _button == 3 && settore3[3] < 59) { wdt_reset(); settore3[3]++; }
        if ( _button == 2 && settore3[3] > 0) { wdt_reset(); settore3[3]--; }
 
        sprintf(buffer,  "%s: %02d", "STOP 3 Min", settore3[3]);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
      //Set Start4
      if ( setModeLevel == 18 ) {
        if ( _button == 3 && settore4[0] < 24) { wdt_reset(); settore4[0]++; }
        if ( _button == 2 && settore4[0] > 1) { wdt_reset(); settore4[0]--; }
 
        sprintf(buffer,  "%s: %02d", "START 4 Ora", settore4[0]);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
     //Set Start4
      if ( setModeLevel == 19 ) {
        if ( _button == 3 && settore4[1] < 59) { wdt_reset(); settore4[1]++; }
        if ( _button == 2 && settore4[1] > 0) { wdt_reset(); settore4[1]--; }
 
        sprintf(buffer,  "%s: %02d", "START 4 Min", settore4[1]);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
      //Set Stop4
      if ( setModeLevel == 20 ) {
        if ( _button == 3 && settore4[2] < 24) { wdt_reset(); settore4[2]++; }
        if ( _button == 2 && settore4[2] > 1) { wdt_reset(); settore4[2]--; }
 
        sprintf(buffer,  "%s: %02d", "STOP 4 Ora", settore4[2]);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }
     //Set Stop4
      if ( setModeLevel == 21 ) {
        if ( _button == 3 && settore4[3] < 59) { wdt_reset(); settore4[3]++; }
        if ( _button == 2 && settore4[3] > 0) { wdt_reset(); settore4[3]--; }
 
        sprintf(buffer,  "%s: %02d", "STOP 4 Min", settore4[3]);
        lcd.print(buffer);
        lcd.setCursor(0,1);
        lcd.write (byte (2));
        lcd.setCursor(1,1);
        lcd.print(" - ");
        lcd.setCursor(4,1);
        lcd.write (byte (3));
        lcd.setCursor(9,1);
        lcd.write (byte (0));
        lcd.setCursor(10,1);
        lcd.print("/");
        lcd.setCursor(11,1);
        lcd.write (byte (1));
        lcd.setCursor(12,1);
        lcd.print(" Mod");
      }

      lcd.print( buffer );
      if ( _button == 5 ) { lcd.clear(); wdt_reset(); setModeLevel++;  }
      if ( _button == 4 ) { lcd.clear(); wdt_reset(); setModeLevel--;  }
      if ( setModeLevel > 21 ) { setModeLevel=0; }
      if ( setModeLevel < 0 ) { setModeLevel=21; }

      if (timeSet > 0 && (setModeTime*2) < (millis() - timeSet) ) {
         RTC.adjust(DateTime(_year, _month, _day, _hour, _min, _sec));
         setMode = false;
      }
      delay(200);
    }

    ScriviEeprom();

}

/**********************************************************/

void ScriviEeprom()
{ 
  EEPROM.update(0, 170);
  EEPROM.update(1, settore1[0]);
  EEPROM.update(2, settore1[1]);
  EEPROM.update(3, settore1[2]);
  EEPROM.update(4, settore1[3]);
  EEPROM.update(5, settore2[0]);
  EEPROM.update(6, settore2[1]);
  EEPROM.update(7, settore2[2]);
  EEPROM.update(8, settore2[3]);
  EEPROM.update(9, settore3[0]);
  EEPROM.update(10, settore3[1]);
  EEPROM.update(11, settore3[2]);
  EEPROM.update(12, settore3[3]);
  EEPROM.update(13, settore4[0]);
  EEPROM.update(14, settore4[1]);
  EEPROM.update(15, settore4[2]);
  EEPROM.update(16, settore4[3]);
}

/**********************************************************/

void LeggiEeprom()
{ 
  if(EEPROM.read(0)!=170) return;    // se non 170 su primo byte, esce
  settore1[0]=EEPROM.read(1);
  settore1[1]=EEPROM.read(2);
  settore1[2]=EEPROM.read(3);
  settore1[3]=EEPROM.read(4);
  settore2[0]=EEPROM.read(5);
  settore2[1]=EEPROM.read(6);
  settore2[2]=EEPROM.read(7);
  settore2[3]=EEPROM.read(8);
  settore3[0]=EEPROM.read(9);
  settore3[1]=EEPROM.read(10);
  settore3[2]=EEPROM.read(11);
  settore3[3]=EEPROM.read(12);
  settore4[0]=EEPROM.read(13);
  settore4[1]=EEPROM.read(14);
  settore4[2]=EEPROM.read(15);
  settore4[3]=EEPROM.read(16);
}

/**********************************************************/

accetto consigli

grazie