Problema con RTC

sto uscendo pazzo … il problema sarà sicuramente una sciocchezza ma non riesco a trovarlo …

In allegato trovate il codice di un semplice programma che deve scrivere l’ora attuale ogni 5 secondi e nell’attesa comunicare che è in attesa della nuova ora …

tutto funziona fino a quando non scatta il minuto successivo da li in poi entra perennemente nel ciclo else …

so che è una cazzotta ma nn riesco a trovarla… sicuramente e nella formattazione dei secondi che essendo decimali non cozzano con i minuti

HELP ME !!!

 #include <Wire.h>
  #include <RTClib.h>
  
  RTC_DS1307 RTC;
  
  DateTime attuale;
  DateTime futura;
  
  void setup() 
  {
    Serial.begin(57600);
    Wire.begin();
    RTC.begin();
    
    attuale = RTC.now();
    
    Serial.println();
    Serial.print("Sono le ore: ");
    Serial.print(attuale.hour(), DEC);
    Serial.print(":");
    Serial.print(attuale.minute(), DEC);
    Serial.print(":");
    Serial.print(attuale.second(), DEC);
    Serial.println();
    Serial.println();
    
    futura = (attuale.unixtime() + 5);
  
    
  
  
  }
  
  void loop()
  
  {
    if ( (attuale.second() )  <= (futura.second()) ){
    Serial.print("in attesa della nuova ora");
    Serial.println();
    Serial.print("ATTUALE: ");
    Serial.print(attuale.second());
    Serial.println();
    Serial.print("FUTURA: ");
    Serial.print(futura.second());
    Serial.println();
    Serial.println();
    attuale = RTC.now();
    }
    else {
      Serial.print("Lanuova ora e': ");
    Serial.print(attuale.hour(), DEC);
    Serial.print(":");
    Serial.print(attuale.minute(), DEC);
    Serial.print(":");
    Serial.print(attuale.second(), DEC);
    Serial.println();
    Serial.println();
    futura = (attuale.unixtime() + 5);
      
    }
  
  delay(1000);
  
  }

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

SCUSATE SE NON MI SONO PRESENTATO ...
ma ho dato per scontato che l'avevo già fatto tempo fa quando usai per la prima volta questo forum ... a causa di vari problemi di salute sono stato fuori dal mondo per un po :slight_smile:
ora eccomi sono cenzino e di elettronica ne so davvero poco ma sto usando quel poco che so e quel poco di tempo che ho per costruirmi un sistema automatizzato per produrre birra ... cosa già fatta da altri ma voglio farmelo da me e dare un tocco di personalità ....

Salute

ora però nid69ita aiutami :slight_smile:

Beh, tu basi tutta la tua logica solo su second() e quindi ti perdi i minuti e le ore.

Perciò hai 3 possibilità, secondo me:

  1. usi il comando unixtime() della libreria per il confronto tra DateTime, in quanto ritorna una cifra 32 bit unica con valore del tempo (un pò quello che suggerisco a punto 3):
if ( (attuale.unixtime() )  <= (futura.unixtime()) ){
  1. usi una semplice millis() per sapere quando son passati 5 secondi (inutile per me la DateTime)
  2. converti i Time in numero long per un semplice confronto, secondo questo calcolo:
long  a=attuale.hour()*10000L+attuale.minute()*100+attuale.second();
long  f=futura.hour() *10000L+futura.minute() *100+futura.second();
if( a<=f )

attuale 23:10:58 => 231058 come numero long
futura 23:11:03 =>231103 che come numero long è facilmente confrontabile con numero precedente
Ma c’e’ comunque lo scavalco del giorno che dà problemi 23:59:59=> 00:00:04