Automazione giornaliera differente ogni 24h

Buongiorno a tutta la community.
Dopo un lungo intervallo vorrei rispolverare le mie (scarse) conoscenze di Arduino. Con un amico vorremmo imbastire un piccolo progetto casalingo. Ho però un dilemma da porvi.
Avrei la necessità di creare due automatismi giornalieri ad un orario determinato precedentemente. Questi eventi accadono ogni giorno ad orari diversi, secondo un calendario prestabilito, ma non "calcolabile". Nessun legame matematico tra gli eventi del giovedì e quelli del venerdì per intenderci.
Purtroppo gli orari di questo calendario non hanno nessun legame tra loro e a distanza di 24h si ripetono in un modo totalmente differente e slegato (quindi non calcolabile) rispetto alle 24h precendenti.
L'evento in sè però è piuttosto banale: eccitare un relè.
Avrei pensato di delegare la funzione di "conteggio" del tempo ad un modulo RTC DS1307 e di inserire ben 750 eventi differenti e univoci, descritti con data e ora (2 eventi al giorno per 365 giorni) nel codice di Arduino che quindi ecciterà il relè al verificarsi di uno dei 750 test in codice.
Come stesura del codice però mi sembra abbastanza dozzinale, ma ripeto: non esiste un modo per calcolare il tempo a cui gli eventi delle 24h ore sucessive deveno accadere.

Vi va di darmi un parere? Esiste una soluzione alternativa a cui non ho pensato?
Arduino sarebbe in grado confrontare ad ogni ciclo 750 eventi (data/ora) con il dato che arriva dal RTC (data/ora) senza dare problemi nel lungo periodo?

Grazie mille per l'attenzione
Pier

Con un UNO sei a rischio memoria.
Che risoluzione temporale?
Preciso al minuto è ok?
Esistono dei limiti?
Mi spiego: due eventi al giorno implica che tra una accensione e la successiva non passano mai più di 48 ore, esistono limiti più stringenti?

Comunque, a te non serve fare 750 test tutte le volte
Ti basta fare il 'prossimo' test
Tutti quelli già avvenuti non serve ripeterli
Tutti quelli 'dopo' sono appunto dopo...

Se gli eventi (giorno/ora) sono FISSI e non li devi modificare ... il problema della memoria potrebbe non esserci mettendoli, appunto fissi, in PROGMEM.

Guglielmo

Standardoil:
Con un UNO sei a rischio memoria.
Che risoluzione temporale?
Preciso al minuto è ok?
Esistono dei limiti?
Mi spiego: due eventi al giorno implica che tra una accensione e la successiva non passano mai più di 48 ore, esistono limiti più stringenti?

Preciso al minuto va bene. Gli eventi consistono in eccitare un relè quindi il primo evento della giornata accende, mentre il secondo evento della giornata spegne. L'intervallo che intercorre tra il primo evento della giornata e il primo evento della giornata sucessiva è variabile, a volte 24h, a volte 24h e 10 minuti, altre 23 h e 58 min... ecc. ecc. Ora studio bene il calendario perchè vorrei (magari barando un pò sugli orari...) trovare una "regola" di qualche sorta.

Comunque, a te non serve fare 750 test tutte le volte
Ti basta fare il 'prossimo' test
Tutti quelli già avvenuti non serve ripeterli
Tutti quelli 'dopo' sono appunto dopo...

Esatto, giusta osservazione.. Questo cosa comporta?

Se gli eventi (giorno/ora) sono FISSI e non li devi modificare ... il problema della memoria potrebbe non esserci mettendoli, appunto fissi, in PROGMEM.

A questo punto si, non trovando un nesso tra i dati direi che ogni evento (750 eventi:() è fisso e predeterminato, però non ho ben capito cosa mi suggerisci.

_pier:
… però non ho ben capito cosa mi suggerisci.

Di mettere i valori in un array e posizionare tale array nella memoria programma (PROGMEM), risparmiando preziosa memoria SRAM.

Studia l’allegato :wink:

Guglielmo

Progmem.pdf (182 KB)

gpb01:
Di mettere i valori in un array e posizionare tale array nella memoria programma (PROGMEM), risparmiando preziosa memoria SRAM.

Studia l'allegato :wink:

Guglielmo

Grazie mille! Ok, credo di aver capito. Ora mi studio bene il materiale. Nel frattempo provo anche a vedere se veramente non c'è modo di dare una "logica" agli orari degli eventi.
Grazie ancora, vi terrò aggiornati.

Non è che stai cercando albe e tramonti, vero?
Comunque, se partiamo dal presupposto di avere due eventi nella giornata, ad orari casuali, ti bastano due array, di 2 byte l'uno
Il primo per l'accensione, il secondo per lo spegnimento, oppure un solo array di 4, sempre 1500 byte sono
La data ti calcola l'indice degli array
Essendo sicuri, per esempio, che lo spegnimento è sempre nella giornata riduce un po' l'incertezza. Ma non abbastanza da risparmiare un byte.
Spiega bene, che per caso particolari si può ridurre, ad esempio la distanza tra un Alba e la successiva varia poco di giorno in giorno. Stesso per il tramonto.
Un solo byte può codificare la differenza per tutti e due gli eventi.
Con 365 byte te la caveresti
Come vedi conoscere la casistica aiuta un botto

Standardoil:
Non è che stai cercando albe e tramonti, vero?
Comunque, se partiamo dal presupposto di avere due eventi nella giornata, ad orari casuali, ti bastano due array, di 2 byte l’uno
Il primo per l’accensione, il secondo per lo spegnimento, oppure un solo array di 4, sempre 1500 byte sono
La data ti calcola l’indice degli array
Essendo sicuri, per esempio, che lo spegnimento è sempre nella giornata riduce un po’ l’incertezza. Ma non abbastanza da risparmiare un byte.
Spiega bene, che per caso particolari si può ridurre, ad esempio la distanza tra un Alba e la successiva varia poco di giorno in giorno. Stesso per il tramonto.
Un solo byte può codificare la differenza per tutti e due gli eventi.
Con 365 byte te la caveresti
Come vedi conoscere la casistica aiuta un botto

Effettivamente forse non sono stato chiaro. In realtà dobbiamo si simulare una sorta di alba e tramonto, ma in maniera totalmente artificiale, senza alcun legame con l’alba e il tramonto “naturale”, per questo avevo evitato di nominarli… temevo di creare confusione.
Per capirci: la quantità di tempo che intercorre tra i due eventi è già predeterminata ma in un modo che assolutamente non capisco (possiedo un calendario con i dati di tutti i 365 giorni ma, nonostante stia assiduamente cercando un legame tra gli eventi, non trovo alcun modo per “calcolare” il momento in cui un evento accade). Sembrano tutti determinati a casaccio!, faccio un esempio:
giovedì “alba” alle 04.30 “tramonto” alle 19.05
venderdì “alba” alle 04.28 “tramonto” alle 19.13
sabato “alba” alle 5.02 “tramonto” alle 18.55
domenica alba alle 04.45 “tramonto” alle 19.22

ecc. ecc.
sto cercando una qualche sorta di ciclicità, ma non la trovo!

Per riassumere un pò tutto: se riuscissi a ricondurre il tutto ad una o più casistiche, mi semplificherei la vita. In caso contrario meglio “salvare” in memoria i dati ed eseguire le operazioni all’orario “salvato”.

Grazie per la risposta

Ma no, sei abbastanza a posto così
Lo ecc ti da la data, dalla data ricostruisce l’indice dell’array. Recuperi dalla eprom i 4 byte e li usi per l’accensione
La cosa più difficile è scrivere 750 orari.
Dobbiamo automatizzare questa fase, tradurre il calendario in un array intendo. Il resto è banale
In che format è?

_pier:
sto cercando una qualche sorta di ciclicità, ma non la trovo!

Prova a guardare QUI ... fissi longitudine e latitudine (che, nel tuo caso puoi scegliere come vuoi) ed il gioco è fatto :wink:

Guglielmo

Meraviglia, Guglielmo sei un grande, questa serve a me,
Ma allo OP forse no, dai suoi esempi sembra che le ore che ha non siano reali, addirittura va in avanti e poi indietro di un quarto d'ora nella stessa settimana.
Se gli orari imposti sono cogenti non vado altro che caricarli in in array
Magari, esprimendosi in minuti, passandoli ad Excel e fare una ricerca del polinomio generante, ma la vedo dura

gpb01:
Prova a guardare QUI ... fissi longitudine e latitudine (che, nel tuo caso puoi scegliere come vuoi) ed il gioco è fatto :wink:

Guglielmo

Per il mio caso non è utile. Avevo cercato già, e anche trovato, un calcolo logaritmico che, appunto, in base a latitudine e longitudine ti dava la stima di alba e tramonto (che è quello che fanno gli interruttori astronomici...). Ma ripeto, nel mio caso, "alba" e "tramonto" non c'entrano nulla con l'alba e il tramonto "naturale", non hanno alcun legame con essi (nessun ritardo costante, nessun rapporto matematico ecc. ecc.).
Fidatevi: i miei 2 eventi giornalieri (che chiamo così perchè appunto non hanno nessun legame logico con alba e tramonto naturali), non sono calcolabili. Mi sono rasseggnato. Sono postulati :slight_smile:
http://astronomia.comze.com/algoritmo-alba-tramonto.htm questo è quello che avevo trovato io se può essere utile.

Lo ecc ti da la data, dalla data ricostruisce l'indice dell'array. Recuperi dalla eprom i 4 byte e li usi per l'accensione

Puoi spigarmi meglio per cortesia?

Dobbiamo automatizzare questa fase, tradurre il calendario in un array intendo. Il resto è banale
In che format è?

Ho un file excel, ed è la parte che sinceramente mi preoccupa meno.. me la cavo piuttosto bene con la stampa unione di office e una volta capito che tipo di formato serve, credo di riuscire a ottenere tutto...

_pier:
Per il mio caso non è utile.

Ok, quindi tu hai delle date e delle ore per evento_1 e evento_2 ... per un totale di circa 750 eventi (365 gg x 2 = 730 ... tu ne hai di più?).

Passati i 750 eventi cosa succede? Si ricomincia dal primo e la sequenza si ripete ?

Sto cercando di capire che "valori" occorre memorizzare per ottimizzare l'occupazione.

Guglielmo

gpb01:
Ok, quindi tu hai delle date e delle ore per evento_1 e evento_2 ... per un totale di circa 750 eventi (365 gg x 2 = 730 ... tu ne hai di più?).

Passati i 750 eventi cosa succede? Si ricomincia dal primo e la sequenza si ripete ?

Sto cercando di capire che "valori" occorre memorizzare per ottimizzare l'occupazione.

Guglielmo

Si, ho 2 eventi al giorno, quindi 2x365=730 eventi esatti. Finiti questi 730 eventi, il ciclo si ripete.
Pensavo, in testa mia: ogni evento è univoco se identificato con giorno/mese/anno/ora/minuto.
Nello sketch qualcosa tipo: comparare l'ora letta dal RTC (intesa come giorno/mese/anno/ora/minuto) con l'array contenente tutti i 730 eventi. Quando l'ora del RTC corrisponde ad uno degli orari contenuti nell'array, arduino eccita il relè ed esegue un delay di un minuto (altrimenti ecciterebbe il relè per tutti i 60 secondi di quel minuto...)

https://docs.google.com/spreadsheets/d/11nmCaQbAAD2kfjZN6B61oLQm6aF4FeGH47nprmdEdWE/edit?usp=sharing

Per ora ho digitalizzato solo il mese di gennaio..

_pier:
Si, ho 2 eventi al giorno, quindi 2x365=730 eventi esatti. Finiti questi 730 eventi, il ciclo si ripete.
Pensavo, in testa mia: ogni evento è univoco se identificato con giorno/mese/anno/ora/minuto.

... e NO, con l'anno non ci siamo ... l'anno DEVE essere sempre lo stesso che si ripete altrimenti ... dopo il primo giro, se l'anno cambia, NON funziona più. Anzi, l'anno va proprio ignorato.

Quindi, basta un array a DUE dimensioni in cui, per ciascuno dei 365 elementi (primo indice che è il giorno) corrispondono due valori (orario evento_1, orario evento_2).

Che precisione ti serve per l'evento? bastano ore:minuti o ti serve necessariamente ore:minuti:secondi ?

Guglielmo

gpb01:
… e NO, con l’anno non ci siamo … l’anno DEVE essere sempre lo stesso che si ripete altrimenti … dopo il primo giro, se l’anno cambia, NON funziona più. Anzi, l’anno va proprio ignorato.

Giustissimo, non ci avevo pensato! Meglio ignorare del tutto l’anno, che in fondo per il mio scopo non ha alcuna importanza.

Quindi, basta un array a DUE dimensioni in cui, per ciascuno dei 365 elementi (primo indice che è il giorno) corrispondono due valori (orario evento_1, orario evento_2).

Che precisione ti serve per l’evento? bastano ore:minuti o ti serve necessariamente ore:minuti:secondi ?

Guglielmo

Mi basta la precisione del minuto. Il calendario che ho non mi riporta i secondi, quindi direi che minuti va più che bene.

Se puoi usare una sd fatti un file, da leggere una riga per volta.
Caricare così tanti dati in eprom non sono capace, sto qui guardo e imparo…

Personalmente se dovessi fare N azioni al giorno (in caso di numeri azioni/giorno diversi tra i vari giorni N vale come il massimo numero di azioni/giorno), per le quali conosco ma non posso calcolare gli orari e non dipendano da un test esterno avrei un metodo che usa due variabili (non sono un mago, il resto é nella memoria programma, certamente abbastanza grande). Mi basta costruire due array constanti, uno con i tempi e l'altro di puntatori a funzione. Creando una funzione per ogni operazione (o meno se semplificabile) e riempiendo gli array, che sono bidimensionali e di pari dimensioni, in modo corretto, mi bastano le due variabili indice, oltre a quelle necessarie alle funzioni, e il programma fa:
1)una volta ogni 00:00(l'ora la devo sapere) alzo di 1 l'indice giorni e azzero l'altro
2)in continuo vedo se l'indice giorni é minore del massimo, se no lo azzero. Se l'indice azione é minore del massimo, se no nulla. E se i due indici sono validi vedo se l'orario indicato nel'array apposito é passato. Se si eseguo la funzione puntata dall'altro array e alzo di 1 la variabile di indice delle azioni giornaliere.
Dovrebbe andare, prova a scriverlo

Silente:
Personalmente se dovessi fare N azioni al giorno (in caso di numeri azioni/giorno diversi tra i vari giorni N vale come il massimo numero di azioni/giorno), per le quali conosco ma non posso calcolare gli orari e non dipendano da un test esterno avrei un metodo che usa due variabili (non sono un mago, il resto é nella memoria programma, certamente abbastanza grande). Mi basta costruire due array constanti, uno con i tempi e l’altro di puntatori a funzione. Creando una funzione per ogni operazione (o meno se semplificabile) e riempiendo gli array, che sono bidimensionali e di pari dimensioni, in modo corretto, mi bastano le due variabili indice, oltre a quelle necessarie alle funzioni, e il programma fa:
1)una volta ogni 00:00(l’ora la devo sapere) alzo di 1 l’indice giorni e azzero l’altro
2)in continuo vedo se l’indice giorni é minore del massimo, se no lo azzero. Se l’indice azione é minore del massimo, se no nulla. E se i due indici sono validi vedo se l’orario indicato nel’array apposito é passato. Se si eseguo la funzione puntata dall’altro array e alzo di 1 la variabile di indice delle azioni giornaliere.
Dovrebbe andare, prova a scriverlo

Scusami ma, credo per mia ignoranza, non riesco a seguire bene il tuo ragionamento. Mi viene però da puntualizzare che l’azione da svolgere è in realtà sempre la stessa: eccitare un relè. Questo per due volte al giorno.
Inoltre le azioni saranno sempre 2 al giorno. Mai di più, mai di meno.