Pages: 1 [2]   Go Down
Author Topic: Orologio con Alba/Tramonto da calcoli astronomici  (Read 6113 times)
0 Members and 1 Guest are viewing this topic.
Milano, Italy
Offline Offline
Faraday Member
**
Karma: 11
Posts: 3091
Sideralis Arduino!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Federico - Sideralis
Arduino &C: http://www.sideralis.org
Foto: http://blackman.amicofigo.com

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 313
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

BUON LAVORO ....
Logged

Global Moderator
Milano, Italy
Offline Offline
Edison Member
*****
Karma: 19
Posts: 1175
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
 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
Logged

F

Massa, Italy
Offline Offline
Full Member
***
Karma: 0
Posts: 172
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Code:
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
Code:
 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
Code:
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  :smiley
Logged

Massa, Italy
Offline Offline
Full Member
***
Karma: 0
Posts: 172
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
2) non capisco perchè nell'ultimo elemento dell'array mi escono i numeri del lotto, per questo ho usato lo stratagemma, inutile:
Code:
 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 smiley-lol 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

Quote
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 smiley-lol (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  smiley-wink
« Last Edit: January 04, 2011, 12:53:07 pm by Brig » Logged

Global Moderator
Milano, Italy
Offline Offline
Edison Member
*****
Karma: 19
Posts: 1175
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

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

F

Massa, Italy
Offline Offline
Full Member
***
Karma: 0
Posts: 172
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

Code:
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-grin (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
« Last Edit: January 05, 2011, 07:45:53 am by Brig » Logged

Global Moderator
Milano, Italy
Offline Offline
Edison Member
*****
Karma: 19
Posts: 1175
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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: http://www.arduino.cc/playground/Italiano/SunLight
« Last Edit: January 23, 2011, 03:13:23 am by Federico_Vanzati » Logged

F

Rome
Offline Offline
God Member
*****
Karma: 1
Posts: 987
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!  smiley

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!  smiley-wink
Logged

Global Moderator
Milano, Italy
Offline Offline
Edison Member
*****
Karma: 19
Posts: 1175
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ecco ti conviene perchè sei un po' OT!  smiley-razz

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!
Logged

F

0
Offline Offline
Newbie
*
Karma: 0
Posts: 17
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: 1 [2]   Go Up
Jump to: