Orologio con Alba/Tramonto da calcoli astronomici

si ... io avevo fatto le stesse considerazioni, ma nn trovando ( o nn volendo spendere) un dispositivo che mi dessè l'orario avevo deciso di far fare i conti al pc poi ....
ma comunque si .. il tuo approccio è corretto.

ultima cosa occhio ai gradi e ai radianti .... :wink:

grazie anche a te dadebo1 ho notato che il procedimento che hai messo nel tuo programma è molto simile al mio...ma lo guarderò molto meglio stasera a casa. :wink:

la conversione in radianti è stata fatta dividendo per 57.2958 (180/pi)...m l'hai detto perchè hai trovato qualche svista?

no .. perchè mi ero scontrato anche io .
se riesco riguardo meglio il tuo listato ... e vedo se posso aiutarti .. :slight_smile:

mi sono perso nelle fomule.. ..ma OMEGA? che dovrebbe essere 2pgreco/365 quando la definisci?
poi cosa intendi per equazione del tempo ?
sarebbe lo scostamento di orari che abbiamo rispetto al meridiano di riferimento ecc....
boh .... hai provato a confrontarlo con le ore di alba e tramonto.. ?
ciao

Per l'equazione del tempo vedete qui.

Anch'io ai tempi del GW-BASIC feci un programma di calcolo dei tempi di sorgere e del tramonto del sole che teneva conto di una serie di fattori quali anche (cosa che nessuno ha citato qui) la rifrazione atmosferica, vale a dire lo scostamento dell'effettivo momento di sorgere e tramonto dato dallo spostamento dei raggi luminosi per via dell'atmosfera.

Secondo me però qui stiamo entrando nel regno delle paranoie dato che per un semplice progetto per accendere/spengere delle luci tutta questa accuratezza mi pare eccessiva. :wink:
Quando hai i tempi "indicativi" del sorgere e del tramonto, approssimati anche a qualche minuto, mi pare che sia più che sufficiente, non trovate? ::slight_smile:

@leo72:

l'equazione del tempo l'ho presa proprio da wikipedia :slight_smile:

In realtà l'atmosfera terreste funziona tipo una lente e quindi crea un effetto ottico per cui la posizione del sole che vediamo è spostata di qualche grado

non ho usato la parola rifrazione, ma comunque se ne era discusso

Poffarbacco!! Non mi ero accorto di quel passaggio :smiley:

Cmq ciò non toglie che tutta questa accuratezza mi pare eccessiva per il tipo di funzione del progetto ::slight_smile:

Io credo che se già l'approssimazione sia vicina al minuto, il risultato è più che buono.

se pero' federico scrivesse una bella libreria, e non un codice orientato a accendere e spegnere luci, si potrebbero pensare cose anche piu' creative, come installazioni artistiche, orologi di parete, radiosveglie e chi piu' ne ha piu' ne metta. fede

BUON LAVORO ....

aggiornamento veloce: modificando l'orario di mezzo dì medio (prima usavo un valore statico, tra l'altro impostato su Roma) con il valore esatto calcolato a seconda della longitudine del luogo, ho notato che i valori di alba e tramonto sono molto più....soddisfacenti.

Le 2 domande che mi sorgono ora sono:

  1. siccome non sono un programmatore esperto, quale sarebbe il modo migliore di riscrivere la funzione, in modo che l'array con gli orari di alba e tramonto non sia più una variabile globale ma sia qualcosa che stia bene dentro una libreria? Ho capito che dovrei usare i puntatori, ma non mi è ancora ben chiaro il meccanismo con cui vengono usati nelle funzioni.

  2. non capisco perchè nell'ultimo elemento dell'array mi escono i numeri del lotto, per questo ho usato lo stratagemma, inutile:

  alba_tramonto_HM[0] = (int)floor(alba);
  alba_tramonto_HM[1] = (int)floor((alba - alba_tramonto_HM[0]) * 60.0);

  alba_tramonto_HM[2] = (int)floor(tramonto);
  alba_tramonto_HM[3] = (int)floor((tramonto - alba_tramonto_HM[2]) * 60.0);

  alba_tramonto_HM[4]++;

...non ho ancora trovato una soluzione

int alba_tramonto_HM[4];

void setup()
{
 
 Serial.begin(57600);
 omega = omega/deg_rad; //few conversion

for(int i=0; i<5; i++)
   alba_tramonto_HM[i] = 0;
}

premetto che non ho letto tutto... e perdonami se te lo hanno detto... però...
int alba_tramonto_HM[4] è un array di 4 interi, con posizioni 0, 1, 2, 3
nel setup te fai

  for(int i=0; i<5; i++)
    alba_tramonto_HM[i] = 0;

e vai a prendere anche la posizione 4 dell'array che non esiste....

questo è dovuto ai cosiddetti magic number, nel caso 4 e 5... usa mooooooolte macro (#define) così eviti questi problemi... e soprattutto il codice è più leggibile anche a posteriori... specialmente da te ;D

come nella dichiarazione di variabili iniziali... hai scritto float omega = 0.9863; //(= 360/365) [gradi/giorno] -> gradi per ogni giro / giorni_anno
qui, imho, era meglio fare 2 macro (gradi per ogni giro e giorni all'anno) e anzi che scrivere quel numero (0,9863) mettere una classica divisione, con dividendo e numeratore come macro...
sempre imho ovviamente ::slight_smile:

  1. non capisco perchè nell'ultimo elemento dell'array mi escono i numeri del lotto, per questo ho usato lo stratagemma, inutile:
  alba_tramonto_HM[0] = (int)floor(alba);

alba_tramonto_HM[1] = (int)floor((alba - alba_tramonto_HM[0]) * 60.0);

alba_tramonto_HM[2] = (int)floor(tramonto);
 alba_tramonto_HM[3] = (int)floor((tramonto - alba_tramonto_HM[2]) * 60.0);

alba_tramonto_HM[4]++;




...non ho ancora trovato una soluzione

intendi alba_tramonto_HM[4] ? beh... perché come ho detto nel post precedente quell'array è di 4 elementi, non di 5, perché l'indicizzazione dell'array parte da 0, quindi accedere all'elemento 4 corrisponde a considerare il 5 elemento di un array che ne ha solo 4... quindi prende quello che nella memoria segue il 4 elemento dell'array, ma che te non hai la più pallida idea di cosa possa essere, e a modificarlo rischi anche segmentation fault... visto che puoi andare a leggere/scrivere in celle di memoria contenenti chissà cosa...

edit: usa macro per dire cosa sono quegli indici dell'array (0, 1, 2, 3 e 4), così si capisce meglio XD sennò devi tirare un po a caso cosa c'è in quegli elementi dell'array... per non considerare i problemi relativi ad un "cambio di idea" sull'indice degli elementi ;D ;D

  1. siccome non sono un programmatore esperto, quale sarebbe il modo migliore di riscrivere la funzione, in modo che l'array con gli orari di alba e tramonto non sia più una variabile globale ma sia qualcosa che stia bene dentro una libreria? Ho capito che dovrei usare i puntatori, ma non mi è ancora ben chiaro il meccanismo con cui vengono usati nelle funzioni.

riperdonami... ma non so quale funzione vorresti creare...
cmq per una libreria ricordati di fare un file.h, contenente macro, dichiarazioni di funzioni e volendo anche altre inclusioni e un file.cpp che include file.h e implementa le funzioni dichiarate in esso; poi nello sketch (o dove ti serve) includi il file.h...

per il file.cpp (source) fallo in cpp, perché farlo in c comporterebbe problemi che non ho ancora ben capito legato al compilatore... quindi risolvilo direttamente con un file.cpp, tanto ciò che va bene in c va bene anche in cpp XD (se avevi intenzione di farla in c e non in cpp)

che altro dire... i puntaori puntano ad zone in memoria... non sono facili da capire... forse ti conviene evitarli se puoi... magari nelle funzioni usa variabili static, che mantengono il loro valore per tutta la durata dell'esecuzione del programma :wink:

hai ragione!! grazie mille! ecco cosa non tornava con quell'array ;D...devo aver fatto casino perchè all'inizio lo usavo di 6 elementi, perchè, oltre ai minuti e alle ore, facevo calcolare anche i secondi...poi cambiando gli indici ho combinato il guaio!

Ti ringrazio anche per la dritta sulle macro, appena mi ci rimetto sopra applico tutti i tuoi consigli :wink:

L'unica cosa che non ho capito bene è perchè mi consigli di usare variabili statiche all'interno delle funzioni, che vantaggio apportano?

in c, variabili "static" si mantengono costanti tra una chiamata e l'altra della funzione, vengono inizializzate una sola volta all'inizio e poi mantengono sempre un valore, es:

unsigned int counter(){
   static unsigned int count = 0;
   return ++count;
}

se lo chiami 10 volte count varrà 10 e la funzione ti restituisce il numero di volte che la hai chiamata... provala :smiley: (se non ho fatto errori nella scrittura)

ma come ti ripeto, non ho letto tutto il topic, quindi non so bene quale sia il tuo problema e se è meglio affrontarlo con puntatori, variabili static, struct o che so io ;D

cmq visto il discorso delle macro/indici? ;D cambiando solo il valore della macro risolvi tutto, sennò devi stare a cercare tutti i numeri magici, e capita di fare confusione e scordarsene uno... cosa che non succede con le macro ;D

ciao ragazzi,
oggi avendo un attimo di tempo mi sono messo ad estrarre una libreria dal codice scritto, e qui in anteprima vi do un'anticipazione del risultato:
http://cinquetau.altervista.org/blog/wp-content/uploads/2011/01/SunLight.zip

presto scriverò una paginetta sul playground, farò qualche esempio ecc...

per il momento chiedo a tutti coloro che avranno voglia di provarla di dirmi se è comprensibile (si possono fare ancora parecchie migliorie, e le farò) e di darmi qualche parere anche per le modifiche.

grazie a tutti

[timestamp=1295770380]
La paginetta sul playground: Arduino Playground - SunLight

Anche se calcolare la data di alba e tramonto mi sembra poco utile per accendere una luce (basterebbe una fotoresistenza collegata alla arduino), mi sembra una libreria interessante per realizzare un orologio, o una sveglia, o un calendario elettronico con fasi lunari, o un cronotermostato per il termosifone, ecc...
Sarebbe per esempio simpatico collegare ad arduino una "luna artificiale" meccanica, che cambia fase in tempo reale! :slight_smile:

E mi hai appena fatto venire la bizzarra idea di un calendario interattivo!
Ho scritto un programma che scarica tutta la programmazione TV di SKY e permette di scegliere i propri programmi preferiti: se si potessero poi "caricare" su questo calendario, che mostrerebbe volta per volta quale e quando è il prossimo programma in onda, sarebbe interessante!
Per inciso, il programma è questo:
http://win98.altervista.org/SatGrabLC/

Adesso apro un thread apposta! :wink:

ecco ti conviene perchè sei un po' OT! :stuck_out_tongue:

Ammetto che non ho spiegato bene cosa fa adesso la libreria, rimedio subito:

la libreria non è nè un calendario nè calcola le fasi lunari (anche se potrebbero comunque essere implementate), si limita solo a calcolare il moto del sole per una certa località (latitudine e longitudine) e può farlo giornalmente impostando una data.
Gli elementi a cui si è dato risalto sono il sorgere ed il tramontare del sole, che indubbiamente, caratterizzano le fasi di luce e di buio di una giornata.

Il progettino inizialmente era nato per permettermi di accendere le luci sul balcone durante il periodo natalizio, non ho usato una fotoresistenza perchè mi andava di provare questa cosa e poi perchè il valore letto dalla fotoresistenza va calibrato a seconda di come la disponi.
Quindi in un certo senso questa libreria ti da il vantaggio di non aver bisogno di calibrazioni e di non usare pin di Arduino.
Lo svantaggio è che computazionalmente è sicuramente più impegnativa.

Nella libreria ci sono solo le funzioni necessarie al calcolo dei due eventi, più anche il calcolo del mezzo dì, ovvero quando il sole è allo Zenit. Poi sta all'utilizzatore della libreria decidere cosa farci...anche una sveglia che ti avvisi 10 minuti prima dell'alba ad esempio!

Ciao Federico

ti vorrei anche io proporre di implementare nella libreria il calcola delle fasi lunari comprendendo anche il perigeo e apogeo, se hai bisogno di indicazioni ti posso inviare un piccolo prg scitto il basic che esegui questi calcoli.

Ciaoooo