DS1307 Regolazione tramite pulsanti

Ciao a tutti,
nel dispositivo che sto assemblando, necessito oltre che visualizzare data e ora, anche di una funzione TimeSwitch, tipo presa temporizzata, il problema è che il tutto dovrebbe essere sandalone e quindi dovrei regolare data, ora, ora accensione e ora spegnimento , possibilmente utilizzando solo 3 pulsanti ( ma anche 4 va bene).

Vi allego la parte del codice, ma non funziona correttamente, ad esempio i “contatori” aumentano senza che io prema il pulsante.

Comunque l’ideale sarebbe che un pulsante mi permetta di passare da una funzione all’altra (es. giorno–>mese–>anno–>ora…ecc) e con gli altri due, incrementare o decrementare il valore; sarebbe opportuno inoltre riuscire a “bloccare” il loop ( almeno sul display) mentre esegue le impostazioni di set.

 if (digitalRead(TimeRegBut)) { 
      delay(15);
      setModeLevel=setModeLevel +1;
    Serial.println (setModeLevel);
    };
 
    DateTime now = RTC.now();
    lcd.clear();
 
    sprintf(buffer,  "%02d/%02d", now.day(), now.month());
    lcd.setCursor(0,0);
    lcd.print( buffer );
 
    char buffer[10] = "";
 
    sprintf(buffer,  "%02d:%02d", now.hour(), now.minute());
    lcd.setCursor(0,1);
    lcd.print( buffer );
    while (digitalRead(Set)) {
    Serial.println (" SETMODE ");
    Serial.println (setModeLevel);
    boolean setMode = true;
    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 ) {
      if (digitalRead(TimeRegBut) == HIGH || digitalRead(TimeUp) == HIGH || digitalRead(TimeDn) == HIGH ) { timeSet = millis(); }
 
      lcd.setCursor(0,0);
 
      // Set Day
      if ( setModeLevel == 0 ) {
        if ( digitalRead(TimeUp) == HIGH && _day < 31) { _day++; }
        if ( digitalRead(TimeDn) == HIGH && _day > 1) { _day--; }
 
        sprintf(buffer,  "%s: %02d", "Giorno", _day);
      }
      // Set Month
      if ( setModeLevel == 1 ) {
        if ( digitalRead(TimeUp) == HIGH && _month < 12) { _month++; }
        if ( digitalRead(TimeDn) == HIGH && _month > 1) { _month--; }
 
        sprintf(buffer,  "%s: %02d", "Mese", _month);
      }
      // Set Year
      if ( setModeLevel == 2 ) {
        if ( digitalRead(TimeUp) == HIGH && _year < 9999) { _year++; }
        if ( digitalRead(TimeDn) == HIGH && _year > 1900) { _year--; }
 
        sprintf(buffer,  "%s: %02d", "Anno", _year);
      }
      // Set Hour
      if ( setModeLevel == 3 ) {
        if ( digitalRead(TimeUp) == HIGH && _hour < 24) { _hour++; }
        if ( digitalRead(TimeDn) == HIGH && _hour > 1) { _hour--; }
 
        sprintf(buffer,  "%s: %02d", "Ora", _hour);
      }
      // Set Minute
      if ( setModeLevel == 4 ) {
        if ( digitalRead(TimeUp) == HIGH && _min < 60) { _min++; }
        if ( digitalRead(TimeDn) == HIGH && _min > 1) { _min--; }
 
        sprintf(buffer,  "%s: %02d", "Minuti", _min);
      }
      // Set Second
      if ( setModeLevel == 5 ) {
        if ( digitalRead(TimeUp) == HIGH && _sec < 60) { _sec++; }
        if ( digitalRead(TimeDn) == HIGH && _sec > 0) { _sec--; }
 
        sprintf(buffer,  "%s: %02d", "Secondi", _sec);
      }
      //Set OraStart
       if ( setModeLevel == 6 ) {
        if ( digitalRead(TimeUp) == HIGH && _sec < 24) { OraStart++; }
        if ( digitalRead(TimeDn) == HIGH && _sec > 1) { OraStart--; }
 
        sprintf(buffer,  "%s: %02d", "OraStart", OraStart);
      }
       //Set MinStart
       if ( setModeLevel == 7 ) {
        if ( digitalRead(TimeUp) == HIGH && _sec < 60) { MinStart++; }
        if ( digitalRead(TimeDn) == HIGH && _sec > 1) { MinStart--; }
 
        sprintf(buffer,  "%s: %02d", "MinStart", MinStart);
      }
      //Set OraOFF
       if ( setModeLevel == 8 ) {
        if ( digitalRead(TimeUp) == HIGH && _sec < 24) { OraOff++;}
        if ( digitalRead(TimeDn) == HIGH && _sec > 1) { OraOff--; }
 
        sprintf(buffer,  "%s: %02d", "OraOff", OraOff);
      }
       //Set MinStart
       if ( setModeLevel == 9 ) {
        if ( digitalRead(TimeUp) == HIGH && _sec < 60) { MinOff++; }
        if ( digitalRead(TimeDn) == HIGH && _sec > 1) { MinOff--; }
 
        sprintf(buffer,  "%s: %02d", "MinOff", MinOff);
      }
      lcd.print( buffer );
    //  if ( digitalRead(TimeRegBut) == HIGH ) { lcd.clear(); setModeLevel++;  }
      if ( setModeLevel > 9 ) { setModeLevel=0; }
 
      if (digitalRead(Set) == LOW) {
         RTC.adjust(DateTime(_year, _month, _day, _hour, _min, _sec));
         setMode = false;
      }
      delay(200);
      
    }
    }

grazie
Jacopo

Ciao, domandina base: i pulsanti sono normalmente aperti e collegati verso positivo con una resistenza a massa, vero?

Stefano

@snake301090: ... so che sei un vecchio utente, ma non c'è un tuo post di presentazione ...
... ti dispiacerebbe cortesemente presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e leggere il REGOLAMENTO aggiornato.

Grazie.

Guglielmo

cam9500:
Ciao, domandina base: i pulsanti sono normalmente aperti e collegati verso positivo con una resistenza a massa, vero?

Stefano

ciao stefano, no nessuna resistenza a massa, che valore dovrei utilizzare? e perdona l'ignoranza, che utilità ha?

grazie
Jacopo

gpb01:
@snake301090: ... so che sei un vecchio utente, ma non c'è un tuo post di presentazione ...
... ti dispiacerebbe cortesemente presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e leggere il REGOLAMENTO aggiornato.

Grazie.

Guglielmo

ciao Guglielmo,
perdonami, pensavo di averlo fatto tempo addietro, provvedo subito!
grazie per la segnalazione.

Jacopo

Vi allego la parte del codice, ma non funziona correttamente, ad esempio i "contatori" aumentano senza che io prema il pulsante.

Ciao, domandina base: i pulsanti sono normalmente aperti e collegati verso positivo con una resistenza a massa, vero?

Metti resistenze da ca 10kOhm da cianscun'entrata a massa e vedrai che funziona.
Ciao Uwe

snake301090:
ciao stefano, no nessuna resistenza a massa, che valore dovrei utilizzare? e perdona l'ignoranza, che utilità ha?

grazie
Jacopo

In pratica i pin di arduino quando configurati come ingressi senza pullup, sono delle "antenne" nel senso che possono captare interferenze (es. lampada al neon che si accende) ed interpretarle come segnali. Mettendo una resistenza (o utilizzando quella di pullup interna) si risolve il problema.
Quindi per avere il circuito "stabile" o metti delle resistenze verso massa esterne, oppure attivi quelle interne di pullup.
Nel secondo caso metti i pulsanti tra ingresso e massa e quando il pulsante è schiacciato hai uno 0 anzichè 1: devi quindi invertire la logica.
Il secondo caso rispetto al primo non necessita di aggiungere resistenze.....
Stefano

Grazie a tutti per la dritta, ora il contatore è ok, tuttavia quando provo a cambiare es l"anno, mi fa il passaggio 2016-->2017 ma poi torna 2016.. avete idea del perché?
grazie

Jacopo

Salva male solo l'anno o anche mese o giorno?
Controllato il formato nel salvataggio?

Salva male qualsiasi cosa, il problema è che sembra non mi lasci il tempo di impostare ma continui in loop e quindi ad ogni giro, riparte dal valore di prima..

Ciao, per iniziare prova a semplificare facendo il salvataggio quando setModeLevel > 9 e stampa sulla seriale il comando per vedere se stai programmando l'RTC correttamente.....

Quindi alla fine dovrei fare tipo

  if ( setModeLevel > 9 ) {
 
    
         RTC.adjust(DateTime(_year, _month, _day, _hour, _min, _sec));
Serial.println( RTC.adjust(DateTime))
}

Mi scuso per errori, ma scrivo dal cellulare.

Grazie
Jacopo

Rieccomi, questa è la "base " per la regolazione, indipendentemente che sia ora, minuti, anno ecc, ho aggiunto la stampa seriale del buffer per capire meglio il problema;

if ( setModeLevel == 0 ) {
        if ( digitalRead(TimeUp) == HIGH && _day < 31) { _day++; }
        if ( digitalRead(TimeDn) == HIGH && _day > 1) { _day--; }
 
        sprintf(buffer,  "%s: %02d", "Giorno", _day);
        Serial.print (buffer);

[/code]

Nel monitor seriale ( e nell lcd ), vedo che il giorno passa da 24 a 25, solo fin che tengo premuto il pulsante, appena lo rilascio torna a 24;
Mentre tengo premuto il pulsante aumenta solo di 1 ( non continua 24–>25–>26 ecc…) e appena mollo torna a 24, questo per qualsiasi regolazione io tenti.

Vi posto il blocco “regolazione” nella speranza possiate aiutarmi a trovare il problema.

    while ( SetCount== 1 ) {
      delay(100);

        
    Serial.println ("Count");
    Serial.println ( SetCount);
    Serial.println (" SETMODE ");
    Serial.println (setModeLevel);
    boolean setMode = true;
    
 
    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();

    if (digitalRead (TimeRegBut) == HIGH) { setModeLevel++;
    Serial.print ("TH");
    Serial.println ( setModeLevel);}
    
      //if (digitalRead(TimeRegBut) == HIGH || digitalRead(TimeUp) == HIGH || digitalRead(TimeDn) == HIGH ) { timeSet = millis(); }
 
      lcd.setCursor(0,0);
 
      // Set Day
      if ( setModeLevel == 0 ) {
        if ( digitalRead(TimeUp) == HIGH && _day < 31) { _day++; }
        if ( digitalRead(TimeDn) == HIGH && _day > 1) { _day--; }
 
        sprintf(buffer,  "%s: %02d", "Giorno", _day);
        Serial.print (buffer);
     
      }
      // Set Month
      if ( setModeLevel == 1 ) {
        if ( digitalRead(TimeUp) == HIGH && _month < 12) { _month++; }
        if ( digitalRead(TimeDn) == HIGH && _month > 1) { _month--; }
 
        sprintf(buffer,  "%s: %02d", "Mese", _month);
      }
      // Set Year
      if ( setModeLevel == 2 ) {
        if ( digitalRead(TimeUp) == HIGH && _year < 9999) { _year++; }
        if ( digitalRead(TimeDn) == HIGH && _year > 1900) { _year--; }
 
        sprintf(buffer,  "%s: %02d", "Anno", _year);
      }
      // Set Hour
      if ( setModeLevel == 3 ) {
        if ( digitalRead(TimeUp) == HIGH && _hour < 24) { _hour++; }
        if ( digitalRead(TimeDn) == HIGH && _hour > 1) { _hour--; }
 
        sprintf(buffer,  "%s: %02d", "Ora", _hour);
      }
      // Set Minute
      if ( setModeLevel == 4 ) {
        if ( digitalRead(TimeUp) == HIGH && _min < 60) { _min++; }
        if ( digitalRead(TimeDn) == HIGH && _min > 1) { _min--; }
 
        sprintf(buffer,  "%s: %02d", "Minuti", _min);
      }
      // Set Second
      if ( setModeLevel == 5 ) {
        if ( digitalRead(TimeUp) == HIGH && _sec < 60) { _sec++; }
        if ( digitalRead(TimeDn) == HIGH && _sec > 0) { _sec--; }
 
        sprintf(buffer,  "%s: %02d", "Secondi", _sec);
      }
      //Set OraStart
       if ( setModeLevel == 6 ) {
        if ( digitalRead(TimeUp) == HIGH && _sec < 24) { OraStart++; }
        if ( digitalRead(TimeDn) == HIGH && _sec > 1) { OraStart--; }
 
        sprintf(buffer,  "%s: %02d", "OraStart", OraStart);
      }
       //Set MinStart
       if ( setModeLevel == 7 ) {
        if ( digitalRead(TimeUp) == HIGH && _sec < 60) { MinStart++; }
        if ( digitalRead(TimeDn) == HIGH && _sec > 1) { MinStart--; }
 
        sprintf(buffer,  "%s: %02d", "MinStart", MinStart);
      }
      //Set OraOFF
       if ( setModeLevel == 8 ) {
        if ( digitalRead(TimeUp) == HIGH && _sec < 24) { OraOff++;}
        if ( digitalRead(TimeDn) == HIGH && _sec > 1) { OraOff--; }
 
        sprintf(buffer,  "%s: %02d", "OraOff", OraOff);
      }
       //Set MinStart
       if ( setModeLevel == 9 ) {
        if ( digitalRead(TimeUp) == HIGH && _sec < 60) { MinOff++; }
        if ( digitalRead(TimeDn) == HIGH && _sec > 1) { MinOff--; }
 
        sprintf(buffer,  "%s: %02d", "MinOff", MinOff);
      }
      lcd.print( buffer );
    //  if ( digitalRead(TimeRegBut) == HIGH ) { lcd.clear(); setModeLevel++;  }
      if ( setModeLevel > 9 ) { setModeLevel=0; }

      
      if (setModeLevel > 9 ) {
         RTC.adjust(DateTime(_year, _month, _day, _hour, _min, _sec));}
       
         if (digitalRead(Set)== HIGH) { 
    delay(15);
   
    SetCount=SetCount +1;
    if ( SetCount > 2) { SetCount = 0;} 
    }
              
      
      while ( SetCount == 2){

        Serial.println ("Count");
    Serial.println ( SetCount);
    

    delay(1000);
        
         if (digitalRead(Set)== HIGH) { 
    delay(15);
   
    SetCount=SetCount +1;
    if ( SetCount == 3) { SetCount = 0;} 
    }
      }

Ho aggiunto un altra regolazione (SetCount == 2) ma per il momento non ci sono parametri, l’ho messa solo per testarne il funzionamento a display.

Grazie mille

Ciao, non è che ogni volta che riparte il loop ricarica i dati dall'RTC

    int _day = now.day();
    int _month = now.month();
    int _year = now.year();
    int _hour = now.hour();
    int _min = now.minute();
    int _sec = now.second();

quindi annulli l'incremento?
Se sei in modalità di editing devi escludere le righe qui sopra....

Stefano

Ciao Stefano, grazie per la risposta
purtroppo se escludo quelle righe l'IDE mi da errore : " '_day' was not declared in this scope" e se provo solo a rimuovere tutte le voci "now." quando vado a fare il set mi esce "giorno 17020" e non il pulsante non ha alcun effetto su tale valore.

son sempre più convinto che sia sbagliato tutta questa parte di codice :frowning:

per caso hai/avete qualche suggerimento o informazione su un codice che possa funzionare per regolare l'ora utilizzando 3 o 4 pulsanti?

grazie

Jacopo

Ciao, ok, allora dovresti spostare quel blocco nel setup e poi nel loop le rivalorizzi ogni "giro" dall'RTC ma non quando stai facendo modifica.
Come hai fatto tu, ogni giro del loop carichi data ed ora, modifichi, la visualizzi e quando ricomincia il ciclo perdi le modifiche poichè ri-setti le variabili con il contenuto dell'RTC.... nn so se mi spiego...

Credevo di si, ma provando mi da errore di compilazione..
quindi forse non ho ben capito..

Ok, beh, ma che errore è?

Non ti saprei dire adesso l’errore, nel caso domani riprovo e te lo posto, ho trovato però un codice (/RTC-SET-AND-SHOW-THE-TIME-ON-YOUR-LCD) che ho pensato di adattare, e infatti sembra funzionare “meglio” nel senso che (almeno da seriale) riesco a cambiare i valori e a salvarli sul DS1307. Qui però, passata la fase del void setup(), il display si cancella, ma non riesco a visualizzare l’ora, o la data, dove sto sbagliando?

PS devo ancora implementare i pulsanti per aumentare o diminuire i valori;
PS2 l’anno mi viene brutalmente sbagliato, per far uscire 2015 nel monitor seriale, ho dovuto mettere 1967…perchè?

#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal_SR.h>
#include <I2CIO.h>
#include <LiquidCrystal_SI2C.h>
#include <LiquidCrystal_I2C_ByVac.h>
#include <FastIO.h>
#include <SI2CIO.h>
#include <LiquidCrystal_SR2W.h>
#include <LiquidCrystal_SR3W.h>
#include <LiquidCrystal.h>
#include <LCD.h>
#include <LiquidCrystal_SR1W.h>
#include <Wire.h>

const int DS1307 = 0x68; // Address of DS1307 see data sheets
const char* days[] =
{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
const char* months[] =
{"January", "February", "March", "April", "May", "June", "July", "August","September", "October", "November", "December"};
char buffer[10];


int TimeUp;//pulsante incremento ore 
int TimeDn;// pulsante decremento ore
int TimeRegBut;
int Set;
int SetCount = 0;
int _minute = 0;
int _hour = 0;
int _weekday = 1;
int _monthday = 0;
int _month = 0;
int _year = 1967;

#define TimeUp 10
#define TimeDn 11
#define TimeRegBut 12
#define Set 13

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address


// Initializes all values:
byte second = 0;
byte minute = 0;
byte hour = 0;
byte weekday = 0;
byte monthday = 0;
byte month = 0;
byte year = 0;

void setup() {
  Wire.begin();
  Serial.begin(9600);
 lcd.begin(16,2);
  lcd.backlight();
  lcd.setCursor(4,0);
  lcd.print("TestRTC!");
   delay(2000); // This delay allows the MCU to read the current date and time.

}

// Continuous function for converting bytes to decimals and vice versa
void loop() {
  
lcd.clear();
 Serial.println(SetCount);
 Wire.beginTransmission(DS1307);
  Wire.write(byte(0));
  Wire.endTransmission();
  Wire.requestFrom(DS1307, 7);
  second = bcdToDec(Wire.read());
  minute = bcdToDec(Wire.read());
  hour = bcdToDec(Wire.read());
  weekday = bcdToDec(Wire.read());
  monthday = bcdToDec(Wire.read());
  month = bcdToDec(Wire.read());
  year = bcdToDec(Wire.read());
  char buffer[3];
  const char* AMPM = 0;
  Serial.print(days[weekday-1]);
  Serial.print(" ");
  Serial.print(months[month-1]);
  Serial.print(" ");
  Serial.print(monthday);
  Serial.print(", 20");
  Serial.print(year);
  Serial.print(" ");
  if (hour > 12) {
    hour -= 12;
    AMPM = " PM";
  }
  else AMPM = " AM";
  Serial.print(hour);
  Serial.print(":");
  sprintf(buffer, "%02d", minute);
  Serial.print(buffer);
  Serial.println(AMPM);

 
 
 if (digitalRead(Set)== HIGH) { 
    delay(15);
    SetCount=SetCount +1;
    if ( SetCount > 2) { SetCount = 0;} 

    switch (SetCount) {
      case 1:
  Serial.print("Please enter the current year, 00-99. - ");
  year = _year;
  Serial.println(year);
  Serial.print("Please enter the current month, 1-12. - ");
  month = _month;
  Serial.println(months[month-1]);
  Serial.print("Please enter the current day of the month, 1-31. - ");
  monthday = _monthday;
  Serial.println(monthday);
  Serial.println("Please enter the current day of the week, 1-7.");
  Serial.print("1 Sun | 2 Mon | 3 Tues | 4 Weds | 5 Thu | 6 Fri | 7 Sat - ");
  weekday = _weekday;
  Serial.println(days[weekday-1]);
  Serial.print("Please enter the current hour in 24hr format, 0-23. - ");
  hour = _hour;
  Serial.println(hour);
  Serial.print("Please enter the current minute, 0-59. - ");
  minute = _minute;
  Serial.println(minute);
  second = 30;
  Serial.println("The data has been entered.");

  // The following codes transmits the data to the RTC
  Wire.beginTransmission(DS1307);
  Wire.write(byte(0));
  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(weekday));
  Wire.write(decToBcd(monthday));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.write(byte(0));
  Wire.endTransmission();
  // Ends transmission of data
  break;
  case 2:
  Serial.println ( "TimeRead" );
  Wire.beginTransmission(DS1307);
  Wire.write(byte(0));
  Wire.endTransmission();
  Wire.requestFrom(DS1307, 7);
  second = bcdToDec(Wire.read());
  minute = bcdToDec(Wire.read());
  hour = bcdToDec(Wire.read());
  weekday = bcdToDec(Wire.read());
  monthday = bcdToDec(Wire.read());
  month = bcdToDec(Wire.read());
  year = bcdToDec(Wire.read());

   char buffer[3];
  const char* AMPM = 0;
  Serial.print(days[weekday-1]);
  Serial.print(" ");
  Serial.print(months[month-1]);
  Serial.print(" ");
  Serial.print(monthday);
  Serial.print(", 20");
  Serial.print(year);
  Serial.print(" ");
  if (hour > 12) {
    hour -= 12;
    AMPM = " PM";
  }
  else AMPM = " AM";
  Serial.print(hour);
  Serial.print(":");
  sprintf(buffer, "%02d", minute);
  Serial.print(buffer);
  Serial.println(AMPM);

lcd.clear();
 
    sprintf(buffer,  "%02d", monthday, month);
    lcd.setCursor(5,0);
    lcd.print( buffer );
 
    //char buffer[10] = "";
 
    sprintf(buffer,  "%02d:%02d", hour, minute);
    lcd.setCursor(0,1);
    lcd.print( buffer );
    delay (1000);
  
  break;
}
    
    }
   delay (1000);  
  
}
byte decToBcd(byte val) {
  return ((val/10*16) + (val%10));
}
byte bcdToDec(byte val) {
  return ((val/16*10) + (val%16));
}


// This set of codes is allows input of data
//void setTime() 


byte readByte() {
  while (!Serial.available()) delay(10);
  byte reading = 0;
  byte incomingByte = Serial.read();
  while (incomingByte != '\n') {
    if (incomingByte >= '0' && incomingByte <= '9')
      reading = reading * 10 + (incomingByte - '0');
    else;
    incomingByte = Serial.read();
  }
  Serial.flush();
  return reading;
}

Grazie
Jacopo

Ciao Jacopo lo sketch che hai usato è del 2013, se utilizzi una libreria più recente ti semplifica la vita ed il codice risulta più leggibile. Dovresti partire con un programma semplice,anche solo mostrare data ed ora è successivamente implementare nuove funzionalità. In questo modo ogni Step che fai, ti dà una esperienza fondamentale.
Per il problema dell'anno dovresti verificare come viene salvato sul DS (un serial.print) e li dovresti capire. Purtroppo se cambi sketch ci tocca rileggere il codice e porta via un sacco di tempo

Stefano

Qui

c’è un esempio di allarme con RTC DS1307 e pulsanti.
E’ un po’ differente da ciò che vuoi fare tu perché utilizza dei pulsanti su un unica linea. Ogni pulsante chiude una resistenza di differente valore per cui la lettura è analogica e non digitale.
Inoltre curiosamente lo sketch prevede la modifica dell’orario dell’allarme ma non dell’orario dell’RTC.
Dovrebbe utilizzare 3 o 4 pulsanti al massimo su tutti quelli presenti.