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

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

Nelle normali stazioni meteo il sensore sta nelle consolle, quindi all'interno. 
|
|
andrea75 [ Lun 26 Ott, 2015 19:01 ]
|
 |
 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?

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 ]
|
 |
 Re: Stazione Meteo Base (FAI DA TE)
|
Salve a tutti! Posto qui finalmente i primi risultati concreti, visualizzazione della temperatura e umidità sul display!
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 ]
|
 |
 Re: Stazione Meteo Base (FAI DA TE)
|
Fantastico!!!! 
|
|
andrea75 [ Gio 29 Ott, 2015 20:59 ]
|
 |
 Re: Stazione Meteo Base (FAI DA TE)
|
 per me è totalmente arabo...complimenti davvero! 
|
|
Fili [ Gio 29 Ott, 2015 21:05 ]
|
 |
 Re: Stazione Meteo Base (FAI DA TE)
|
Grazie mille!!
Posteró i prossimi sviluppi! 
|
|
As_Needed [ Gio 29 Ott, 2015 21:20 ]
|
 |
 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 ]
|
 |
 Re: Stazione Meteo Base (FAI DA TE)
|
Lavoro grandioso! 
|
|
Gab78 [ Gio 29 Ott, 2015 22:07 ]
|
 |
 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 ]
|
 |
 Re: Stazione Meteo Base (FAI DA TE)
|
Allora, alla fine ecco i risultati finali su basetta! Appena terminati
Per chi non conoscesse il seriale che ho nominato nei post precedenti è questo:
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 ]
|
 |
 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 ]
|
 |
 Re: Stazione Meteo Base (FAI DA TE)
|
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 ]
|
 |
 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.

|
|
As_Needed [ Sab 31 Ott, 2015 13:35 ]
|
 |
 Re: Stazione Meteo Base (FAI DA TE)
|
Chapeau...! 
|
|
Gab78 [ Sab 31 Ott, 2015 14:37 ]
|
 |
|
|
Questo argomento è stato utile?
Questo argomento è stato utile?
Online in questo argomento: 0 Registrati, 0 Nascosti e 1 Ospite Utenti Registrati: Nessuno
|
|
|