| 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?
:bye:
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?
:bye:
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 :D
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!!!! :inchino: :inchino:
|
|
andrea75 [ Gio 29 Ott, 2015 20:59 ]
|
 |
 Re: Stazione Meteo Base (FAI DA TE)
|
|
:eek: per me è totalmente arabo...complimenti davvero! :inchino:
|
|
Fili [ Gio 29 Ott, 2015 21:05 ]
|
 |
 Re: Stazione Meteo Base (FAI DA TE)
|
|
Grazie mille!! :)
Posteró i prossimi sviluppi! :ok:
|
|
As_Needed [ Gio 29 Ott, 2015 21:20 ]
|
 |
 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
|
|
enniometeo [ Gio 29 Ott, 2015 21:41 ]
|
 |
 Re: Stazione Meteo Base (FAI DA TE)
|
|
Lavoro grandioso! :wohow: :inchino:
|
|
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... :roll:
|
|
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! ;)
:bye:
|
|
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.... 8))
|
|
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.... 8))
Lo spero, condivido per questo 8)) 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...! :inchino:
|
|
Gab78 [ Sab 31 Ott, 2015 14:37 ]
|
 |
|
|