Pages: [1]   Go Down
Author Topic: icone per fasi lunari  (Read 1191 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti, per cominciare mi presento. Sono un neofita di Arduino cui mi sono avvicinato per fare una piccola centralina per acquario. Ma come si sa l'appetito vien mangiando... per cui sto cercando di rendere un pò più carina la cosa. Non sono un programmatore, nè un informatico, pertanto tutto quello che ho fatto  finora (e credo non sia poco) l'ho fatto grazie a quanto ho visti sul forum. La lista della mia spese ha previsto finora:
Arduino mega rev 3
lcd 16x4
keypad matrix 4x3
sensore temperatura
scheda 8 relè
RCT.
Avendo terminato la parte es
senziale della centralina vorrei togliermi qualche sfizio. Quello che al momento mi sta togliendo il sonno è questo:
vorrei che sul LCD mi comparisse lo stato della fase lunare, ma non so come fare.
in pratica ho disegnato dei caratteri "Custom" in bite che rappresentano le fasi lunari così divise: luna nuova, quarto crescente, metà, 3/4, luna piena, 3/4 decrescente metà, un quarto, e di nuovo luna nuova. Vorrei che apparissero sul LCD in un sottomenù ciclicamente. in pratica cominciando dalla luna di

vuota dopo tre giorni dovrei visualizzare il primo quarto,dopo altri 4 giorni la metà e così via fino al 30 giorno in cui ritorna la luna nuova e riparte il ciclo. Non riesco a immaginare come fare. Fin'ora per fare tutto ho utilizzato le If, lo switch case etc.... ma






Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22633
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ti serve un algoritmo per il calcolo della fase lunare, e questo è facilmente reperibile in rete. Ce ne sono molti, basta adattarne uno scritto anche per un altro linguaggio.

Fatto questo metti nel ciclo principale del loop il richiamo di una funzione che ogni tot, diciamo anche 1 volta al giorno vista la scala che stai usando (8 fasi su 29 gg), visualizzi sull'LCD la fase calcolata.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

scusate ma ho difficoltà anche ad usare questo post... Dicevo ma credo che stavolta non basteranno. Avevo pensato di inserire una nuova variabile (int luna) e scrivere un codice del tipo int luna=0; if (int luna==0) { dopo 3 giorni int luna =1}; quindi continuare con if (int luna ==1) stampa icona + conta 4 giorni e int luna =2 ...etc per poi tornare indietro e quindi dare il comando di stampare le icone disegnate ma non son sicuro che vada bene e non saprei come scrivere il comando di contare 3 giorni. Come dicevo ho l'RCT ma non ho mai usato la EEPROM (perchè non so farlo), e vorrei risolvere senza dover "studiare" la stessa. Finora son riuscito a farmi un timer con una formula e vare incognite che mi consente di comandare tutto quello che mi serve "inventandomi una formuletta" che pare funzioni e che vi posto per avere eventuali critiche (per migliorarla) e per poter restituire un pò di quello che ho preso dal forum.

Code:
if (((Hon*10)+hon)<((Hoff*10)+hoff)){
  if ((hour==((Hon*10)+hon)&&minute>=((Mon*10)+mon))||(hour>((Hon*10)+hon)&&hour<((Hoff*10)+hoff))||(hour==((Hoff*10)+hoff)&&minute<=((Moff*10)+moff)))
  {digitalWrite (36, LOW);}
  else { digitalWrite (36, HIGH);}}
  if (((Hon*10)+hon)==((Hoff*10)+hoff)){
  if (minute>((Mon*10)+mon)&&minute<((Moff*10)+moff)){
  digitalWrite (36, LOW);}
  else { digitalWrite (36, HIGH);}}
  if (((Hon*10)+hon)>((Hoff*10)+hoff)){
  if ((hour==((Hon*10)+hon)&&minute>=((Mon*10)+mon))||(hour>((Hon*10)+hon)&&hour<((Hoff*10)+hoff))||(hour==((Hoff*10)+hoff)&&minute<=((Moff*10)+moff)))
  {digitalWrite (36, LOW);}
  else { digitalWrite (36, HIGH);}}
[sub[/sub]
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22633
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusa la domanda ma a cosa ti serve la EEPROM nel calcolo delle fasi lunari?  smiley-sweat
E l'algoritmo che hai postato, che dovrebbe fare? Spiega per benino, che sennò non si capisce molto  smiley-wink

PS:
per il calcolo della fase lunare un programma molto breve è questo:
http://media.skyandtelescope.com/binary/moonfx.bas
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie Leo, credo di aver risolto anche questa volta con if. Domattina metto giù la formula e dovrei fare le fasi lunari con approssimazione di 1 giorno fino al 2099. Se vien bene posto per gli altri. Se non fosse chiaro invece il timer giornaliero funziona cosi:
hour e minute sono l'ora e i minuti in cui ci troviamo letti dal RCT. Hon rappresenta la prima cifra del mio timer (che imposto io). cosi lo schema: Honhon:Monmon mentre per la fine Hoffhoff:Moffmoff. Per esempio inizio ore 08:30 e fine 20:45...  Hon=0 hon=8 Mon=3 mon=0, Hoff=2 hoff=0 Moff=4 moff=5. Spero di essermi fatto capire. Ciauz
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

c'era un errore nella formula un && al posto di un || .
Code:
// Timer giornaliero in cui decido ora accensione e ora spegnimento del pin 36 collegato ad un relè. On(Hh:Mm)   off(Hh:Mm)
  if (((Hon*10)+hon)<((Hoff*10)+hoff)){   //    quando l'ora di accensione è maggiore di quella di spegnimento  per es 08:30 accende 21:15 spegne
  if ((hour==((Hon*10)+hon)&&minute>=((Mon*10)+mon))||(hour>((Hon*10)+hon)&&hour<((Hoff*10)+hoff))||(hour==((Hoff*10)+hoff)&&minute<=((Moff*10)+moff)))
  {digitalWrite (36, LOW);}
  else { digitalWrite (36, HIGH);}}
  if (((Hon*10)+hon)==((Hoff*10)+hoff)){  // quando ora accensione eora spegnimento sono uguali 21:10 e 21:50
  if (minute>((Mon*10)+mon)&&minute<((Moff*10)+moff)){
  digitalWrite (36, LOW);}
  else { digitalWrite (36, HIGH);}}
  if (((Hon*10)+hon)>((Hoff*10)+hoff)){ //quando ora accensione è maggiore dello spegnimento 23.15 acc, 05.30 spegne (qui era l'errore)
  if ((hour==((Hon*10)+hon)&&minute>=((Mon*10)+mon))||(hour>((Hon*10)+hon)||hour<((Hoff*10)+hoff))||(hour==((Hoff*10)+hoff)&&minute<=((Moff*10)+moff)))
  {digitalWrite (36, LOW);}
  else { digitalWrite (36, HIGH);}}
Logged

Selvazzano Dentro - Padova
Online Online
Edison Member
*
Karma: 44
Posts: 1383
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

...come dire: "lui domanda e lui si rispondesmiley
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22633
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie Leo, credo di aver risolto anche questa volta con if. Domattina metto giù la formula e dovrei fare le fasi lunari con approssimazione di 1 giorno fino al 2099. Se vien bene posto per gli altri. Se non fosse chiaro invece il timer giornaliero funziona cosi:
hour e minute sono l'ora e i minuti in cui ci troviamo letti dal RCT. Hon rappresenta la prima cifra del mio timer (che imposto io). cosi lo schema: Honhon:Monmon mentre per la fine Hoffhoff:Moffmoff. Per esempio inizio ore 08:30 e fine 20:45...  Hon=0 hon=8 Mon=3 mon=0, Hoff=2 hoff=0 Moff=4 moff=5. Spero di essermi fatto capire. Ciauz
NO!

Ti eri messo a parlare di EEPROM, ti ho chiesto a che ti serviva la EEPROM nel calcolo della fase lunare e tu te ne esci con questa spiegazione che non... spiega nulla  smiley-lol smiley-lol
Vediamo se ricostruisco... volevi dire che tu hai un timer per l'accensione/spengimento di qualcosa e che gli orari di ON/OFF li salvi in EEPROM, se ho capito...  smiley-sweat
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusate ma ho fatto un pò di confusione. In effetti ho inserito due cose insieme. 1) cercavo aiuto per capire come fare le fasi lunari. 2)volevo restituire qualcosa al forum (da cui ho appreso tanto) con quel codice che rappresenta un timer semplice. In pratica avevo notato in molte discussioni che vi era la difficoltà di fare un Timer con formule che contenessero sia ore che minuti. Avendo lavorato parecchio a quella e avendo testato che sembra funzionare la ho postata (anche per ricevere eventuali consigli su come migliorarla). Ma non c'entrava niente con le fasi lunari. Per quanto riguarda la EEPROM, non ho capito come funziona e pertanto non volevo utilizzarla. Non sapendo a che serve chiedevo, a chi mi avrebbe voluto aiutare per le fasi lunari, di non indirizzarmi verso la stessa.
Avendo, credo, risolto il problema delle fasi lunari vi posto il codice che ho usato per fare tutte le prove. Tale codice va bene dal 2000 al 2099 e penso abbia un margine di errore di un giorno (che per il mio caso non è un problema). Ancora grazie a tutti.
Code:
#include <LiquidCrystal.h>

LiquidCrystal lcd(13, 12, 11, 10, 9, 8); /* LCD*/
int backLight = 7; /* Luminosità schermo*/

int faselunare;
int regolarilunari;
int dayOfMonth=18;   //fase lunare del 18/11/2012
int month=11;
int year=12;


void setup()
{ lcd.begin(16, 4);
}

void loop()
{//Formula usata per calcolare la faselunare=epatta+regolari lunari+ giorno del mese.
faselunare=(((((((2001+year)-(((2001+year)/19)*19))*11)-10)-((((((2001+year)-(((2001+year)/19)*19))*11)-10)/30)*30))-2)+regolarilunari+dayOfMonth);
if (month==1||month==3) {regolarilunari=0;}
if (month==2||month==4) {regolarilunari=1;}
if (month==5) {regolarilunari=2;}
if (month==6) {regolarilunari=3;}
if (month==7) {regolarilunari=4;}
if (month==8) {regolarilunari=5;}
if (month==9||month==10) {regolarilunari=7;}
if (month==11) {regolarilunari=9;}
if (month==12) {regolarilunari=10;}
if ((year==0||year==4||year==8||year==12||year==16||year==20||year==24||year==28||year==32||year==36||year==40||year==44||year==48||year==52||year==56||year==60||year==64||year==68||year==72||year==76||year==80||year==84||year==88||year==92||year==96)&&(month<2))
{regolarilunari=(regolarilunari+1);}  //per gli anni bisestili dal 2000 al 2099 bisogna aumentare i regolarilunari da marzo a dicembre di 1
if (faselunare>=30) {faselunare=(faselunare-30);}  //fase lunare da 0 a 29
if (faselunare<0) {faselunare=(faselunare+30);}   //fase lunare da 0 a 29 (conversione di eventuali risultati negativi
lcd.setCursor (5,0);
if (faselunare==0||faselunare==1||faselunare==29) {lcd.print ("luna nuova");}  //nel programma definitivo visualizzerò le icone di luna vuota 1/4 metà 3/4 piena 3/4decr metàdecr 1/4decr e di nuovo luna vuota
if (faselunare>1&&faselunare<6){lcd.print ("luna crescente");}
if (faselunare==7||faselunare==6||faselunare==8) {lcd.print ("primo quarto");}
if (faselunare>8&&faselunare<14) {lcd.print ("primo quarto crescente");}
if (faselunare==14||faselunare==15) {lcd.print ("luna piena");}
if (faselunare>=16&&faselunare<21) {lcd.print ("luna decrescente");}
if (faselunare>22&&faselunare<23) {lcd.print ("secondo quarto");}
if (faselunare>23&&faselunare<29) {lcd.print ("secondo quarto");}
lcd.setCursor (4,2);
lcd.print (faselunare) ;  //per verificare se il risultato era corretto lo visualizzo su LCD

}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

scusate ancora: trovato errore nella formula smiley-razz
Code:
if ((year==0||year==4||year==8||year==12||year==16||year==20||year==24||year==28||year==32||year==36||year==40||year==44||year==48||year==52||year==56||year==60||year==64||year==68||year==72||year==76||year==80||year==84||year==88||year==92||year==96)&&(month<=2))//e non (month<2)
Logged

Cagliari, Italy
Online Online
Tesla Member
***
Karma: 112
Posts: 7077
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Un esempio di codice lo trovi anche qui --> http://channel9.msdn.com/coding4fun/articles/Remote-Controlled-lunaring-with-Arduino
e qui --> http://www.voidware.com/moon_phase.htm
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Pages: [1]   Go Up
Jump to: