Go Down

Topic: DS3231 non memorizza orario? (Read 233 times) previous topic - next topic

aquilacieca

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.


Code: [Select]

#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);
  }


docdoc

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...  :)

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.

Code: [Select]
  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.
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

aquilacieca

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? :)

grazie mille

nid69ita

#3
Jan 21, 2019, 04:04 pm Last Edit: Jan 21, 2019, 04:05 pm by nid69ita
Esatto.

Se vai via l'alimentazione, il RTC tiene l'ora, ma in Arduino viene rieseguito il setup()
my name is IGOR, not AIGOR

aquilacieca

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

docdoc

Mah posta il codice che stai usando ed evidenziaci quale riga prima lasci attiva e poi commenti dopo la prima accensione.
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

aquilacieca

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);


Code: [Select]

#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);
}

 



docdoc

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?

Code: [Select]
#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);
}
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

aquilacieca

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

Code: [Select]

Serial.print(" ");


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

nid69ita

#9
Jan 24, 2019, 08:59 pm Last Edit: Jan 24, 2019, 09:00 pm by nid69ita
è 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
my name is IGOR, not AIGOR

aquilacieca

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

Go Up