Stazione Meteo Completa! (FAI DA TE)

Stazione Meteo Completa! (FAI DA TE)
Articolo
Messaggio 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?
 



 
Ultima modifica di As_Needed il Lun 26 Ott, 2015 18:42, modificato 1 volta in totale 
 As_Needed [ Lun 26 Ott, 2015 18:27 ]


Stazione Meteo Completa! (FAI DA TE)
Commenti
Messaggio 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?
 


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



 
 andrea75 [ Lun 26 Ott, 2015 19:01 ]
Messaggio 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?
 


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


Allora non ci sono problemi grazie



 
 As_Needed [ Lun 26 Ott, 2015 19:38 ]
Messaggio 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  



 
Ultima modifica di As_Needed il Gio 29 Ott, 2015 19:17, modificato 1 volta in totale 
 As_Needed [ Gio 29 Ott, 2015 19:14 ]
Messaggio Re: Stazione Meteo Base (FAI DA TE) 
 
Fantastico!!!!   



 
 andrea75 [ Gio 29 Ott, 2015 20:59 ]
Messaggio Re: Stazione Meteo Base (FAI DA TE) 
 
per me è totalmente arabo...complimenti davvero!  



 
 Fili [ Gio 29 Ott, 2015 21:05 ]
Messaggio Re: Stazione Meteo Base (FAI DA TE) 
 
Grazie mille!!
Posteró i prossimi sviluppi!



 
 As_Needed [ Gio 29 Ott, 2015 21:20 ]
Messaggio Re: Stazione Meteo Base (FAI DA TE) 
 
Bravissimo Eugenio!



 
Ultima modifica di enniometeo il Gio 29 Ott, 2015 21:46, modificato 1 volta in totale 
 enniometeo [ Gio 29 Ott, 2015 21:41 ]
Messaggio Re: Stazione Meteo Base (FAI DA TE) 
 
Lavoro grandioso!    



 
 Gab78 [ Gio 29 Ott, 2015 22:07 ]
Messaggio 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...



 
 As_Needed [ Gio 29 Ott, 2015 22:14 ]
Messaggio 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!
 



 
 As_Needed [ Ven 30 Ott, 2015 17:27 ]
Messaggio Re: Stazione Meteo Base (FAI DA TE) 
 
Sto topic sono sicuro farà furore una volta terminato il progetto....  



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


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



 
 As_Needed [ Ven 30 Ott, 2015 20:49 ]
Messaggio 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



 
 As_Needed [ Sab 31 Ott, 2015 13:35 ]
Messaggio Re: Stazione Meteo Base (FAI DA TE) 
 
Chapeau...!  



 
 Gab78 [ Sab 31 Ott, 2015 14:37 ]
Mostra prima i messaggi di:    
NascondiQuesto argomento è stato utile?
Condividi Argomento
Segnala via email Facebook Twitter Windows Live Favorites MySpace del.icio.us Digg SlashDot google.com LinkedIn StumbleUpon Blogmarks Diigo reddit.com Blinklist co.mments.com
technorati.com DIGG ITA linkagogo.com meneame.net netscape.com newsvine.com yahoo.com Fai Informazione Ok Notizie Segnalo Bookmark IT fark.com feedmelinks.com spurl.net
Pagina 6 di 18
Vai a Precedente  1, 2, 3 ... 5, 6, 7 ... 16, 17, 18  Successivo
Vai a pagina   
 

Online in questo argomento: 0 Registrati, 0 Nascosti e 1 Ospite
Utenti Registrati: Nessuno