DS3231 non memorizza orario?

Buongiorno a tutti,
ho un problema con l'orario impostato su un rtc Ds3231.
Se va via l'alimentazione elettrica non tiene in memoria l'orario; ho cambiato diverse batterie, tutte nuove ma non va.
sotto trovate il codice; se va via l'alimentazione riparte dall'ultimo orario che avevo impostato a mano (18:52). ho fatto diverse prove ma niente da fare.
devo implementare il codice con delle istruzioni particolari per memorizzare l'orario?
L'orario mi serve per far scattare un relè a determinato orario. se salta la luce e poi ritorna vorrei che ripartisse mantenendo l'orario.

#include <DS3231.h>
#include <Time.h>
#include <TimeLib.h>
DS3231  rtc(SDA, SCL);

// Init a Time-data structure
Time  ti;
const int OraAccensione = 8;     //Accensione luci alle 8:00:00
const int OraSpegnimento = 19 ;    // Spegnimento luci alle 19:59:59

void setup() {{
  
  rtc.begin();
  //rtc.setDOW(THURSDAY);     
  rtc.setTime(18,52,00);     
  //rtc.setDate(1,19,19); 
  //rtc.getTime;
  lcd.begin(16,2);
  lcd.backlight();

void loop() {{
  
  lcd.setCursor(0, 0);
lcd.print(rtc.getTimeStr()); 
    //Get time data from RTC and store in t
ti = rtc.getTime();


//Bar 1
 if (ti.hour >= OraAccensione && ti.hour < OraSpegnimento)
 {
    digitalWrite(relay_luci, HIGH);
     }
  
   else if (ti.hour >= OraSpegnimento || ti.hour < OraAccensione){
    digitalWrite(relay_luci, LOW);
  }

Eh, se il codice è quello, se nel setup imposti l'orario sempre alle 18:52, per lui ogni volta che lo accendi sono le 18:52... :slight_smile:

Io ho sempre usato la RTClib però non la DS3231, per la quale nel setup una prima volta a mano imposto l'orario corretto con rtc.adjust():

rtc.adjust(DateTime(2019, 1, 21, 15, 24, 0));

Da quel momento devo lasciar fare all'RTC, ossia leggere solamente l'orario e non più settarla quindi commentando quella riga.

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
  //rtc.adjust(DateTime(2019, 1, 21, 15, 24, 0));

Questo significa che una volta che avrai impostato per la PRIMA (ed unica) volta l'RTC con l'ora giusta non devi far altro. Chiaramente se ti si dovesse scaricare la batteria tampone dovrai rifare questa operazione.

Vedi anche una operazione "manuale" di impostazione QUI con 3 pulsanti ed un display LCD.

quindi dovrei settare l'ora la prima volta; caricarla su arduino e poi commentare con le // il comando e ricaricarla su arduino?
ho capito male? :slight_smile:

grazie mille

Esatto.

Se vai via l'alimentazione, il RTC tiene l'ora, ma in Arduino viene rieseguito il setup()

Grazie, stasera ho provato come suggerito. Caricato codice, poi commentato la parte di codice, ricaricato, tolto alimentazione e riacceso. Purtroppo riparte dall'orario del primo settaggio, sto sbagliando qualcosa ma non capisco cosa

Mah posta il codice che stai usando ed evidenziaci quale riga prima lasci attiva e poi commenti dopo la prima accensione.

Hai ragione, perdonami.
sotto riporto il codice che carico con l'orario impostato.
quello che carico successivamente commentato è questo:
rtc.setTime(20,29,00);
rtc.setDate(1,22,19);

#include <DS3231.h>
#include <Wire.h>
#include <Time.h>
#include <TimeLib.h>
DS3231  rtc(SDA, SCL);

// Init a Time-data structure
Time  ti;
int relay_luci = 3; // PIN DEL RELè LUCE
const int OraAccensione = 8;     //Accensione luci alle 8:00:00
const int OraSpegnimento = 19 ;    // Spegnimento luci alle 19:59:59

void setup() 
{
  rtc.begin();
  //rtc.setDOW(THURSDAY);     
  rtc.setTime(20,29,00);     
  rtc.setDate(1,22,19);
  //rtc.getTime;
  lcd.begin(16,2);
  lcd.backlight();

  
  pinMode(relay_luci, OUTPUT);
  digitalWrite(relay_luci,LOW);
}


void loop() 
{
{
  
  lcd.setCursor(0, 0);
  lcd.print(rtc.getTimeStr()); 
  ........
  .......

  //Get time data from RTC and store in t
  ti = rtc.getTime();


  if (ti.hour >= OraAccensione && ti.hour < OraSpegnimento)
{
    digitalWrite(relay_luci, HIGH);
}
  
else if (ti.hour >= OraSpegnimento || ti.hour < OraAccensione){
digitalWrite(relay_luci, LOW);
}

Come dico sempre, affrontare i problemi ISOLANDOLI uno per volta, sperimentando in un piccolo programma di prova ciò che non ci torna.

Quindi se tu carichi questo codice e lo esegui, l'rtc ti funziona o no?

#include <DS3231.h>

DS3231  rtc(SDA, SCL);

void setup() { 
 rtc.begin(); // Initialize the rtc object
 Serial.begin(9600);
  // Da commentare dopo la prima esecuzione!
  rtc.setDOW(WEDNESDAY);
  rtc.setTime(10, 0, 0);
  rtc.setDate(24, 1, 2019);
}
void loop() { 
 Serial.print("Time:  ");
 Serial.print(rtc.getTimeStr());
 Serial.print(" "); 
 Serial.print("Date: ");
 Serial.println(rtc.getDateStr());
 delay(1000); 
}

grazie, è quello che sto facendo, isolare i singoli problemi che incontro lungo il percorso del mio codice che cerco di aggiornare passo dopo passo.
ora funziona, grazie mille.
vorrei capire se ho compreso il mio errore, nel mio codice mancava questo pezzo di codice

Serial.print(" ");

è per quel motivo che non memorizzava l'orario? sbaglio o non vedo altre differenze?

aquilacieca:
è per quel motivo che non memorizzava l'orario? sbaglio o non vedo altre differenze?

Direi di no. Non conosco la setDate() ma se il codice di @docdoc funge e il tuo no, direi che i dati da passare sono giorno, mese, anno e non mese, giorno, anno come facevi tu

nid69ita:
Direi di no. Non conosco la setDate() ma se il codice di @docdoc funge e il tuo no, direi che i dati da passare sono giorno, mese, anno e non mese, giorno, anno come facevi tu

Ok chiaro, grazie mille