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