Stazione Meteo Completa! (FAI DA TE)


Vai a Precedente  1, 2, 3 ... 5, 6, 7 ... 16, 17, 18  Successivo

Titolo: 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:

Ultima modifica di As_Needed il Lun 26 Ott, 2015 18:42, modificato 1 volta in totale
Titolo: 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. ;)

Titolo: 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 ;)

Titolo: 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

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

Titolo: Re: Stazione Meteo Base (FAI DA TE)
:eek: per me è totalmente arabo...complimenti davvero! :inchino:

Titolo: Re: Stazione Meteo Base (FAI DA TE)
Grazie mille!! :)
Posteró i prossimi sviluppi! :ok:

Titolo: Re: Stazione Meteo Base (FAI DA TE)
Bravissimo Eugenio! :inchino:

Ultima modifica di enniometeo il Gio 29 Ott, 2015 21:46, modificato 1 volta in totale
Profilo PM  
Titolo: Re: Stazione Meteo Base (FAI DA TE)
Lavoro grandioso! :wohow: :inchino:

Profilo PM  
Titolo: 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:

Titolo: 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:

Titolo: Re: Stazione Meteo Base (FAI DA TE)
Sto topic sono sicuro farà furore una volta terminato il progetto.... 8))

Titolo: 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!

Titolo: 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

Titolo: Re: Stazione Meteo Base (FAI DA TE)
Chapeau...! :inchino:

Profilo PM  
Vai a Precedente  1, 2, 3 ... 5, 6, 7 ... 16, 17, 18  Successivo

Pagina 6 di 18


  
Non puoi inserire nuovi Argomenti
Non puoi rispondere ai Messaggi
Non puoi modificare i tuoi Messaggi
Non puoi cancellare i tuoi Messaggi
Non puoi votare nei Sondaggi
Non puoi allegare files
Puoi scaricare gli allegati
Non puoi inserire eventi calendario

   

Questa visualizzazione "Lo-Fi" è semplificata. Per avere la versione completa di formattazioni ed immagini clicca su questo link.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Tempo Generazione: 0.1397s (PHP: 38% SQL: 62%)
SQL queries: 14 - Debug On - GZIP Abilitato