Stazione Meteo Completa! (FAI DA TE) »  Mostra messaggi da    a     

Linea Meteo


Strumenti meteo - Stazione Meteo Completa! (FAI DA TE)



As_Needed [ Gio 26 Mar, 2015 22:53 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
maxtux ha scritto: [Visualizza Messaggio]
As_Needed ha scritto: [Visualizza Messaggio]
Mauro volevo chiederti una cosa... Ma quando dovrò mettere la griglia di aerazione antipioggia, sul foro passacavo, se non si trova delle stesse dimensioni del foro, come faccio? Poi quando faccio passare i fili all'esterno dal foro, come faccio a proteggere ciò che è all'interno della scatola stagna, visto che devo togliere il gommino?
:bye:


Ciao, prima di tutto scusami ma sono stato fuori per lavoro.
Allora, la scatola stagna ha più fori, tutti protetti con gommini passacavo, i cavi devono uscire da uno dei gommini ma SENZA rimuoverlo, il gommino si può tagliare per lo spazio necessario a far passare i cavi, per le griglie le trovi sicuramente, al massimo lievemente più grandi.

ciao


Ok ho capito :ok: Poi per montarle se sono lievemente più grandi cosa uso?
:bye:


As_Needed [ Mar 15 Set, 2015 15:22 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Riprendo questo topic, perché adesso ho intenzione di riprendere il progetto, lo porterò come progetto finale agli esami! Però per farla ancora meglio, ho intenzione di metterci anche un anemometro con bandoliera, collegandolo ad arduino: per ciò vorrei sapere da voi quale secondo voi posso prendere di anemometro, un buon anemometro che non costi troppo! Avevo pensato anche di autocostruirlo, ma già ho da finire molte cose, quindi preferisco così.
:bye:

EDIT: una domanda fuori topic per Andrea, poi quando magari è tutta perfetta che l'ho finita, anche senza pluviometro si può inserire nella rete?
Ovviamente presupponendo di riuscire a trasmettere i dati su pc...


andrea75 [ Mer 16 Set, 2015 15:09 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
As_Needed ha scritto: [Visualizza Messaggio]
EDIT: una domanda fuori topic per Andrea, poi quando magari è tutta perfetta che l'ho finita, anche senza pluviometro si può inserire nella rete?
Ovviamente presupponendo di riuscire a trasmettere i dati su pc...


Assolutamente sì... dove il dato non viene letto, la rete lo esclude e non lo mostra. Quindi avrai una stazione pienamente funzionante anche nella rete meteo, ma senza dati pluviometrici. ;)


As_Needed [ Mer 16 Set, 2015 15:45 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
andrea75 ha scritto: [Visualizza Messaggio]
As_Needed ha scritto: [Visualizza Messaggio]
EDIT: una domanda fuori topic per Andrea, poi quando magari è tutta perfetta che l'ho finita, anche senza pluviometro si può inserire nella rete?
Ovviamente presupponendo di riuscire a trasmettere i dati su pc...


Assolutamente sì... dove il dato non viene letto, la rete lo esclude e non lo mostra. Quindi avrai una stazione pienamente funzionante anche nella rete meteo, ma senza dati pluviometrici. ;)


Capito allora! Grazie della risposta. ;) Invece per l'anemometro qualcosa da consigliarmi? Intanto poi trovo il modo io di collegarlo ad arduino!
:bye:


As_Needed [ Gio 01 Ott, 2015 19:00 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Allora, posto le ultime cose fatte, in attesa dell'anemometro TX20 della LaCrosse che collegherò con arduino. Ecco qui lo schema elettrico e il pcb, ovvero quello che andrò a stampare su basetta. Per il pcb, forse farò qualche ritocco, per i collegamenti, ho seguito questo semplice schema in figura:
level_shifter

Qui invece sch e pcb:
fdgghdsfdsds cvbdfbgdfbgdfdf

:bye:

EDIT: Voglio specificare che il progetto in questione avrà come obiettivo una stazione meteo in grado di rilevare i seguenti valori: temperatura, umidità, pressione, intensità vento e direzione del vento e poi magari con delle formule, wind chill, heat index e dew point: questi valori saranno visualizzati tutti sul display. L'obiettivo successivo, sarebbe quello di trasmettere i dati con il wifi, tramite un antenna, in grado di mettere su un server poi anche i valori massimi e minimi di temperatura, umidità, pressione, punto di rugiada (dew point) e il valore massimo del vento e dell'indice di calore e il valore minimo del wind chill.
Speriamo di riuscire a fare tutto. :D
:bye:


Fili [ Gio 01 Ott, 2015 20:20 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
averlo saputo lo facevo riparare a te il mio anemometro invece di ricomprarlo! :evil: :evil: :evil:


andrea75 [ Gio 01 Ott, 2015 20:56 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Lavorone! :inchino:


As_Needed [ Gio 01 Ott, 2015 22:45 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Fili ha scritto: [Visualizza Messaggio]
averlo saputo lo facevo riparare a te il mio anemometro invece di ricomprarlo! :evil: :evil: :evil:


Dipende sempre dal danno! :bye:

Comunque sì, è stato un bel lavorone, a non fare intrecciare niente poi, a spostare i componenti e tutto... il top copper l'ho usato poco, e con il bottom copper(piste blu) a non fare intrecciare niente e fare tutti i collegamenti giusti ci vuole.
:bye:


Gab78 [ Ven 02 Ott, 2015 12:20 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Davvero complimenti per il lavoro! :inchino: :ok:


As_Needed [ Ven 02 Ott, 2015 15:22 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Gab78 ha scritto: [Visualizza Messaggio]
Davvero complimenti per il lavoro! :inchino: :ok:


Grazie Gabriele! ;)
:bye:


As_Needed [ Ven 02 Ott, 2015 19:02 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Ecco il pcb probabilmente definitivo ;) Ho spostato qualche resistenza e quindi ristretto di più il tutto se no occupo spazio inutilmente. Il connettore del TX20 l'ho messo più verso l'esterno, perché i connettori vanno messi il più esterno possibile nella basetta. Piccolo errore, la scritta di 'Arduino Uno' ovviamente va messa fuori dal riquadro (pad master, contorno fuxia) ovvero quello che stampi, cioè che ciò che è dentro al riquadro viene stampato.
Come ho detto questo probabilmente sarà il definitivo quindi voglio postarlo:
immagine_1443805298_584197

Comunque mi è arrivato il TX20! 8))
:bye:


Frasnow [ Ven 02 Ott, 2015 19:32 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Complimenti, ma da un comune mortale è realizzabile come cosa?


As_Needed [ Ven 02 Ott, 2015 20:07 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Frasnow ha scritto: [Visualizza Messaggio]
Complimenti, ma da un comune mortale è realizzabile come cosa?


Beh sì, io lo sono :D Ci vogliono solo i materiali, specialmente avere qualcuno che stampa il circuito con una macchina apposita e poi impegno, ancora questo è solo l'inizio ;)
:bye:


meteotecnico [ Mer 07 Ott, 2015 10:06 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Bel lavoro, complimenti ! Il circuito stampato mi sembra tranquillamente fattibile in casa a mezzo fotoincisione oppure con il solito metodo del ferro da stiro :-)


As_Needed [ Gio 22 Ott, 2015 16:30 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Ragazzi! Ecco altri aggiornamenti sul progetto: INNANZITUTTO SONO RIUSCITO CON VARI AIUTI A RILEVARE GIA' LA VELOCITA' DEL VENTO E LA DIREZIONE tramite il tx20 collegato ad arduino, qui sotto metto il programma che ho utilizzato:
Ovviamente il programma per ora rileva solo quei valori, poi se vorrò mettere pure il wind chill devo studiarci un po' e aggiungerlo, ancora così viene scritto solo sul seriale ovvero non viene mandato sul display. Da confermare che la velocità del vento sia effettiva, ovvero ci vuole un campione di anemometro che gli si manda la stessa raffica del vento tipo con un phon, e confrontarlo poi con il tx20, però non so dove trovarlo...

Codice: [Nascondi]
  1. //void setup(); 
  2. //void loop(); 
  3. //int collectdata(void); 
  4. //void showdatasimple(); 
  5.  
  6. int dataPin = 4; 
  7. int bitLength = -1; 
  8. int data[45]; 
  9. int gooddata = 1; 
  10. int timeout; 
  11. int loops = 0; 
  12. int spd[8]; 
  13. int i = 0; 
  14. int j = 0; 
  15. char windDirection[16][4] = { 
  16. "N","NNE","NE", "ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"}; 
  17.  
  18. void setup() { 
  19. Serial.begin(9600); 
  20. Serial.print("\n\nInitializing...\n"); 
  21. // Serial.print("Data Pin: "); 
  22. // Serial.println(digitalRead(dataPin)); 
  23. pinMode(dataPin, INPUT); 
  24.  
  25. //void delay2(unsigned long ms){ 
  26. // unsigned long start = micros(); 
  27. // while (micros() - start <= ms); 
  28. //} 
  29.  
  30. void loop() { 
  31. Serial.println("Start"); 
  32. gooddata = 1; 
  33. collectData(); 
  34. if (gooddata == 1) { 
  35. rawdump(); 
  36. outputResults(); 
  37. TheData(); 
  38. else { 
  39. Serial.println ("READ ERROR"); 
  40. Serial.println(++loops); 
  41. Serial.println(); 
  42. delay(1500); 
  43.  
  44. int collectData(void) { 
  45. if (bitLength <0){ 
  46. bitLength = 1220;//getbitlenght2(); 
  47.  
  48.  
  49. pinMode(dataPin, OUTPUT); 
  50.  
  51. digitalWrite(dataPin, HIGH); 
  52. delay(100); 
  53. digitalWrite(dataPin, LOW ); 
  54. delay(500); 
  55. pinMode(dataPin, INPUT); 
  56.  
  57.  
  58. while(digitalRead(dataPin) == LOW){ 
  59. }  
  60. //wait slave start signal 
  61. while(digitalRead(dataPin) == HIGH){ 
  62. while(digitalRead(dataPin) == LOW){ 
  63.  
  64.  
  65.  
  66.  
  67. for (int i=0 ; i<42 ; i++) { 
  68. data[i] = (digitalRead(dataPin) == LOW)? 0:1; // read and save either a 0 or 1 
  69. delayMicroseconds(bitLength); 
  70.  
  71. int TheData() { 
  72. Serial.println("TheData"); 
  73. int i, idx = 0, idy = 0; 
  74. // for (i=8; i>4; i--) { dato originale 
  75. for (i=6; i>2; i--) { // dato modificato 
  76. idx = idx *2 + data[i]; 
  77.  
  78. // Serial.print("idx: "); 
  79. // Serial.println(idx, DEC); 
  80. Serial.print("Wind: "); 
  81. Serial.println(windDirection[idx] ); 
  82.  
  83. // for (i=17; i>8; i--) { dato originale per velocità 
  84. for (i=15; i>6; i--) { // dato modificato 
  85. idy = idy * 2 + data[i]; 
  86.  
  87. Serial.print("Speed: "); 
  88. Serial.print(idy, DEC); 
  89. Serial.println (" m/s read"); 
  90.  
  91. float idz = idy/10.0; 
  92. Serial.print("Speed: "); 
  93. Serial.print(idz); 
  94. Serial.println (" m/s real"); 
  95.  
  96. float KMH = idz * 3.6; 
  97. Serial.print("Speed: "); 
  98. Serial.print(KMH); 
  99. Serial.println (" kmh"); 
  100.  
  101. float MPH = KMH * 0.621371192; 
  102. Serial.print("Speed: "); 
  103. Serial.print(MPH); 
  104. Serial.println (" mph"); 
  105. /* 
  106. float wc, dp; 
  107. wc = windchill((float) temperature / 100, (float) Wind * 0.36); 
  108. dp = dewpoint((float)temperature / 100, (float) humidity); 
  109. */ 
  110.  
  111.  
  112. void rawdump() { 
  113. Serial.print("Raw: "); 
  114. for (int i=0 ; i<41 ; i++) { 
  115. Serial.print (data[i]); 
  116. if (i == 4) { 
  117. Serial.print (" "); 
  118. if (i == 8) { 
  119. Serial.print (" "); 
  120. if (i == 17) { 
  121. Serial.print (" "); 
  122. if (i == 20) { 
  123. Serial.print (" "); 
  124. if (i == 24) { 
  125. Serial.print (" "); 
  126. if (i == 28) { 
  127. Serial.print (" "); 
  128. if (i == 37) { 
  129. Serial.print (" "); 
  130.  
  131. void outputResults() { 
  132. Serial.println(); 
  133.  
  134. int idx =0; 
  135. for (int i=8 ; i> 4 ; i--)  
  136. //for (int i=6 ; i> 2 ; i--) // dato modificato 
  137. idx = idx *2 + data[i]; // data[i] == 0/1.. see prev post. // 
  138.  
  139. Serial.print("idx: "); 
  140. Serial.println(idx, DEC); 
  141. Serial.print("Wind: "); 
  142. Serial.println(windDirection[idx] ); 
  143. // Serial.println(); 
  144.  
  145. Serial.print("Swapped: "); 
  146.  
  147. //HEAD 
  148. for (int i =0 ; i< 5 ; i++) 
  149. Serial.print(data[i]); // it contains 0 or 1 
  150.  
  151. Serial.print(" "); 
  152.  
  153. //WINDDIR 
  154. for (int i =8 ; i> 4 ; i--) 
  155. Serial.print(data[i]); 
  156. Serial.print(" "); 
  157.  
  158. //WIND SPEED 
  159. for (int i =17 ; i> 8 ; i--) 
  160. Serial.print(data[i]); 
  161.  
  162. Serial.print(" "); 
  163.  
  164. //WIND SPEED+3 
  165. for (int i =20 ; i> 17 ; i--) 
  166. Serial.print(data[i]); 
  167.  
  168. Serial.print(" "); 
  169.  
  170. /* 
  171. // Checksum 
  172. for (iCounter=0;iCounter<4;iCounter++) 
  173. checksum |= (TX23_DATA_GET_BIT << iCounter); 
  174. delayTargetuSec += bitLength; 
  175. TX23_DoDelay; 
  176.  
  177. //Calculate Checksum 
  178. unsigned int checksumCalc = 0; 
  179. checksumCalc += (winddir & 15); 
  180. checksumCalc += ((windspeed >> 8) & 15); 
  181. checksumCalc += ((windspeed >> 4) & 15); 
  182. checksumCalc += (windspeed & 15); 
  183. */ 
  184.  
  185. // Checksum 
  186. for (int i =24 ; i> 20 ; i--) 
  187. Serial.print(data[i]); 
  188.  
  189. Serial.print(" "); 
  190.  
  191. //WIND DIR NEGATEIVE 
  192. for (int i =28 ; i> 24 ; i--) 
  193. Serial.print(data[i]); 
  194.  
  195. Serial.print(" "); 
  196.  
  197. //WIND SPEED NEGATED 
  198. for (int i =37 ; i> 28 ; i--){ 
  199. Serial.print(data[i]); 
  200.  
  201. Serial.print(" "); 
  202.  
  203. //WIND SPEED NEGATED +3 
  204. for (int i =40 ; i> 37 ; i--){ 
  205. Serial.print(data[i]); 
  206. Serial.println(); 
  207. // Serial.println(); 
  208. // Serial.println(); 
  209.  


Ho stampato pure il circuito e forato ed è venuto così:
Devo ancora limarlo bene ecco perché i lati sono fatti in quel modo...
Basetta finita, piste top copper
img_0472

Piste botton copper
img_0473

Qui la carta lucida con cui ho stampato il circuito. (la carta lucida si ricava stampando il pcb, ovvero lo schema di cui sopra negli altri messaggi)
img_0474 img_0475

Serigrafia componenti e lista componenti:
img_0476 img_0477

P.S. Ho messo il code non sapevo come si faceva la scrool bar :D


As_Needed [ Lun 26 Ott, 2015 18:27 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Vi rivolgo una domanda ragazzi! Siccome ho deciso che quando finirò il tutto posizionerò arduino, circuito e il display dentro casa in cantina e poi i fili usciranno all'esterno con i sensori che andranno nello schermo solare e al palo. Allora mi chiedevo... per il barometro, il sensore di pressione, posso lasciarlo in cantina (non è sottoterra) sempre all'interno, magari mettendolo dentro una scatola stagna, per proteggerlo o devo per forza portarlo anch'esso sullo schermo a 2 metri d'altezza se no mi falsa la pressione? In più l'anemometro a che altezza va posizionato?
:bye:


andrea75 [ Lun 26 Ott, 2015 19:01 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
As_Needed ha scritto: [Visualizza Messaggio]
Vi rivolgo una domanda ragazzi! Siccome ho deciso che quando finirò il tutto posizionerò arduino, circuito e il display dentro casa in cantina e poi i fili usciranno all'esterno con i sensori che andranno nello schermo solare e al palo. Allora mi chiedevo... per il barometro, il sensore di pressione, posso lasciarlo in cantina (non è sottoterra) sempre all'interno, magari mettendolo dentro una scatola stagna, per proteggerlo o devo per forza portarlo anch'esso sullo schermo a 2 metri d'altezza se no mi falsa la pressione? In più l'anemometro a che altezza va posizionato?
:bye:


Nelle normali stazioni meteo il sensore sta nelle consolle, quindi all'interno. ;)


As_Needed [ Lun 26 Ott, 2015 19:38 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
andrea75 ha scritto: [Visualizza Messaggio]
As_Needed ha scritto: [Visualizza Messaggio]
Vi rivolgo una domanda ragazzi! Siccome ho deciso che quando finirò il tutto posizionerò arduino, circuito e il display dentro casa in cantina e poi i fili usciranno all'esterno con i sensori che andranno nello schermo solare e al palo. Allora mi chiedevo... per il barometro, il sensore di pressione, posso lasciarlo in cantina (non è sottoterra) sempre all'interno, magari mettendolo dentro una scatola stagna, per proteggerlo o devo per forza portarlo anch'esso sullo schermo a 2 metri d'altezza se no mi falsa la pressione? In più l'anemometro a che altezza va posizionato?
:bye:


Nelle normali stazioni meteo il sensore sta nelle consolle, quindi all'interno. ;)


Allora non ci sono problemi grazie ;)


As_Needed [ Gio 29 Ott, 2015 19:14 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Salve a tutti! Posto qui finalmente i primi risultati concreti, visualizzazione della temperatura e umidità sul display!
img_0485 img_0481 img_0480 img_0479

Adesso per prova ho fatto sulla bread board, poi tutto lo collegherò al circuito stampato. Non ho aggiunto l'anemometro perché a casa non avevo la resistenza giusta.
Qui il programma del DS18B20 più DHT22 con display:

Citazione:

// Display Test
// Test several Display Adafruit_GFX functions
// for 1.8" TFT LCD Color Display (SainSmart).
// Hans Luijten, Tweaking4All.com

// Init pins
#define sclk 13
#define mosi 11
#define cs   10
#define dc   9
#define rst  8  

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>

Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);
#include "DHT.h"
#include <OneWire.h>
#include <DallasTemperature.h>
 
// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 2
 
// Setup a oneWire instance to communicate with any OneWire devices 
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
 
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

DHT dht(7,DHT22); //Definisco il pin al quale è collegato il sensore e il tipo

void setup()
{
  tft.initR(INITR_BLACKTAB);
  Serial.begin(9600);
  //Serial.println("DHT test");
  dht.begin();
   // Start up the library
  sensors.begin();
    
}

void loop()
{
  sensors.requestTemperatures();
  float h = dht.readHumidity(); // Leggo il valore di umidità
  //float t = dht.readTemperature(); // Leggo il valore di temperatura
  //if (isnan(t) || isnan(h)) // Se almeno uno dei due valori è NaN (Not a Number)
  {
    //Serial.println("Impossibile leggere il sensore!");
  }
  //else //altrimenti
  {
    Serial.print("Temperatura ");
    Serial.println(sensors.getTempCByIndex(0));
    Serial.print("Umidita' ");
    Serial.print(h);
    Serial.print(" %\t");
   
  
   tft.fillScreen(ST7735_BLUE);
   tft.setCursor(0, 0);
  tft.setTextSize(1);
  tft.println("Temperatura");
  tft.setCursor(0, 15);
  tft.setTextSize(2);
  tft.print(sensors.getTempCByIndex(0));
  tft.print ( (char)248);
  tft.println("C");
//delay(5000);
  
  tft.setCursor (0,50);
  tft.setTextSize (2);
  tft.print ("Umidita'");
  tft.setCursor (0,70);
   tft.setTextSize (2);
  tft.print (dht.readHumidity());
  
  tft.print ("%\t");
 
  //delay(1000);
    
    //Serial.print("Temperatura: ");
    //Serial.print(t);
    //Serial.println(" *C");
    // non è necessario mettere un delay() perchè ci vogliono due secondi per leggere i valori, quindi il serial monitor riceverà dati ogni 2 secondi.
  }
}



IL DS18B20 è fantastico, mi dà il valore della temperatura in meno di un secondo! Più veloce di qualsiasi stazione meteo penso :D


andrea75 [ Gio 29 Ott, 2015 20:59 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Fantastico!!!! :inchino: :inchino:


Fili [ Gio 29 Ott, 2015 21:05 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
:eek: per me è totalmente arabo...complimenti davvero! :inchino:


As_Needed [ Gio 29 Ott, 2015 21:20 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Grazie mille!! :)
Posteró i prossimi sviluppi! :ok:


enniometeo [ Gio 29 Ott, 2015 21:41 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Bravissimo Eugenio! :inchino:


Gab78 [ Gio 29 Ott, 2015 22:07 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Lavoro grandioso! :wohow: :inchino:


As_Needed [ Gio 29 Ott, 2015 22:14 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Non posso che dire grazie!!!
Ci ho lavorato duro tutto il pomeriggio, domani se tutto va bene aggiungeró nel display anche velocità del vento e direzione, il sensore di pressione sarà l ultimo ad arrivare ;) Nel display credo metteró solo le condizioni attuali perché non c é posto, successivamente proveró ad aggiungere anche massime e minime nel seriale e chissà in un sito... :roll:


As_Needed [ Ven 30 Ott, 2015 17:27 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Allora, alla fine ecco i risultati finali su basetta! Appena terminati ;)
img_0487 img_0488 img_0490 img_0491
Per chi non conoscesse il seriale che ho nominato nei post precedenti è questo:
immagine_1446222162_777184

Questo il lungo programma che permette di misurare la temperatura con il DS18B20, l'umidità con il DHT22 e vento con il TX20 della LaCrosse e visualizzare il tutto su un display lcd tft.
Citazione:

// Display Test
// Test several Display Adafruit_GFX functions
// for 1.8" TFT LCD Color Display (SainSmart).
// Hans Luijten, Tweaking4All.com

// Init pins
#define sclk 13
#define mosi 11
#define cs   10
#define dc   9
#define rst  8  

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>

Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);
#include "DHT.h"
#include <OneWire.h>
#include <DallasTemperature.h>
 
// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 2
 
// Setup a oneWire instance to communicate with any OneWire devices 
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
 
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

DHT dht(7,DHT22); //Definisco il pin al quale è collegato il sensore e il tipo

//void setup();
//void loop();
//int collectdata(void);
//void showdatasimple();

int dataPin = 4;
int bitLength = -1;
int data[45];
int gooddata = 1;
int timeout;
int loops = 0;
int spd[8];
int i = 0;
int j = 0;
char windDirection[16][4] = {
  "N","NNE","NE", "ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"};
  

void setup() {
  tft.initR(INITR_BLACKTAB);
  Serial.begin(9600);
   //Serial.println("DHT test");
  dht.begin();
   // Start up the library
  sensors.begin();
  Serial.print("\n\nInitializing...\n");
  // Serial.print("Data Pin: ");
  // Serial.println(digitalRead(dataPin));
    pinMode(dataPin, INPUT);
}

//void delay2(unsigned long ms){
// unsigned long start = micros();
// while (micros() - start <= ms);
//}

void loop() {
  sensors.requestTemperatures();
  float h = dht.readHumidity(); // Leggo il valore di umidità
  //float t = dht.readTemperature(); // Leggo il valore di temperatura
  //if (isnan(t) || isnan(h)) // Se almeno uno dei due valori è NaN (Not a Number)
  
    //Serial.println("Impossibile leggere il sensore!");
  
  //else //altrimenti
  
    Serial.print("Temperatura ");
    Serial.println(sensors.getTempCByIndex(0));
    Serial.print("Umidita' ");
    Serial.print(h);
    Serial.print(" %\t");

   
   
 //delay(1000);
    
    //Serial.print("Temperatura: ");
    //Serial.print(t);
    //Serial.println(" *C");
    // non è necessario mettere un delay() perchè ci vogliono due secondi per leggere i valori, quindi il serial monitor riceverà dati ogni 2 secondi.
   
  Serial.println("Start");
  gooddata = 1;
  collectData();
  if (gooddata == 1) {
    rawdump();
    outputResults();
    TheData();
  }
  else {
    Serial.println ("READ ERROR");
  }
  Serial.println(++loops);
  Serial.println();
 delay(1500);
}

int collectData(void) {
   if (bitLength <0){
     bitLength = 1220;//getbitlenght2();

  }
 
 pinMode(dataPin, OUTPUT);

 digitalWrite(dataPin, HIGH);
 delay(100);
 digitalWrite(dataPin, LOW );
 delay(500);
 pinMode(dataPin, INPUT);


 while(digitalRead(dataPin) == LOW){
 }  
 //wait slave start signal
 while(digitalRead(dataPin) == HIGH){
 }
 while(digitalRead(dataPin) == LOW){
 }
 


 
  for (int i=0 ; i<42 ; i++) {
    data[i] = (digitalRead(dataPin) == LOW)? 0:1; // read and save either a 0 or 1
    delayMicroseconds(bitLength);
  }
}

int TheData() {
  Serial.println("TheData");
  int i, idx = 0, idy = 0;
 // for (i=8; i>4; i--) { dato originale
    for (i=6; i>2; i--) { // dato modificato
    idx = idx *2 + data[i];
  }

  // Serial.print("idx: ");
  // Serial.println(idx, DEC);
  Serial.print("Wind: ");
  Serial.println(windDirection[idx] );

 // for (i=17; i>8; i--) { dato originale per velocità
    for (i=15; i>6; i--) { // dato modificato
    idy = idy * 2 + data[i];
  }

  Serial.print("Speed: ");
  Serial.print(idy, DEC);
  Serial.println (" m/s read");

  float idz = idy/10.0;
  Serial.print("Speed: ");
  Serial.print(idz);
  Serial.println (" m/s real");

  float KMH = idz * 3.6;
  Serial.print("Speed: ");
  Serial.print(KMH);
  Serial.println (" kmh");

  float MPH = KMH * 0.621371192;
  Serial.print("Speed: ");
  Serial.print(MPH);
  Serial.println (" mph");
 
  tft.fillScreen(ST7735_BLUE);
   tft.setCursor(0, 0);
  tft.setTextSize(1);
  tft.println("Temperatura");
  tft.setCursor(0, 10);
  tft.setTextSize(2);
  tft.print(sensors.getTempCByIndex(0));
  tft.print ( (char)248);
  tft.println("C");
//delay(5000);
  
  tft.setCursor (0,30);
  tft.setTextSize (1);
  tft.print ("Umidita'");
  tft.setCursor (0,40);
   tft.setTextSize (2);
  tft.print (dht.readHumidity());
  
  tft.print ("%\t");
 tft.setCursor (0,60);
  tft.setTextSize (1);
  tft.println ("Vento");
  tft.setCursor (0,70);
  tft.setTextSize (2);
tft.print (KMH);
tft.print ("Km/h");
tft.setCursor (0,90);
tft.setTextSize (2);
tft.print (windDirection[idx]);
  
  /*
float wc, dp;
   wc = windchill((float) temperature / 100, (float) Wind * 0.36);
   dp = dewpoint((float)temperature / 100, (float) humidity);
   */
}


void rawdump() {
  Serial.print("Raw: ");
  for (int i=0 ; i<41 ; i++) {
    Serial.print (data[i]);
    if (i == 4) {
      Serial.print (" ");
    }
    if (i == 8) {
      Serial.print (" ");
    }
    if (i == 17) {
      Serial.print (" ");
    }
    if (i == 20) {
      Serial.print (" ");
    }
    if (i == 24) {
      Serial.print (" ");
    }
    if (i == 28) {
      Serial.print (" ");
    }
    if (i == 37) {
      Serial.print (" ");
    }
  }
}

void outputResults() {
  Serial.println();

  int idx =0;
  for (int i=8 ; i> 4 ; i--)
  //for (int i=6 ; i> 2 ; i--) // dato modificato
  {
    idx = idx *2 + data[i];  // data[i] == 0/1.. see prev post. //
  }

  Serial.print("idx: ");
  Serial.println(idx, DEC);
  Serial.print("Wind: ");
  Serial.println(windDirection[idx] );
  // Serial.println();

  Serial.print("Swapped: ");

  //HEAD
  for (int i =0 ; i< 5 ; i++)
  {
    Serial.print(data[i]); // it contains 0 or 1
  }

  Serial.print(" ");

  //WINDDIR
  for (int i =8 ; i> 4 ; i--)
  {
    Serial.print(data[i]);
  }
  Serial.print(" ");

  //WIND SPEED
  for (int i =17 ; i> 8 ; i--)
  {
    Serial.print(data[i]);
  }

  Serial.print(" ");

  //WIND SPEED+3
  for (int i =20 ; i> 17 ; i--)
  {
    Serial.print(data[i]);
  }

  Serial.print(" ");

  /*
  // Checksum
   for (iCounter=0;iCounter<4;iCounter++)
   {
   checksum |= (TX23_DATA_GET_BIT << iCounter);
   delayTargetuSec += bitLength;
   TX23_DoDelay;
   }

   //Calculate Checksum
   unsigned int checksumCalc = 0;
   checksumCalc += (winddir & 15);
   checksumCalc += ((windspeed >> 8) & 15);
   checksumCalc += ((windspeed >> 4) & 15);
   checksumCalc += (windspeed & 15);
   */

  // Checksum
  for (int i =24 ; i> 20 ; i--)
  {
    Serial.print(data[i]);
  }

  Serial.print(" ");

  //WIND DIR NEGATEIVE
  for (int i =28 ; i> 24 ; i--)
  {
    Serial.print(data[i]);
  }

  [b]Serial[/b].print(" ");

  //WIND SPEED NEGATED
  for (int i =37 ; i> 28 ; i--){
    [b]Serial[/b].print(data[i]);
  }

  [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]" "[/color]);

  [color=#7E7E7E]//WIND SPEED NEGATED +3[/color]
  [color=#CC6600]for[/color] ([color=#CC6600]int[/color] i =40 ; i> 37 ; i--){
    [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color](data[i]);
  }
  [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color]();
  [color=#7E7E7E]// Serial.println();[/color]
  [color=#7E7E7E]// Serial.println();[/color]


  
}



Manca solo di aggiungere il sensore di pressione al programma, e lo farò per ultimo. ;) Adesso devo concentrarmi solo al montaggio dei componenti sul circuito stampato!

P.S. siccome il programma è lungo ci vogliono un paio di secondi a sapere tutti i dati i tempo reale, comunque pochissimo! ;)
:bye:


andrea75 [ Ven 30 Ott, 2015 19:35 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Sto topic sono sicuro farà furore una volta terminato il progetto.... 8))


As_Needed [ Ven 30 Ott, 2015 20:49 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
andrea75 ha scritto: [Visualizza Messaggio]
Sto topic sono sicuro farà furore una volta terminato il progetto.... 8))


Lo spero, condivido per questo 8)) almeno posso essere d aiuto!


As_Needed [ Sab 31 Ott, 2015 13:35 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Ho aggiunto pure il dewPoint, tramite un'equazione inserita nel programma ;) Ho indicato dove metterò il valore della pressione pure. Per causa delle dimensioni del display non metterò né indice di calore né wind chill e nemmeno le massime e le minime, se a progetto finito riuscirò a fare un server allora ci penserò a dovere.
img_0492


Gab78 [ Sab 31 Ott, 2015 14:37 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Chapeau...! :inchino:


Frasnow [ Sab 31 Ott, 2015 14:39 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Complimenti!!! :inchino: :inchino:


As_Needed [ Sab 31 Ott, 2015 17:29 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Grazie ancora! Comunque vorrei specificare che purtroppo non posso inserirci anche un datalogger, usando una semplice sd, perché se no dovrei rifare tutto il circuito stampato e non credo possa rifarlo... In ogni caso per le massime e minime ci vuole un RTC, che serve come orologio, se no arduino non sa che giorno è e che ora è! Quello non ha bisogno di resistenze e niente e forse posso inserirlo nel circuito stampato, devo chiedere se si può fare... Speriamo perché mi dispiacerebbe se magari riuscissi a mettere tutto online non sapere né massime né minime.
:bye:


Gab78 [ Dom 01 Nov, 2015 10:27 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Bene bene, se dovessi avere problemi con la Davis, (scrat... scrat... :mrgreen: ) so già a chi potrei rivolgermi... :wohow:


Adriatic92 [ Dom 01 Nov, 2015 10:30 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Eugenio sei una bestia :mrgreen: , complimenti davvero !! :inchino: :ok:


As_Needed [ Dom 01 Nov, 2015 12:33 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
:lol: 8)) Comunque vi rivolgo una domanda ai più esperti. Siccome me ne sono fregato che si legge piccolo sul display e ho voluto aggiungere tutti i valori che riesco a inserire, ho aggiunto pure il wind chill, che però ho visto che la sua equazione è applicabile solo con valori inferiori a 10 gradi e superiori a 4.8km/h... Fin qui ci siamo, ho messo un if che per valori non in quel modo il wind chill è uguale alla temperatura. Però per l'indice di calore ho usato questa equazione
http://www.centrometeo.com/articoli...e-heat-index-hi

Qui ho scoperto che è applicabile in modo veritiero solo per valori sopra 26.7... Conoscete quella con il dew point che penso sia applicabile anche con tutti i valori?
:bye:

Foto
img_0493

EDIT: Adesso sì che c'è spazio ;)
img_0494

Con questa disposizione posso metterci anche volendo l'indice THW, UMIDEX e temperatura interna utilizzando il sensore di pressione e ovviamente anche la pressione.

Se riesco a mettere il RTC lascio perdere il THW etc e metto le massime e le minime sul display stesso 8))


andrea75 [ Dom 01 Nov, 2015 13:18 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Se vuoi ti do quella che uso per la rete... considera che però è una funzione in PHP. Dovrai poi riconvertirla. ;)


As_Needed [ Dom 01 Nov, 2015 13:43 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
andrea75 ha scritto: [Visualizza Messaggio]
Se vuoi ti do quella che uso per la rete... considera che però è una funzione in PHP. Dovrai poi riconvertirla. ;)


Va bene ci provo ;) Quella del windchill pare che va bene, anche se però vedo sulla stazione di pigi che anche con valori sopra 10 gradi il wind chill non è identico alla temperatura, quindi se hai anche quella mi farebbe piacere ;)
Il dew point invece quello che ho è perfetto l'ho confrontato ovunque ed è precisissimo 8))


andrea75 [ Dom 01 Nov, 2015 15:15 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
As_Needed ha scritto: [Visualizza Messaggio]
andrea75 ha scritto: [Visualizza Messaggio]
Se vuoi ti do quella che uso per la rete... considera che però è una funzione in PHP. Dovrai poi riconvertirla. ;)


Va bene ci provo ;) Quella del windchill pare che va bene, anche se però vedo sulla stazione di pigi che anche con valori sopra 10 gradi il wind chill non è identico alla temperatura, quindi se hai anche quella mi farebbe piacere ;)
Il dew point invece quello che ho è perfetto l'ho confrontato ovunque ed è precisissimo 8))


Allora, te l'ho un po' semplificata, perché in quella "ufficiale" ci sono più variabili. Cmq dovrebbe andare lo stesso:

Codice: [Nascondi]
  1. $var1 = (7.5*temp)/(237.7+temp) // temp in °C
  2. $var2 = 6.11*Pow(10,$var1) // cioè 10 elevato al valore di $var1
  3. $var3 = (umid*$var2)/100 // umidità senza % (ad es: 75)
  4. $var4 = log($var3/6.11) // cioè logaritmo in base e del valore di ($var3/6.11)
  5. $dewp = $var4*237.7/(7.5*log(10)-$var4) // risultato finale in °C


Le tue variabili in ingresso sono ovviamente "temp" e "umid".



Quella del windchill che uso è questa, con gli <if> del range di temperatura e vento già inclusi
Codice: [Nascondi]
  1. if (($temp<10)&&($wind>4.6))
  2. {
  3. $windc=13.12+0.6215*$temp-11.37*pow($wind,0.16)+0.3965*$temp*pow($wind,0.16);
  4. }
  5.  


As_Needed [ Dom 01 Nov, 2015 15:22 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
andrea75 ha scritto: [Visualizza Messaggio]
As_Needed ha scritto: [Visualizza Messaggio]
andrea75 ha scritto: [Visualizza Messaggio]
Se vuoi ti do quella che uso per la rete... considera che però è una funzione in PHP. Dovrai poi riconvertirla. ;)


Va bene ci provo ;) Quella del windchill pare che va bene, anche se però vedo sulla stazione di pigi che anche con valori sopra 10 gradi il wind chill non è identico alla temperatura, quindi se hai anche quella mi farebbe piacere ;)
Il dew point invece quello che ho è perfetto l'ho confrontato ovunque ed è precisissimo 8))


Allora, te l'ho un po' semplificata, perché in quella "ufficiale" ci sono più variabili. Cmq dovrebbe andare lo stesso:

Codice: [Nascondi]
  1. $var1 = (7.5*temp)/(237.7+temp) // temp in °C
  2. $var2 = 6.11*Pow(10,$var1) // cioè 10 elevato al valore di $var1
  3. $var3 = (umid*$var2)/100 // umidità senza % (ad es: 75)
  4. $var4 = log($var3/6.11) // cioè logaritmo in base e del valore di ($var3/6.11)
  5. $dewp = $var4*237.7/(7.5*log(10)-$var4) // risultato finale in °C


Le tue variabili in ingresso sono ovviamente "temp" e "umid".



Quella del windchill che uso è questa, con gli <if> del range di temperatura e vento già inclusi
Codice: [Nascondi]
  1. if (($temp<10)&&($wind>4.6))
  2. {
  3. $windc=13.12+0.6215*$temp-11.37*pow($wind,0.16)+0.3965*$temp*pow($wind,0.16);
  4. }
  5.  


Allora quella del wind chill praticamente è identica:
Codice: [Nascondi]
  1. windchill=(13.12+0.6215*sensors.getTempCByIndex(0))-(11.37*pow(KMH,0.16))+(0.3965*sensors.getTempCByIndex(0)*pow(KMH,0.16)); 
  2. if ((windchill<sensors.getTempCByIndex(0))&&(KMH>4.6)) 
  3. windchill=(13.12+0.6215*sensors.getTempCByIndex(0))-(11.37*pow(KMH,0.16))+(0.3965*sensors.getTempCByIndex(0)*pow(KMH,0.16)); 
  4. else 
  5. windchill=sensors.getTempCByIndex(0); 
  6.  
  7.  


solo che ho messo per farla più precisa che se il wind chill diventa meno della temperatura allora esegue la formula, per non perdersi niente, mentre invece se è sopra alla temperatura allora il wind chill diventa uguale alla temperatura.

Per l'heat index non ho ben capito, devo calcolare tutte le variabili e poi con quelle si trova l'indice?

Comunque il dew point con linguaggio C il l'ho messo così è quello come ho detto è precisissimo, l'unico che non riesco a capire come fare è l'heat index...

Codice: [Nascondi]
  1. dewPoint = (pow (h/100,0.125)*(112+(0.9*sensors.getTempCByIndex(0)))+0.1*sensors.getTempCByIndex(0)-112); 
  2.  
  3.  


andrea75 [ Dom 01 Nov, 2015 16:09 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Questo è l'heat hindex, dove $temp è la temperatura e $ur l'umidità relativa.

Codice: [Nascondi]
  1. if (($temp >= 27)&&($ur >= 40))
  2. {
  3. $Tf = $temp*(9/5) + 32;
  4. $t2 = $Tf*$Tf;
  5. $u2 = $ur*$ur;
  6. $HIf = -42.379 + (2.04901523*$Tf) + (10.14333127*$ur) - (0.22475541*$Tf*$ur) - (6.83783e-3*$t2) - (5.481717e-2*$u2) + (1.22874e-3*$t2*$ur) + (8.5282e-4*$Tf*$u2) - (1.99e-6*$t2*$u2);
  7. $hi = (5/9) * ($HIf - 32);
  8. $hi = number_format($hi,1,'.','');
  9. }
  10. else
  11. {
  12. $hi = $temp;
  13. }
  14.  


As_Needed [ Dom 01 Nov, 2015 16:41 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
andrea75 ha scritto: [Visualizza Messaggio]
Questo è l'heat hindex, dove $temp è la temperatura e $ur l'umidità relativa.

Codice: [Nascondi]
  1. if (($temp >= 27)&&($ur >= 40))
  2. {
  3. $Tf = $temp*(9/5) + 32;
  4. $t2 = $Tf*$Tf;
  5. $u2 = $ur*$ur;
  6. $HIf = -42.379 + (2.04901523*$Tf) + (10.14333127*$ur) - (0.22475541*$Tf*$ur) - (6.83783e-3*$t2) - (5.481717e-2*$u2) + (1.22874e-3*$t2*$ur) + (8.5282e-4*$Tf*$u2) - (1.99e-6*$t2*$u2);
  7. $hi = (5/9) * ($HIf - 32);
  8. $hi = number_format($hi,1,'.','');
  9. }
  10. else
  11. {
  12. $hi = $temp;
  13. }
  14.  


Ah ecco hai inserito l'if visto che vale solo per un certo valore, anche io adesso l'ho messo, però siccome ho visto che sulla stazione di pigi l'indice di calore varia anche sotto quella temperatura, mi chiedevo se esisteva un'altra equazione, in ogni caso adesso lascio questa. ;)


andrea75 [ Dom 01 Nov, 2015 16:55 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Ce ne sono diversi di indici di calore, e ognuno usa formule diverse... purtroppo manca un indice di riferimento comune. ;)


As_Needed [ Dom 01 Nov, 2015 17:00 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Ho trovato che la davis utilizza uno strano metodo di calcolo rispetto al normale ecco perché varia :roll:
http://forum.meteonetwork.it/stazio...ice-calore.html
http://forum.meteonetwork.it/strume...heat-index.html

mha mi tengo questa dei 27 gradi intanto a che serve sotto l'indice di calore :D

pubblico qui per arduino le formule ;)
DEW POINT
Codice: [Nascondi]
  1. dewPoint = (pow (h/100,0.125)*(112+(0.9*sensors.getTempCByIndex(0)))+0.1*sensors.getTempCByIndex(0)-112); 
  2.  
  3.  


h è l'umidità e sensor etc è la temperatura

WIND CHILL
Codice: [Nascondi]
  1. windchill=(13.12+0.6215*sensors.getTempCByIndex(0))-(11.37*pow(KMH,0.16))+(0.3965*sensors.getTempCByIndex(0)*pow(KMH,0.16)); 
  2. if ((windchill<sensors.getTempCByIndex(0))&&(KMH>4.6)) 
  3. windchill=(13.12+0.6215*sensors.getTempCByIndex(0))-(11.37*pow(KMH,0.16))+(0.3965*sensors.getTempCByIndex(0)*pow(KMH,0.16)); 
  4. else 
  5. windchill=sensors.getTempCByIndex(0); 
  6.  


sensor ect è la temperatura e KMH la velocità del vento in km/h
ho messo all'inizio l'if diverso in modo tale che così non si perda niente del wind chill, se no magari siccome sono 12 gradi segna sempre 12 anche se c'è un vento di 50 km/h

HEAT INDEX
Codice: [Nascondi]
  1.  
  2. temperaturaf=sensors.getTempCByIndex(0)*1.8+32; 
  3.  
  4. if ((sensors.getTempCByIndex(0)>=26.7)&&(h>=40)) 
  5. {  
  6. heatindexf=(-42.379+2.04901523*temperaturaf+10.14333127*h-0.22475541*temperaturaf*h-0.00683783*pow(temperaturaf,2)-0.05481717*pow(h,2)+0.00122874*pow(temperaturaf,2)*h+0.00085282*temperaturaf*pow(h,2)-0.00000199*pow(temperaturaf,2)*pow(h,2)); 
  7. heatindexc= (heatindexf-32)/1.8; 
  8. else 
  9. {  
  10. heatindexc=sensors.getTempCByIndex(0); 
  11.  


Uguale a quella di Andrea ;)
:bye:

Piccolo aggiornamento di dove vedrò la pressione
img_0496


As_Needed [ Ven 06 Nov, 2015 16:58 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Finalmente ho finito il programma!! Successivamente lavorerò per le minime e massime, adesso veramente devo solo montare il tutto. ;)

Questo il programma completo (ho migliorato anche la grafica :D Ho messo 4 if che a seconda di quanto è la temperatura esterna, il colore del valore della temperatura cambia)
Codice: [Nascondi]
  1. #include <Wire.h> 
  2. #include <BMP180.h> 
  3. #include <SPI.h> 
  4. #include <Adafruit_GFX.h> 
  5. #define sclk 13 
  6. #define mosi 11 
  7. #define cs 10 
  8. #define dc 9 
  9. #define rst 8  
  10. #include <Adafruit_GFX.h> // Core graphics library 
  11. #include <Adafruit_ST7735.h> // Hardware-specific library 
  12. #include <SPI.h> 
  13. Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst); 
  14. #include "DHT.h" 
  15. #include <OneWire.h> 
  16. #include <DallasTemperature.h> 
  17. // Data wire is plugged into pin 2 on the Arduino 
  18. #define ONE_WIRE_BUS 2 
  19. // Setup a oneWire instance to communicate with any OneWire devices  
  20. // (not just Maxim/Dallas temperature ICs) 
  21. OneWire oneWire(ONE_WIRE_BUS); 
  22. // Pass our oneWire reference to Dallas Temperature. 
  23. DallasTemperature sensors(&oneWire); 
  24. DHT dht(3,DHT22); //Definisco il pin al quale è collegato il sensore e il tipo 
  25. float dewPoint; 
  26. float windchill; 
  27. float temperaturaf; 
  28. float heatindexf; 
  29. float heatindexc; 
  30. float pressionelivellodelmarehPa; 
  31. float pressionelivellodelmare; 
  32. int dataPin = 4; 
  33. int bitLength = -1; 
  34. int data[45]; 
  35. int gooddata = 1; 
  36. int timeout; 
  37. int loops = 0; 
  38. int spd[8]; 
  39. int i = 0; 
  40. int j = 0; 
  41. char windDirection[16][4] = { 
  42. "N","NNE","NE", "ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"}; 
  43. // Store an instance of the BMP180 sensor. 
  44. BMP180 barometer; 
  45. // Store the current sea level pressure at your location in Pascals. 
  46. float seaLevelPressure = 102500;  
  47.  
  48. void setup() { 
  49. tft.initR(INITR_BLACKTAB); 
  50. Serial.begin(9600); 
  51. //Serial.println("DHT test"); 
  52. dht.begin(); 
  53. // Start up the library 
  54. sensors.begin(); 
  55. Serial.print("\n\nInitializing...\n"); 
  56. // Serial.print("Data Pin: "); 
  57. // Serial.println(digitalRead(dataPin)); 
  58. pinMode(dataPin, INPUT); 
  59. // We start the I2C on the Arduino for communication with the BMP180 sensor. 
  60. Wire.begin(); 
  61. // We create an instance of our BMP180 sensor. 
  62. barometer = BMP180(); 
  63. // We check to see if we can connect to the sensor. 
  64. if(barometer.EnsureConnected()) 
  65. Serial.println("Connected to BMP180."); // Output we are connected to the computer. 
  66. // When we have connected, we reset the device to ensure a clean start. 
  67. barometer.SoftReset(); 
  68. // Now we initialize the sensor and pull the calibration data. 
  69. barometer.Initialize(); 
  70. else 
  71. {  
  72. Serial.println("No sensor found."); 
  73.  
  74.  
  75. //void delay2(unsigned long ms){ 
  76. // unsigned long start = micros(); 
  77. // while (micros() - start <= ms); 
  78. //} 
  79.  
  80. void loop() { 
  81. sensors.requestTemperatures(); 
  82. pressionelivellodelmare=barometer.GetPressure()+5473; 
  83. pressionelivellodelmarehPa=pressionelivellodelmare/100; 
  84. float h = dht.readHumidity(); // Leggo il valore di umidità 
  85. //float t = dht.readTemperature(); // Leggo il valore di temperatura 
  86. //if (isnan(t) || isnan(h)) // Se almeno uno dei due valori è NaN (Not a Number) 
  87.  
  88. //Serial.println("Impossibile leggere il sensore!"); 
  89.  
  90. //else //altrimenti 
  91. if(barometer.IsConnected) 
  92. // Retrive the current pressure in Pascals. 
  93. long currentPressureP = barometer.GetPressure(); 
  94. float currentPressuremb = currentPressureP/100.0; 
  95. float currentPressureinHg = currentPressuremb*0.02953; 
  96.  
  97.  
  98. // Retrive the current altitude (in meters). Current Sea Level Pressure is required for this. 
  99. float altitudem = barometer.GetAltitude(seaLevelPressure); 
  100. float altitudeft = altitudem*3.2808; 
  101.  
  102.  
  103. // Retrive the current temperature in degrees celcius. 
  104. float currentTemperatureC = barometer.GetTemperature(); 
  105. float currentTemperatureF = (9.0/5.0)*currentTemperatureC+32.0; 
  106. Serial.print("Temperatura "); 
  107. Serial.println(sensors.getTempCByIndex(0)); 
  108. Serial.print("Umidita' "); 
  109. Serial.print(h); 
  110. Serial.print(" %\t"); 
  111.  
  112. Serial.println ("Dew Point"); 
  113. Serial.print (dewPoint); 
  114. Serial.println ("C"); 
  115. //Serial.println ("Wind Chill"); 
  116. //Serial.print (windchillc); 
  117. //Serial.print ("C"); 
  118.  
  119. dewPoint = (pow (h/100,0.125)*(112+(0.9*sensors.getTempCByIndex(0)))+0.1*sensors.getTempCByIndex(0)-112); 
  120. temperaturaf=sensors.getTempCByIndex(0)*1.8+32; 
  121.  
  122. if ((sensors.getTempCByIndex(0)>=26.7)&&(h>=40)) 
  123. {  
  124. heatindexf=(-42.379+2.04901523*temperaturaf+10.14333127*h-0.22475541*temperaturaf*h-0.00683783*pow(temperaturaf,2)-0.05481717*pow(h,2)+0.00122874*pow(temperaturaf,2)*h+0.00085282*temperaturaf*pow(h,2)-0.00000199*pow(temperaturaf,2)*pow(h,2)); 
  125. heatindexc= (heatindexf-32)/1.8; 
  126. else 
  127. {  
  128. heatindexc=sensors.getTempCByIndex(0); 
  129. //delay(1000); 
  130.  
  131. //Serial.print("Temperatura: "); 
  132. //Serial.print(t); 
  133. //Serial.println(" *C"); 
  134. // non è necessario mettere un delay() perchè ci vogliono due secondi per leggere i valori, quindi il serial monitor riceverà dati ogni 2 secondi. 
  135.  
  136. Serial.println("Start"); 
  137. gooddata = 1; 
  138. collectData(); 
  139. if (gooddata == 1) { 
  140. rawdump(); 
  141. outputResults(); 
  142. TheData(); 
  143. else { 
  144. Serial.println ("READ ERROR"); 
  145. Serial.println(++loops); 
  146. Serial.println(); 
  147. delay(1500); 
  148.  
  149. int collectData(void) { 
  150. if (bitLength <0){ 
  151. bitLength = 1220;//getbitlenght2(); 
  152.  
  153.  
  154. pinMode(dataPin, OUTPUT); 
  155.  
  156. digitalWrite(dataPin, HIGH); 
  157. delay(100); 
  158. digitalWrite(dataPin, LOW ); 
  159. delay(500); 
  160. pinMode(dataPin, INPUT); 
  161.  
  162.  
  163. while(digitalRead(dataPin) == LOW){ 
  164. }  
  165. //wait slave start signal 
  166. while(digitalRead(dataPin) == HIGH){ 
  167. while(digitalRead(dataPin) == LOW){ 
  168.  
  169.  
  170.  
  171.  
  172. for (int i=0 ; i<42 ; i++) { 
  173. data[i] = (digitalRead(dataPin) == LOW)? 0:1; // read and save either a 0 or 1 
  174. delayMicroseconds(bitLength); 
  175.  
  176. int TheData() { 
  177. Serial.println("TheData"); 
  178. int i, idx = 0, idy = 0; 
  179. // for (i=8; i>4; i--) { dato originale 
  180. for (i=6; i>2; i--) { // dato modificato 
  181. idx = idx *2 + data[i]; 
  182.  
  183. // Serial.print("idx: "); 
  184. // Serial.println(idx, DEC); 
  185. Serial.print("Wind: "); 
  186. Serial.println(windDirection[idx] ); 
  187.  
  188. // for (i=17; i>8; i--) { dato originale per velocità 
  189. for (i=15; i>6; i--) { // dato modificato 
  190. idy = idy * 2 + data[i]; 
  191.  
  192. Serial.print("Speed: "); 
  193. Serial.print(idy, DEC); 
  194. Serial.println (" m/s read"); 
  195.  
  196. float idz = idy/10.0; 
  197. Serial.print("Speed: "); 
  198. Serial.print(idz); 
  199. Serial.println (" m/s real"); 
  200.  
  201. float KMH = idz * 3.6; 
  202. Serial.print("Speed: "); 
  203. Serial.print(KMH); 
  204. Serial.println (" kmh"); 
  205.  
  206. float MPH = KMH * 0.621371192; 
  207. Serial.print("Speed: "); 
  208. Serial.print(MPH); 
  209. Serial.println (" mph"); 
  210.  
  211. windchill=(13.12+0.6215*sensors.getTempCByIndex(0))-(11.37*pow(KMH,0.16))+(0.3965*sensors.getTempCByIndex(0)*pow(KMH,0.16)); 
  212. if ((windchill<sensors.getTempCByIndex(0))&&(KMH>4.6)) 
  213. windchill=(13.12+0.6215*sensors.getTempCByIndex(0))-(11.37*pow(KMH,0.16))+(0.3965*sensors.getTempCByIndex(0)*pow(KMH,0.16)); 
  214. else 
  215. windchill=sensors.getTempCByIndex(0); 
  216.  
  217. tft.fillScreen(ST7735_BLACK); 
  218. tft.setTextColor (ST7735_GREEN); 
  219. tft.setCursor(0, 0); 
  220. tft.setTextSize(1); 
  221. tft.println("Temp.OUTSIDE"); 
  222. if (sensors.getTempCByIndex(0)<3) 
  223. {  
  224. tft.setTextColor (ST7735_BLUE); 
  225. tft.setCursor(80, 0); 
  226. tft.setTextSize(1); 
  227. tft.print(sensors.getTempCByIndex(0)); 
  228. tft.print ( (char)248); 
  229. tft.println("C"); 
  230. //delay(5000); 
  231. if ((sensors.getTempCByIndex(0)>=3)&&(sensors.getTempCByIndex(0)<=15)) 
  232. {  
  233. tft.setTextColor (ST7735_GREEN); 
  234. tft.setCursor(80, 0); 
  235. tft.setTextSize(1); 
  236. tft.print(sensors.getTempCByIndex(0)); 
  237. tft.print ( (char)248); 
  238. tft.println("C"); 
  239. if ((sensors.getTempCByIndex(0)>15)&&(sensors.getTempCByIndex(0)<30)) 
  240. {  
  241. tft.setTextColor (ST7735_YELLOW); 
  242. tft.setCursor(80, 0); 
  243. tft.setTextSize(1); 
  244. tft.print(sensors.getTempCByIndex(0)); 
  245. tft.print ( (char)248); 
  246. tft.println("C"); 
  247. if ((sensors.getTempCByIndex(0)>=30)) 
  248. {  
  249. tft.setTextColor (ST7735_RED); 
  250. tft.setCursor(80, 0); 
  251. tft.setTextSize(1); 
  252. tft.print(sensors.getTempCByIndex(0)); 
  253. tft.print ( (char)248); 
  254. tft.println("C"); 
  255.  
  256. tft.setTextColor (ST7735_WHITE); 
  257. tft.setCursor (0,10); 
  258. tft.setTextSize (1); 
  259. tft.print ("Umidita'"); 
  260. tft.setCursor (80,10); 
  261. tft.setTextSize (1); 
  262. tft.print (dht.readHumidity()); 
  263.  
  264. tft.print (" %"); 
  265.  
  266. tft.setCursor (0,20); 
  267. tft.setTextSize (1); 
  268. tft.print ("Dew Point"); 
  269. tft.setCursor (80,20); 
  270. tft.setTextSize (1); 
  271. tft.print (dewPoint); 
  272. tft.print ((char)248); 
  273. tft.print ("C"); 
  274. tft.setCursor (0,30); 
  275. tft.setTextSize (1); 
  276. tft.println ("Vento"); 
  277. tft.setCursor (55,30); 
  278. tft.setTextSize (1); 
  279. tft.print (KMH); 
  280. tft.print ("Km/h"); 
  281. tft.setCursor (110,30); 
  282. tft.setTextSize (1); 
  283. tft.print (windDirection[idx]); 
  284. tft.setCursor (0,40); 
  285. tft.setTextSize (1); 
  286. tft.print ("Pressione"); 
  287. tft.setCursor (65,40); 
  288. tft.setTextSize (1); 
  289. tft.print (pressionelivellodelmarehPa); 
  290. tft.setCursor (110,40); 
  291. tft.setTextSize (1); 
  292. tft.print ("hPa"); 
  293. tft.setTextColor (ST7735_BLUE); 
  294. tft.setCursor (0,50); 
  295. tft.setTextSize(1); 
  296. tft.print ("Wind Chill"); 
  297. tft.setCursor (80,50); 
  298. tft.setTextSize(1); 
  299. tft.print (windchill); 
  300. tft.print ((char)248); 
  301. tft.print ("C"); 
  302. tft.setTextColor (ST7735_RED); 
  303. tft.setCursor (0,60); 
  304. tft.setTextSize (1); 
  305. tft.println ("Heat Index"); 
  306. tft.setCursor (80,60); 
  307. tft.setTextSize (1); 
  308. tft.print (heatindexc); 
  309. tft.print ((char)248); 
  310. tft.print ("C"); 
  311. tft.setTextColor (ST7735_YELLOW); 
  312. tft.setCursor(0, 70); 
  313. tft.setTextSize(1); 
  314. tft.println("Temp.INSIDE"); 
  315. tft.setCursor(80, 70); 
  316. tft.setTextSize(1); 
  317. tft.print(barometer.GetTemperature()); 
  318. tft.setTextSize(1); 
  319. tft.print((char)248); 
  320. tft.setTextSize(1); 
  321. tft.println("C"); 
  322. tft.drawLine (0,80,tft.width()-1,80,ST7735_WHITE); 
  323. void rawdump() { 
  324. Serial.print("Raw: "); 
  325. for (int i=0 ; i<41 ; i++) { 
  326. Serial.print (data[i]); 
  327. if (i == 4) { 
  328. Serial.print (" "); 
  329. if (i == 8) { 
  330. Serial.print (" "); 
  331. if (i == 17) { 
  332. Serial.print (" "); 
  333. if (i == 20) { 
  334. Serial.print (" "); 
  335. if (i == 24) { 
  336. Serial.print (" "); 
  337. if (i == 28) { 
  338. Serial.print (" "); 
  339. if (i == 37) { 
  340. Serial.print (" "); 
  341.  
  342. void outputResults() { 
  343. Serial.println(); 
  344.  
  345. int idx =0; 
  346. for (int i=8 ; i> 4 ; i--)  
  347. //for (int i=6 ; i> 2 ; i--) // dato modificato 
  348. idx = idx *2 + data[i]; // data[i] == 0/1.. see prev post. // 
  349.  
  350. Serial.print("idx: "); 
  351. Serial.println(idx, DEC); 
  352. Serial.print("Wind: "); 
  353. Serial.println(windDirection[idx] ); 
  354. // Serial.println(); 
  355.  
  356. Serial.print("Swapped: "); 
  357.  
  358. //HEAD 
  359. for (int i =0 ; i< 5 ; i++) 
  360. Serial.print(data[i]); // it contains 0 or 1 
  361.  
  362. Serial.print(" "); 
  363.  
  364. //WINDDIR 
  365. for (int i =8 ; i> 4 ; i--) 
  366. Serial.print(data[i]); 
  367. Serial.print(" "); 
  368.  
  369. //WIND SPEED 
  370. for (int i =17 ; i> 8 ; i--) 
  371. Serial.print(data[i]); 
  372.  
  373. Serial.print(" "); 
  374.  
  375. //WIND SPEED+3 
  376. for (int i =20 ; i> 17 ; i--) 
  377. Serial.print(data[i]); 
  378.  
  379. Serial.print(" "); 
  380.  
  381. /* 
  382. // Checksum 
  383. for (iCounter=0;iCounter<4;iCounter++) 
  384. checksum |= (TX23_DATA_GET_BIT << iCounter); 
  385. delayTargetuSec += bitLength; 
  386. TX23_DoDelay; 
  387.  
  388. //Calculate Checksum 
  389. unsigned int checksumCalc = 0; 
  390. checksumCalc += (winddir & 15); 
  391. checksumCalc += ((windspeed >> 8) & 15); 
  392. checksumCalc += ((windspeed >> 4) & 15); 
  393. checksumCalc += (windspeed & 15); 
  394. */ 
  395.  
  396. // Checksum 
  397. for (int i =24 ; i> 20 ; i--) 
  398. Serial.print(data[i]); 
  399.  
  400. Serial.print(" "); 
  401.  
  402. //WIND DIR NEGATEIVE 
  403. for (int i =28 ; i> 24 ; i--) 
  404. Serial.print(data[i]); 
  405.  
  406. Serial.print(" "); 
  407.  
  408. //WIND SPEED NEGATED 
  409. for (int i =37 ; i> 28 ; i--){ 
  410. Serial.print(data[i]); 
  411.  
  412. Serial.print(" "); 
  413.  
  414. //WIND SPEED NEGATED +3 
  415. for (int i =40 ; i> 37 ; i--){ 
  416. Serial.print(data[i]); 
  417. Serial.println(); 
  418. // Serial.println(); 
  419. // Serial.println(); 
  420.  
  421.  
  422.  
  423.  

Comprende tutti i valori che si leggono in questa foto la stazione meteo. ;)
img_0501

Ho tarato la pressione con la davis di pigi ed è identico il valore di pressione, ovviamente sul livello del mare, alla sua che sta a 2km. In più ovviamente adesso che c'è questa struttura anticiclonica di sicuro non mi sbaglio :D Vedi che serve a qualcosa :mrgreen:
:bye:

P.S. A leggere tutto ci vogliono circa 5/6 secondi per via della lunghezza del programma. ;)


Gab78 [ Ven 06 Nov, 2015 22:10 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Ancora complimenti...! :surprise:


andrea75 [ Sab 07 Nov, 2015 09:01 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Lavoro spettacolare Eugenio!!! DAVVERO COMPLIMENTI!!! :inchino:


As_Needed [ Sab 07 Nov, 2015 19:47 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Grazie ancora per il vostro interesse nel mio progetto :smile: Pubblicherò gli altri aggiornamenti futuri!
:bye:


enniometeo [ Dom 08 Nov, 2015 23:14 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Bravissimo Eugenio :inchino: continua cosi :ok:


As_Needed [ Lun 09 Nov, 2015 16:10 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Allora ragazzi, volevo chiedervi un consiglio! Sono riuscito a inserire la massime e minime di temperature e la raffica massima sul display, certo ancora non ho capito come farle giornaliere ma almeno ci sono...
Qui la foto
img_0503
Il consiglio che vi chiedo è: secondo voi essendo disponibili ancora circa 4 spazi quali altri valori metto di massime e minime o qualcos'altro?
Se riuscirò a mettere il tutto online poi la data sarà sempre sincronizzata con il pc e magari poi inserirò pure a che ora è stata rilevata la massima o minima etc... e chissà magari con uno shield che ho adocchiato forse posso mettere sia rtc e sd card per il datalogger ;)
:bye:


As_Needed [ Lun 09 Nov, 2015 17:38 ]
Oggetto: Re: Stazione Meteo Base (FAI DA TE)
Ci sono riuscito a mettere massime e minime giornaliere! Ci ho ragionato e ho usato questo codice
Codice: [Nascondi]
  1. Serial.print("Tempo= "); 
  2. Serial.print(hour()); 
  3. Serial.print(":"); 
  4. Serial.print(minute()); 
  5. Serial.print(":"); 
  6. Serial.print(second()); 
  7. Serial.println(""); 
  8.  
  9. Serial.print("Data= "); 
  10. Serial.print(day()); 
  11. Serial.print("/"); 
  12. Serial.print(month()); 
  13. Serial.print("/"); 
  14. Serial.print(year()); 
  15. Serial.println(""); 
  16.  
  17. //esegui ogni secondo 
  18. delay(1000); 
  19.  
  20.  
  21. if ((hour()==0)&&(minute()==0)&&(second()<10)) 
  22. tempmax=sensors.getTempCByIndex(0); 
  23. tempmin=sensors.getTempCByIndex(0); 
  24.  
  25. if (sensors.getTempCByIndex(0)>tempmax) 
  26. tempmax=sensors.getTempCByIndex(0); 
  27. if (sensors.getTempCByIndex(0)<tempmin) 
  28. tempmin=sensors.getTempCByIndex(0); 
  29.  
  30.  


Praticamente appena vede che le ore sono a zero i minuti pure e i secondi minori di 10 resetta tutto
ho messo i secondi minori di 10 perché uguale a 0 anche loro molte volte non li prendeva e continuava come se niente fosse.
Certo l'ora non è sincronizzata ovvero quando la imposti basta che stacchi la corrente e si resetta l'ora, però almeno così già ho una base e poi o metti rtc o online, il resto è solo un discorso di fargli capire sempre che ora è.




Powered by Icy Phoenix