RTC

Caro Leo,

ho appena "litigato" con un schedino RTC con DS1307.

Prima 8.5 secondi in avanti dopo 24h, dopo aver inserito due condensatori da 22pf in parallelo a quelli già esistenti, solo 1 sec in 24 h

Naturalmente ogni circuito andrebbe tarato singolarmente.

E' vero quello che dici, ma dimentichi che i condensatori esistenti all'interno dell'IC sono stati progettati per un quarzo ideale.

Ti allego le note applicative che spiegano bene la cosa.

DS1307_xtal.pdf (130 KB)

Interessante senza dubbio!
Ma viste le conoscenze e abilità per me è senza ombra di dubbio più agevole lavorare via software..
Rimango dell'idea di usare il tastino che poi mi permette comunque di fare altre cose.

Stasera arriva il secondo arduino, mi arrischierò a provare lo schema che ho postato ieri (fermatemi!) spero di non uccidere anche lui.

Ciao e grazie

@cyberhs

Grazie per il documento!

Ne aggiungo un altro
"Improved timekeeping accuracy with PCF8563 using external temperature sensor"
http://www.nxp.com/documents/application_note/AN10652.pdf

Anche se parla di un altro chip penso che le tecniche adottate possano essere implementate anche con altri chip.

Intanto grazie ad entrambi per i documenti. Li guarderò con attenzione.

Personalmente quando mi serve un RTC esterno (e non posso usare il modulo Real-Time Counter dell'Atmega328) utilizzo sempre il PCF8563, che preferisco al DS1307. In questi giorni sto però lavorando ad una cosa che prevede un DS1307 e noto che questo chip fà spesso le bizze, alle volte non riesco ad inizializzarlo all'avvio. Siccome non uso i C esterni, adesso provo mettendoceli.

Anche io ho preso dei PCF8563, mi interessa la caratteristica dell'allarme, così mando l'Arduino a dormire e lo faccio svegliare dal PCF8563. Però deve ancora arrivare.

Io ho risolto con un modulo DCF77, che riceve un segnale orario da Monaco di Baviera e mi corregge lo stesso RTC che hai tu. L'orologio da cui proviene il segnale è un Clock Atomico, con precisione del secondo ogni 100.000 anni. Immagino poss anadarti bene come precisione...

Lo trovi a 9e su Ebay.

Si, conosco da tempo il DCF77, ma nell'applicazione che ho in mente ci sarà, almeno una volta al giorno, una comunicazione con un PC o via modem o via rete per cui ne approfitterò per sincronizzare l'orologio con il PC o con un servizio NTP.

L'opzione del DCF77, per me, è alternativa anche al classico GPS in quanto il DCF77 lo puoi ricevere anche al chiuso o comunque con il cielo ingombro.

Rieccomi!! Vi sono mancato? :slight_smile:
Ritorno al tema originale del post.. l' RTC....
Ho finito, il progetto:
con due bottoni gestisco un menu sull'lcd, che mi permette di

  • modificare l'ora
  • modificare l'orario di avvio della pompa per l'irrigazione
  • fare un avvio veloce dell'irrigazione

Il problema è ancora sull'orario.
Ho fatto fatica a capire come impostare l'orario dell'RTC, (come vorrei fare dal menu) sembra che nella libreria RTClib, non esista un comando che esegua questa funzione, e bisognerebbe pertanto scrivere linee di codice per commutare numeri decimali in BCD (non ho capito come si fa) e in qualche modo inviarli all'rtc.. Ma forse ho capito male...

Sembra invece che la libreria time() utilizzata assieme ad rtclib, mi permetta di commutare un'orario nella codifica linux e poi impostarlo con rtc.now()=datetime(xx,yy,zz,kk,jj,..)

Ma qui viene il bello..
Di fatto sembra che l'RTC si blocchi quando stacco la corrente... o meglio ancora, quando riattacco la corrente lei prende il valore di orario dato durante la compilazione dello sketch.. oppure, in base all'uso o meno di rtc.now(date, time), parte da zero..

Altra cosa strana.. Se apro il monitor seriale, l'lcd si spegne per un paio di secondi, e quando si riaccende l'orario che mi mostra è sincronizzato al computer..

Rtc rotto?Altre idee?
Grazie
manu

maniiu:
Di fatto sembra che l'RTC si blocchi quando stacco la corrente... o meglio ancora, quando riattacco la corrente lei prende il valore di orario dato durante la compilazione dello sketch.. oppure, in base all'uso o meno di rtc.now(date, time), parte da zero..

Beh dipende da come hai fatto il programma. Quando Arduino riparte, riesegue anche il codice che hai nella setup()
Dovresti postare lo sketch per poter controllare, almeno la setup().

maniiu:
Il problema è ancora sull'orario.
Ho fatto fatica a capire come impostare l'orario dell'RTC, (come vorrei fare dal menu) sembra che nella libreria RTClib, non esista un comando che esegua questa funzione, e bisognerebbe pertanto scrivere linee di codice per commutare numeri decimali in BCD (non ho capito come si fa) e in qualche modo inviarli all'rtc.. Ma forse ho capito male...

Se parliamo della RTClib di Adafruit, ha la funzione RTC.adjust() che serve per impostare l'orario. Per passarglielo in formato "commestibile", devi usare la funzione DateTime che trasforma l'orario e la data in un formato accettabile.

RTC.adjust(DateTime(anno, mese, giorno, ore, minuti, secondi));

Hai guardato gli esempi?

Di fatto sembra che l'RTC si blocchi quando stacco la corrente... o meglio ancora, quando riattacco la corrente lei prende il valore di orario dato durante la compilazione dello sketch.. oppure, in base all'uso o meno di rtc.now(date, time), parte da zero..

Ti ha già risposto nid69.

Altra cosa strana.. Se apro il monitor seriale, l'lcd si spegne per un paio di secondi, e quando si riaccende l'orario che mi mostra è sincronizzato al computer..

E' normale, visto che l'apertura del monitor seriale dell'IDE resetta l'Arduino.

Grazie Ragazzi!
Le cose mi si stanno schiarendo...
Se il set con la data e l'ora è nel setup senza controlli, allora l'lcd ripropone l'orario dato in compilazione
se nel setup metto i controlli l'orario parte da 0

Succede che, se non lascio il set all'avvio, mi ritrovo con la scritta RTC not working.. Se invece la lascio, l'orologio va avanti..

Ho costruito uno sketch che mi propone sulla prima riga l'orario time e sulla seconda l'orario dell'RTC. Sono sincronizzati.
Una cosa così:

manu=datetime(hr,min,sec,day,month,yr); //hr,min,sec,.... li ricevo dall'interfaccia lcd
rtc.adjust(manu);
setSyncProvider(RTC.get) // sincronizzo

Dovrebbe andare!

Stasera provo meglio.. nel frattempo ho ordinato un'altra RTC..

Non leggi gli esempi ma neanche i suggerimenti :sweat_smile:
Non importa assegnare la conversione ad un oggetto "manu" temporaneo e poi passare quest'oggetto ad adjust, basta che fai come ti ho mostrato, passando ad rtc.adjust il risultato diretto della conversione.
Inoltre se guardi negli esempi c'è un semplice controllo da fare per verificare se l'RTC sta andando oppure no, nel caso non stia andando (ossia sia senza batteria tampone) allora imposti l'orario, altrimenti lo leggi.

nooo..li leggo.. =( =( =( =( =(
E prima di chiedere cerco soluzioni in rete...

Provo a speigarmi meglio:

So che c'è un controllo e uso proprio quello dell'esempio.. Però lui se ne frega..

  • Se non metto il controllo, mi parte dall'ultimo orario
  • Se metto il controllo, mi parte da 00 (quindi lui passa il controllo, ma di fatto sembra che l'ora si resetti, o non venga memorizzata)

La batteria (3.6V) è collegata ed è carica, l'ho anche provata a cambiare, stesso risultato.

Sketch e circuito sarebbero d'aiuto.
Ah, se stai usando un DS1307, la batteria tampone dev'essere da 3V. 3V6 sono il limite massimo, se non ricordo male.

la batteria è quella che mi hanno dato con la scheda..
Ho provato lo sketch di esempio

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib

#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal.h> 
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

RTC_DS1307 RTC;

void setup () {
  lcd.begin(16, 2);
    Serial.begin(57600);
    Wire.begin();
    RTC.begin();
pinMode(2, OUTPUT);
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}

void loop () {
  lcd.setCursor(0, 1);
    DateTime now = RTC.now();
    digitalWrite(2, HIGH);
   // lcd.print(now.year(), DEC);
    //Serial.print('/');
    //Serial.print(now.month(), DEC);
   // Serial.print('/');
   // Serial.print(now.day(), DEC);
   // Serial.print(' ');
    lcd.print(now.hour(), DEC);
    lcd.print(':');
    lcd.print(now.minute(), DEC);
    lcd.print(':');
    lcd.print(now.second(), DEC);
   // Serial.println();
   
}

Non funziona.. quando stacco la corrente e la riattacco, mi riparte sempre dal h,m,sec in cui il programma è stato compilato..
Qualche idea?
PS il pin2 mi da la retroilluminazione del display

Ma quando apri il terminale del IDE Ti scrive "RTC is NOT running!" ?

Potresti provare anche di commentare o cancellare le seguenti righe:

if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }

Ciao Uwe

uhmm...no

Le connessioni le ho verificate e sono giuste.. semplicemente l rtc freeza e rimane alla stessa ora...
provo a cambiare ancora batteria come ultimo tentativo, metto una da 3V.. niente comportamento invariato..
Cosa dite RTC rotta?

Hai tolto quel pezzo di codice dallo Sketch?
Ciao Uwe

Uwe te l'ha scritto già due volte e te lo ripeto io

// following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));

Questa istruzione mette nel DS1307 la data di compilazione e siccome sta nel setup verrà eseguita ogni volta che riaccendi la scheda.
Quindi va bene solamente alla prima compilazione cui segue immediatamente il caricamento sulla scheda.
Poi va tolta perché diventa obsoleta un minuto dopo.
Oppure aggiungi del codice che serve a regolare l'orologio da tastiera, da seriale da ntp o quello che vuoi.

Scusate ragazzi,
Non prendetemi per stupido.. Ce la sto mettendo tutta e vi ringrazio molto per l'aiuto.
Quindi mi state dicendo di compilare lo sketch (tasto verifica, tasto carica), e poi ri-commentare la riga RTC.adjust e caricare (tasto carica) il programma in arduino?

Ma nell'if dovrebbe entrare solo se "RTC is not running"..
Quindi se l'RTC non funzionasse la resetterebbe all'orario di compilazione.

Ma il monitor seriale non mi dice "RTC IS NOT RUNNING", quindi sembra funzionare.
Se non funzionasse poi perchè l'ora andrebbe avanti regolarmente..
Mi sfugge qualcosa? (non ditemi che l'avete già scritto :()