Go Down

Topic: Arduino Alba/tramonto (Read 377 times) previous topic - next topic

bitmanrc

Mar 25, 2018, 12:41 am Last Edit: Mar 25, 2018, 12:45 am by bitmanrc
Salve, vorrei realizzare un azionamento di un rele all'alba e al tramonto (più preciso possibile) ...
ho questo codice (ricavato su questo forum del 2010) , cambiando le date (nell'esempio in modo manuale), non ho un orario di alba e tramonto esatte.
Dov'è lo sbaglio?
o meglio oltre la LATIDUINE dove devo mettere la LONGITUDINE?

come calcolo prendo a riferimento questo sito:
https://www.esrl.noaa.gov/gmd/grad/solcalc/

Code: [Select]

#include <Math.h>
#include <stdio.h>
#include <stdlib.h>    
#include <stdint.h>
String ALBA="";
String TRAMONTO="";
double mezzo_di_medio =12.1667; // corrisponde alle 12h10m -> 50m indietro rispetto a Greenwich

float omega = 0.9863; //(= 360/365) [gradi/giorno] -> gradi per ogni giro / giorni_anno
float deg_rad = 57.2958; // conversione gradi radianti
  
  int giorno=24;
  int mese=03;
  int anno=2018;
  
void setup()
{
  Serial.begin(9600);
  float omega = (0.9863/deg_rad);
}

void loop()
{
      calcAlba_Tramonto( mezzo_di_medio );
      delay(1000);  
}


void calcAlba_Tramonto( double mezzo_di_medio )
{
  ALBA="";
  TRAMONTO="";
  float lat = 45.70;
  int alba_tramonto_HM[]={0, 0, 0, 0, 0};
  float doy = (floor(275 * mese /9))  - ((floor((mese + 9) / 12)) * ((1 + floor((anno - 4 * floor(anno / 4) + 2) / 3))) ) + giorno - 30;
  float t = doy + 284.0;
  double dec = 23.45 * sin(omega * t); //declinazione del sole
  double E1 = sin(2.0 * omega * (doy - 81.0));
  double E2 = sin(omega * (doy - 1.0));
  double E = -9.87 * E1 + 7.67 * E2; //equazione del tempo
  double mezzo_di = mezzo_di_medio + E/10.0;
  double T = 12 * (1 + (dec * tan(lat / deg_rad) / 90.0));
  //Serial.print((float)E,4);  Serial.print("...."); Serial.print((float)mezzo_di,4);  Serial.print("....");  Serial.print((float)T,4);  Serial.print("....");
  double mezzoT = T / 2.0;
  double alba = (mezzo_di - (mezzoT)) ;
  double tramonto = mezzo_di + (mezzoT) ;
  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[0]=alba_tramonto_HM[0];
  alba_tramonto_HM[2]=alba_tramonto_HM[2];
  //alba_tramonto_HM[3]=((alba_tramonto_HM[3]/10)*10);
  //alba_tramonto_HM[1]=((alba_tramonto_HM[1]/10)*10);
  if (alba_tramonto_HM[0]<10) {Serial.print("0"); ALBA=ALBA+"0"; } ALBA=ALBA+alba_tramonto_HM[0];  Serial.print(alba_tramonto_HM[0]); Serial.print(":");
  if (alba_tramonto_HM[1]<10) {Serial.print("0"); ALBA=ALBA+"0"; } ALBA=ALBA+alba_tramonto_HM[1]; Serial.print(alba_tramonto_HM[1]);
  Serial.print("....");
  if (alba_tramonto_HM[2]<10) {Serial.print("0"); TRAMONTO=TRAMONTO+"0";} TRAMONTO=TRAMONTO+alba_tramonto_HM[2]; Serial.print(alba_tramonto_HM[2]); Serial.print(":");
  if (alba_tramonto_HM[3]<10) {Serial.print("0"); TRAMONTO=TRAMONTO+"0";} TRAMONTO=TRAMONTO+alba_tramonto_HM[3]; Serial.print(alba_tramonto_HM[3]);
  Serial.println();
}

nid69ita

#1
Mar 25, 2018, 11:46 am Last Edit: Mar 25, 2018, 11:50 am by nid69ita
1. sei su Arduino Uno ?    double non esiste, in realtà è uguale a float, ovvero poco preciso. Per un vero double più preciso devi passare ad una MCU più potente.
2. non conosco quei calcoli, ma i valori dentro al vettore alba_tramonto_HM sono giusti ?
3. queste due righe ? Non hanno senso
Code: [Select]
alba_tramonto_HM[0]=alba_tramonto_HM[0];
4. nel setup se omega la dichiari allora è una variabile diversa ed è locale al setup() (nasce e muore nel setup)
Code: [Select]
float omega = (0.9863/deg_rad);
5. A che ti servono quei due String ?  Usa semplicemente 2 int (se ti bastano HHMM) oppure 2 long con il calcolo HH*100+MM oppure HH*10000+MM*100+SS  così in unica variabile hai l'orario, facilmente stampabile e facilmente confrontabile   tipo    if( alba>=103000)
my name is IGOR, not AIGOR

bitmanrc

le due righe

  alba_tramonto_HM[0]=alba_tramonto_HM[0];
  alba_tramonto_HM[2]=alba_tramonto_HM[2];

erano inizialmente atte a detrare o aggiungere valori X, per arrtondare ad avvicinarmi all'ALBA e TRAMONTO. cmq effettivamente sono nulle.

Sono su arduino MEGA.

4. nel setup se omega la dichiari allora è una variabile diversa ed è locale al setup() (nasce e muore nel setup)
quindi non effettua il calcolo? mi sembra di si.. questo programmino lo ricavata da un topi su questo forum del 2010.

Le due stringe servono nel programma vero proprio, visto che quello che ho posato è solo una parte integrante di quello che NON mi funziona.

I calcoli NON so neppure cosa fanno , ho solo copiato e incollato il software.  ;D

Andiamo avanti.. come sistemo sta cosa?


Quindi......

nid69ita

#3
Mar 25, 2018, 10:46 pm Last Edit: Mar 25, 2018, 10:47 pm by nid69ita
4. nel setup se omega la dichiari allora è una variabile diversa ed è locale al setup() (nasce e muore nel setup)
quindi non effettua il calcolo? mi sembra di si.. questo programmino lo ricavata da un topi su questo forum del 2010.
Il calcolo lo fa ma li "muore". La variabile è locale e NON è la stessa di quella globale.
Nella calcAlba_Tramonto() viene vista solo la omega globale.
my name is IGOR, not AIGOR

bitmanrc

Se puoi darmi una dritta per come completarlo.
al fine di avere in questa discussioni info anche per altre persone.
Ho "tagliato la testa al toro", ho usato <TimeLord.h>
Grazie

nid69ita

Non ho capito la domanda.
Se per omega, basta che nella setup() NON la dichiari ma la imposti solo:
float omega = (0.9863/deg_rad);
my name is IGOR, not AIGOR

bitmanrc

si scusa NON avevo inteso.
comunque tieni conto che questi errori sono solo errori di distrazione,
visto che il programma postato e stato "estratto" e accomodato per la pubblicitazione
per i consigli che potessi ricevere in questo topic.
la cosa che NON capisco e dove mettere e far calcolare la LONGITUDINE, visto che solo LATITUDINE (lat) viene richiesta.
forse è il valore mezzo_di_medio che fa da latitudine?
se è si? quindi 12,1667 corrisponde alle 12:10 ora locale, se quindi lo metto 13,0000 dovrebbe essere +1GMT,..... ma cosi non è!
ho sempre alba e tramonto sballati.

nid69ita

#7
Mar 26, 2018, 09:10 am Last Edit: Mar 26, 2018, 09:11 am by nid69ita
Non conosco quei calcoli.
Però il C a volte è precisino e tu devi specificare bene nei calcoli se vuoi lavorare con interi o decimali.
Esempio, prova a forzare le costanti con .0         
  T=  12 *     in     T = 12.0 *
e ancora i vari pezzi di doy:
  float doy = (floor(275 * mese /9)) ...
in
  float doy = (floor(275.0 * mese/9.0)) ...
my name is IGOR, not AIGOR

bitmanrc


Patrick_M

per quanto riguarda l'uso di floorf al posto di floor su arduino....


http://forum.arduino.cc/index.php?topic=118950.0
per inserire lo sketch da IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

bitmanrc

RISOLTO
Con libreria TimeLord.h
Grazie a tutti

Go Up