RTC e azioni programmate

Salve a tutti,

avrei la necessità di far eseguire ad arduino dei comandi ad un determinato orario, per questo l'ho dotato di RTC. Il mio intento sarebbe quello di far comportare arduino come un timer impostando degli intervalli di tempo o delle ore specifiche.

Es.
-ogni 15min pin 10 HIGH per 5min
-alle ore 20:35 pin 10 HIGH fino alle 22:35
-......

non riesco a farmi uno scenario,mentalmente, di come poter gestire queste informazioni per arrivare allo scopo....avevo pensato ad un if per l'esempio delle 20:35, ma non posso applicarlo anche per il primo esempio. La funzione millis() non la posso usare perche volevo evitare che un reset del dispositivo facesse ripartire da capo il contatore.

.....mi date una mano.....la soluzione credo si semplicissima, ma giuro al momento non riesco a farmi venire in mente niente :smiley:

GRAZIE

Bhe intanto hai una eeprom se non vuoi impegnare troppo la ram,
ti crei delle celle dove ci sono scritte le informazioni che ti servono, n° del pin, HH, MM, On,Off, ripetizione ogni x, Lu,Ma,Me,Gio,Ven... con un solo byte, ce ne stanno veramente tante, se poi applichi una logica al raccoglimento dei dati il programma è più semplice di quanto credi
Cos'è un acquario anche il tuo?

quindi mi sembra di capire che cmq devo fargli fare cicli di verifica dei dati della eeprom e se se si verifica eseguire..... ma al di là di occupare memoria è piu o meno uguale che controllare i dati provenienti dall RTC con rtc.getTimeStr()

o forse sto solo guardando nella direzione sbagliata......mi sembra un po macchinoso

ma non esiste niente tipo demone 'atd' di linux ??

se usi il ds1307 come rtc esterno lui manda i daty in byte al micro. il secondo byte sono i minuti e se fai un confronto di quando il byte e' 0x0f ( 00001111 in binario ) significa che sono le ore x e 15 minuti e alzi il pin che vuoi. se vuoi che dopo 5 minuti il pin deve abbassarsi aggiungi un secondo controllo se il byte dei minuti nel frattempo e' diventato 00010100 ( 0x14 in esadecimale ).

se poi vuoi che questo accade ogni 15 minuti fai il confronto anche per quando sono le ore x e 30/45 e 00 minuti.

pero' a questo punto io ci vedo meglio un 555 in astabile che ti costa meno di un micro :slight_smile:

@andrea:
scusa ma esistono librerie che trasformano i dati in qualcosa di "umano" come ad esempio ore e minuti :wink:

@tronicman:
se vuoi schedulare piccoli lavori in background perché non dai un'occhiata alla mia libreria leOS/leOS2? Serve proprio a questo.
Puoi mettere un task che, ogni tot esegua un compito in automatico.

esiste anche la libreria Timealarms "amica" della libreria Time :wink:
https://code.google.com/p/arduino-time/source/browse/#svn%2Ftrunk%2FTimeAlarms

se usi il ds1307 come rtc esterno lui manda i daty in byte al micro. il secondo byte sono i minuti e se fai un confronto di quando il byte e' 0x0f ( 00001111 in binario ) significa che sono le ore x e 15 minuti e alzi il pin che vuoi. se vuoi che dopo 5 minuti il pin deve abbassarsi aggiungi un secondo controllo se il byte dei minuti nel frattempo e' diventato 00010100 ( 0x14 in esadecimale ).

Non è proprio così....il ds1307 usa un byte si ma diviso in due gruppi da 4 bit.....all'interno dei 4 bit meno significativi (bit 0->3)memorizza le unità e nei restanti 4 bit più significativi (bit 4->7) memorizza le decine,quindi nel caso dei 15 minuti il valore del byte in esadecimale sara di 0x15 che corrisponde in binario a b0001 0101.

BrainBooster:
esiste anche la libreria Timealarms "amica" della libreria Time :wink:
Google Code Archive - Long-term storage for Google Code Project Hosting.

Tu quoque, BrainBooster, fili mi!
:stuck_out_tongue_closed_eyes:
Anche tu, BrainBooster, figlio mio, mi tradisci suggerendo le lib degli angli? XD

:cold_sweat: sorry, mi è venuto automatico vedendo che usava un rtc HW XD

tonid:

se usi il ds1307 come rtc esterno lui manda i daty in byte al micro. il secondo byte sono i minuti e se fai un confronto di quando il byte e' 0x0f ( 00001111 in binario ) significa che sono le ore x e 15 minuti e alzi il pin che vuoi. se vuoi che dopo 5 minuti il pin deve abbassarsi aggiungi un secondo controllo se il byte dei minuti nel frattempo e' diventato 00010100 ( 0x14 in esadecimale ).

Non è proprio così....il ds1307 usa un byte si ma diviso in due gruppi da 4 bit.....all'interno dei 4 bit meno significativi (bit 0->3)memorizza le unità e nei restanti 4 bit più significativi (bit 4->7) memorizza le decine,quindi nel caso dei 15 minuti il valore del byte in esadecimale sara di 0x15 che corrisponde in binario a b0001 0101.

e già, me ne sono dimenticato :blush:

tonid:
Non è proprio così....il ds1307 usa un byte si ma diviso in due gruppi da 4 bit.....all'interno dei 4 bit meno significativi (bit 0->3)memorizza le unità e nei restanti 4 bit più significativi (bit 4->7) memorizza le decine,quindi nel caso dei 15 minuti il valore del byte in esadecimale sara di 0x15 che corrisponde in binario a b0001 0101.

Codifica BCD