[RISOLTO] Problema con sensore di pressione BMP085

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

*/

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp = Adafruit_BMP085(10085);

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);
}

Questo è l'output sulla seriale:

Test sensore bmp085

Pressure: 973.66 hPa
Pressure: 973.69 hPa
Pressure: 973.71 hPa
Pressure: 973.67 hPa
Pressure: 973.68 hPa
Pressure: 973.64 hPa
Pressure: 973.66 hPa

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

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

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:

class Adafruit_BMP085 : public Adafruit_Sensor
{
  public:
    Adafruit_BMP085(int32_t sensorID = -1);
    bool  begin(bmp085_mode_t mode = BMP085_MODE_ULTRAHIGHRES);
    void  getTemperature(float *temp);
    void  getPressure(float *pressure);
    float pressureToAltitude(float seaLevel, float atmospheric, float temp);
    void  getEvent(sensors_event_t*);
    void  getSensor(sensor_t*);

  private:
    int32_t           _sensorID;
};

Se non ho commesso errori di interpretazione del codice, non mi sembra che il suddetto valore serva per calibrare il dispositivo per letture reali. :roll_eyes:
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 :disappointed_relieved: per la sintassi scorretta del post precedente.

P.s: Possiedi qualche link ad un sito meteo "SERIO"?? XD

Grazie,

Roberto

Hai perfettamente ragione ... andavo a memoria (ho usato quel sensore parecchio tempo fa) e ... il punto della correzione è un altro :grin:

Io ho una libreria diversa della Adafruit ed il punto era nella chiamata :

float readAltitude(float sealevelPressure = 101325); // std atmosphere

... 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 :slight_smile:

Guglielmo

Edit : mi sa che è un altra libreria ... la classe Adafruit_BMP085 a me risulta così :

class Adafruit_BMP085 {
 public:
  Adafruit_BMP085();
  boolean begin(uint8_t mode = BMP085_ULTRAHIGHRES);  // by default go highres
  float readTemperature(void);
  int32_t readPressure(void);
  float readAltitude(float sealevelPressure = 101325); // std atmosphere
  uint16_t readRawTemperature(void);
  uint32_t readRawPressure(void);
  
 private:
  uint8_t read8(uint8_t addr);
  uint16_t read16(uint8_t addr);
  void write8(uint8_t addr, uint8_t data);

  uint8_t oversampling;

  int16_t ac1, ac2, ac3, b1, b2, mb, mc, md;
  uint16_t ac4, ac5, ac6;
};

bmp085.pdf (540 KB)

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???

Ti ringrazio per il tempo dedicatomi

Buona serata

Roberto

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

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] :wink:

Ciao,

Guglielmo