Salve a tutti, premesso che sono un neofita di Arduino, sto cercando di creare una stazione meteo fatta in casa su piattaforma Arduino Duemilanove.
Attualmente sono in fase di test dei sensori, precisamente sto testando il bmp085 (sensore barometrico).
Il mio problema è capire se i valori di output della pressione sono corretti poiché non ho un'altra stazione meteo con la quale confrontarmi, prendo i valori da vari siti meteo (ad es. www.ilmeteo.it) riferiti alla mia zona.
Questo è lo sketch che ho utilizzato:
/*
COLLEGAMENTI
Collegare il pin "+" del bmp085 a +5V
Collegare il pin "-" a massa
Collegare il pin "CL" al pin A5 (analogico 5) di Arduino
Collegare il pin "DA" al pin A4 (analogico 4) di arduino
void setup(void)
{
Serial.begin(9600);
Serial.println("Pressure Sensor Test"); Serial.println("");
/* Inizializzo il sensore /
if(!bmp.begin())
{
/ There was a problem detecting the BMP085 ... check your connections */
Serial.print("Ooops, no BMP085 detected ... Check your wiring or I2C ADDR!");
while(1);
}
}
void loop(void)
{
/* Acquisisco nuovo valore dal sensore /
sensors_event_t event;
bmp.getEvent(&event);
/ Visualizzo il valore /
if (event.pressure)
{
/ Visualizzo il valore della pressione in hPa */
Serial.print("Pressure: "); Serial.print(event.pressure); Serial.println(" hPa");
}
else
{
Serial.println("Sensor error");
}
delay(250);
}
il valore controllato sul sito www.ilmeteo.it localita' Viterbo altezza s.l.m. 326m è:
1015 mb
Vorrei sapere se questa discrepanza (973.66 hPa - contro - 1015mb/hPa) dipende da un'altitudine non corretta, errori nel codice o inaccuratezza del sensore.
Grazie in anticipo.
... o forse, più probabilmente, dal fatto che la pressione atmosferica varia di istante in istante così come cambiano le condizioni climatiche.
Purtroppo, quello che tu indichi, "Viterbo altezza s.l.m. 326m è: 1015 mb" è vero solo in condizioni teoriche, la realtà è tutt'altra cosa e, in teoria, dovresti ogni volta collegarti ad un VERO sito specializzato in metereologia che possa darti, nel momento in cui fai la lettura, il fattore di correzione tra il valore TEORICO e quello REALE, fattore da applicare nel tuo programma
Del resto ... a cosa credi serva quel 10085 nello statement ? :
Adafruit_BMP085 bmp = Adafruit_BMP085(10085);
... prova a leggere tutte le note di Adafruit e del programma, dovresti trovare come aggiustare quel valore in funzione della correzione che ti dicevo.
Guglielmo
P.S. : Il codice, cortesemente, racchiudilo tra i tag CODE (il bottoncino con il simbolo #) e non QUOTE
Grazie della tempestiva risposta,
Ho fatto alcune verifiche spulciando la libreria "Adafruit_BMP085" e, da quel che ho capito io questa:
Adafruit_BMP085 bmp = Adafruit_BMP085(10085);
istanzia un oggetto "bmp" di tipo "Adafruit_BMP085" e controllando anche il file "Adafruit_BMP085.cpp" nella libreria, esattamente in questa parte:
/***************************************************************************
CONSTRUCTOR
***************************************************************************/
/**************************************************************************/
/*!
@brief Instantiates a new Adafruit_BMP085 class
*/
/**************************************************************************/
Adafruit_BMP085::Adafruit_BMP085(int32_t sensorID) {
_sensorID = sensorID;
}
Correggimi se sbaglio, viene creata l'istanza e le viene assegnato un id denominato "_sensorID" che è proprio quel "10085" di cui mi parlavi.
Qui è visibile la dichiarazione nel file header Adafruit_BMP085.h:
Se non ho commesso errori di interpretazione del codice, non mi sembra che il suddetto valore serva per calibrare il dispositivo per letture reali.
Cercherò di spulciare bene il datasheet del bmp085, reperibile qua: http://www.adafruit.com/datasheets/BMP085_DataSheet_Rev.1.0_01July2008.pdf
per vedere se riesco a trovare un sistema per calibrarlo correttamente.
Per ora ti ringrazio del tuo tempo e mi scuso per la sintassi scorretta del post precedente.
P.s: Possiedi qualche link ad un sito meteo "SERIO"?? XD
... non so se la libreria che stai usando tu, sempre di Adafruit ha questa linea (... o una cosa simile). C'era anche un pdf (che ti allego) che spiegava la cosa (pag. 11). Prova a vedere
Guglielmo
Edit : mi sa che è un altra libreria ... la classe Adafruit_BMP085 a me risulta così :
Dopo vari grattacapi sono giunto alla soluzione, grazie al tuo consiglio e al file pdf che mi hai allegato.
Usavamo la stessa libreria ma con versioni differenti, io la V2 e tu la V1.
Comunque ho pensato di postare i miei risultati, qualora serva a futuri sperimentatori di questo sensore:
Questo è il mio sketch:
#include <dht11.h>
#define dht_dpin 2
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp = Adafruit_BMP085(10085);
dht11 DHT;
void setup(){
// dht setup
Serial.begin(9600); // Apro la comunicazione con la seriale
delay(300);//Attende i primi 300 ms di 1 sec. per inizializzazione sensore
Serial.println("Stazione Meteo\n\n");
delay(700);//Attende i restanti 700 ms del tempo di inizializzazione del sensore
//Accedo ai sensori
// bmp085 setup
if(!bmp.begin())
{
/* problema di connessione col bmp085 */
Serial.print("ATTENZIONE!!!, Il sensore bmp085 non è stato individuato, controllare i collegamenti o gli indirizzi I2C.");
while(1);
}
}
void loop(){
sensors_event_t event;
bmp.getEvent(&event); // leggo il sensore barometrico
DHT.read(dht_dpin); // leggo il sensore temperatura e umidità
if (event.pressure)
{
/* Pressione atmosferica in hPa */
Serial.print("Pressione: ");
Serial.print(event.pressure);
Serial.println(" hPa");
float temperature;
bmp.getTemperature(&temperature);
Serial.print("Temperatura: ");
Serial.print(temperature);
Serial.println(" C");
/* Cambiando il valore seguente "1010" con il valore della pressione al livello del mare
aggiornata secondo i dati meteo relativi alla propria posizione, la lettura sarà piu' accurata
*/
float seaLevelPressure = 1010;
Serial.print("Altitudine: ");
Serial.print(bmp.pressureToAltitude(seaLevelPressure, event.pressure,temperature));
Serial.println(" m");
}
else
{
Serial.println("Errore del sensore!");
}
// stampo i valori di umidità dal sensore dht11
Serial.print("Umidita' = ");
Serial.print(DHT.humidity);
Serial.println("% ");
Serial.println("");
delay(1000);// Non scendere più di 800 ms per il tempo di accesso
}
Il codice è già commentato per cui evitero' altre precisazioni volevo solo evidenziare questa parte di codice che rappresenta la correzione reale della pressione in base a quella rilevata al livello del mare, come mi dicevi:
/* Cambiando il valore seguente "1010" con il valore della pressione al livello del mare
aggiornata secondo i dati meteo dell'aeronautica, la lettura sarà piu' accurata */
float seaLevelPressure = 1010;
Serial.print("Altitudine: ");
Serial.print(bmp.pressureToAltitude(seaLevelPressure, event.pressure,temperature));
aggiungo il link che permette di scaricare le librerie ADAFRUIT (entrambe le versioni):
P.s. Bisogna inserire qualche tag particolare quando il problema postato sul forum è stato risolto???
robertoluchi:
Dopo vari grattacapi sono giunto alla soluzione, grazie al tuo consiglio e al file pdf che mi hai allegato.
Usavamo la stessa libreria ma con versioni differenti, io la V2 e tu la V1.
Ottimo !!! ... e buono a sapersi che hanno una versione aggiornata della libreria
robertoluchi:
P.s. Bisogna inserire qualche tag particolare quando il problema postato sul forum è stato risolto???
...
Vai in modifica del tuo primo post; da li puoi correggere il titolo aggiungendogli, all'inizio, un [RISOLTO]