BMP085 barometric sensor

Hai già letto l’articolo sulla costruzione del BMP085 barometric sensor descritto in questo articolo. E’ ora di provare a misurare la pressione atmosferica e non solo.

DFRobot Barometric sensor

Il BMP085 barometric sensor misura anche l’altitudine basando le sue misurazioni sulla variazione di pressione e temperatura.

Collegamento del BMP085 barometric sensor

Collegare il BMP085 barometric sensor ad arduino non è complesso, ti bastano 4 cavi di cui 2 per l’alimentazione e 2 connessi ai pin SDA ed SCL ossia al protocollo I2C, puoi seguire lo schema seguente, facendo attenzione a controllare la serigrafia dei contatti presente sul tuo sensore:

BMP085 Barometric Pressure Sensor schema di collegamento

come vedi i collegamenti sono:

  • VCC -> +5v arduino
  • GND -> Gnd arduino
  • SCL -> pin A5 arduino
  • SDA -> pin A4 arduino

Librerie e Sketch di test

Essendo IL BMP085 barometric sensor un sensore I2C dovrai utilizzare la libreria Wire.h già presente nell’IDE arduino, ma ti servono anche altre due librerie:

  1. Adafruit_BMP085_U.h
  2. Adafruit_sensor.h

che in accoppiata con la Wire.h ti permettono una facile lettura del componente BMP085 barometric sensor.

Download della Adafruit_BMP085_U

La libreria Adafruit_BMP085_U è disponibile su Git Hub in questo link da cui puoi scaricarla liberamente cliccando sul pulsante download in basso a destra:

BMP085 barometric sensor

una volta salvato il file compresso sl tuo computer devi procedere alla decompressione:

BMP085 barometric sensor

quindi copia la directory decompressa:

BPM085 barometric sensor  copy

e posizionala nella directory libraries di arduino perché l’IDE possa trovarla:

BPM085 barometric sensor libraries

infine perché funzioni è necessario rinominarlo, ricorda che il nome può contenere solo lettere e numeri:

BPM085 barometric sensor

I passaggi non sono ancora finiti, è necessario che ti procuri anche l’altra libreria elencata sopra la Adafruit_sensor.h, puoi seguire il link presente su github o questo link:

BMP085 barometric sensor unified sensor library

nella pagina che ti si apre troverai in basso a destra il solito pulsante Download:

BMP085 barometric sensor library

una volta scaricata puoi procedere a decomprimerla:

BPM085 barometric sensor decompress

e copiare solo il suo contenuto facendo attenzione a selezionare solo i file .h e .cpp:

BPM085 barometric sensor copy

posiziona i file nella stessa directory in cui hai copiato la Adafruit_BMP085 library in modo che lo sketch possa trovare entrambe:

BPM085 barometric sensor paste

otterrai una situazione simile:

BMP085 barometric sensor all libraries

ora apri l’IDE arduino e seleziona il percorso:

BPM085 barometric sensor example

in cui trovi lo sketch che puoi usare per leggere i valori di pressione, temperatura e altitudine catturati dal sensore BMP085 barometric sensor.

Ecco lo sketch di esempio per la lettura dei dati dal BMP085 barometric sensor:

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>

/* This driver uses the Adafruit unified sensor library (Adafruit_Sensor),
   which provides a common 'type' for sensor data and some helper functions.

   To use this driver you will also need to download the Adafruit_Sensor
   library and include it in your libraries folder.

   You should also assign a unique ID to this sensor for use with
   the Adafruit Sensor API so that you can identify this particular
   sensor in any data logs, etc.  To assign a unique ID, simply
   provide an appropriate value in the constructor below (12345
   is used by default in this example).

   Connections
   ===========
   Connect SCL to analog 5
   Connect SDA to analog 4
   Connect VDD to 3.3V DC
   Connect GROUND to common ground

   History
   =======
   2013/JUN/17  - Updated altitude calculations (KTOWN)
   2013/FEB/13  - First version (KTOWN)
*/

Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);

/**************************************************************************/
/*
    Displays some basic information on this sensor from the unified
    sensor API sensor_t type (see Adafruit_Sensor for more information)
*/
/**************************************************************************/
void displaySensorDetails(void)
{
  sensor_t sensor;
  bmp.getSensor(&sensor);
  Serial.println("------------------------------------");
  Serial.print  ("Sensor:       "); Serial.println(sensor.name);
  Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);
  Serial.print  ("Unique ID:    "); Serial.println(sensor.sensor_id);
  Serial.print  ("Max Value:    "); Serial.print(sensor.max_value); Serial.println(" hPa");
  Serial.print  ("Min Value:    "); Serial.print(sensor.min_value); Serial.println(" hPa");
  Serial.print  ("Resolution:   "); Serial.print(sensor.resolution); Serial.println(" hPa");  
  Serial.println("------------------------------------");
  Serial.println("");
  delay(500);
}

/**************************************************************************/
/*
    Arduino setup function (automatically called at startup)
*/
/**************************************************************************/
void setup(void) 
{
  Serial.begin(9600);
  Serial.println("Pressure Sensor Test"); Serial.println("");

  /* Initialise the sensor */
  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);
  }

  /* Display some basic information on this sensor */
  displaySensorDetails();
}

/**************************************************************************/
/*
    Arduino loop function, called once 'setup' is complete (your own code
    should go here)
*/
/**************************************************************************/
void loop(void) 
{
  /* Get a new sensor event */ 
  sensors_event_t event;
  bmp.getEvent(&event);

  /* Display the results (barometric pressure is measure in hPa) */
  if (event.pressure)
  {
    /* Display atmospheric pressue in hPa */
    Serial.print("Pressure:    ");
    Serial.print(event.pressure);
    Serial.println(" hPa");

    /* Calculating altitude with reasonable accuracy requires pressure    *
     * sea level pressure for your position at the moment the data is     *
     * converted, as well as the ambient temperature in degress           *
     * celcius.  If you don't have these values, a 'generic' value of     *
     * 1013.25 hPa can be used (defined as SENSORS_PRESSURE_SEALEVELHPA   *
     * in sensors.h), but this isn't ideal and will give variable         *
     * results from one day to the next.                                  *
     *                                                                    *
     * You can usually find the current SLP value by looking at weather   *
     * websites or from environmental information centers near any major  *
     * airport.                                                           *
     *                                                                    *
     * For example, for Paris, France you can check the current mean      *
     * pressure and sea level at: http://bit.ly/16Au8ol                   */

    /* First we get the current temperature from the BMP085 */
    float temperature;
    bmp.getTemperature(&temperature);
    Serial.print("Temperature: ");
    Serial.print(temperature);
    Serial.println(" C");

    /* Then convert the atmospheric pressure, SLP and temp to altitude    */
    /* Update this next line with the current SLP for better results      */
    float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA;
    Serial.print("Altitude:    "); 
    Serial.print(bmp.pressureToAltitude(seaLevelPressure,
                                        event.pressure,
                                        temperature)); 
    Serial.println(" m");
    Serial.println("");
  }
  else
  {
    Serial.println("Sensor error");
  }
  delay(1000);
}

hai notato che è abbastanza piccolo perché la maggior parte del lavoro lo lasciamo fare alle librerie Adafruit che si occupano di codificare sia l’invio sia la ricezione dei messaggi necessari per interrogare il sensore.

Le linee 001-003 : includono le 3 librerie di cui ti ho parlato fino ad ora;

linee 017-022: sono dei commenti ma ti indicano come devi collegare il sensore;

linea 030: definisci bmp come istanza della classe Adafruit_BMP085_Unified, userai l’istanza bmp in seguito per richiamare

linee 038-055: definisi la funzione displaySensorDetail() il cui compito è interrogare il sensore BMP085 barometric sensor e scrivere sul monito seriale una serie di valori restituiti dal sensore stesso, tra cui puoi leggere:

  • il nome del sensore
  • la versione del driver
  • il valore massimo
  • il valore minimo

linea 062: definisci la funzione setup() all’interno della quale definirai tutte le operazioni da eseguire all’avvio del programma;

linea 068: usa il metodo begin() della classe bmp per controllare che il sensore sia collegato ad arduino;

linea 071: printa la frase riportata tra “” se il sensore non è collegato o incontra un problema nella comunicazione con il sensore;

linea 073: siccome dalla funzione setup() non è possibile uscire per evitare che sia eseguito il resto del programma quando il sensore non è collegato si usa di solito un espediente il while(1) che genera un ciclo infinito che blocca lo sketch in questo punto;

linea 077: richiama la funzione displaySensorDetail() per printare a video i valori di partenza letti dal sensore;

linea 086: definisci la funzione loop();

linee 089-090: interroga il sensore richiamando il metodo getEvent() dell’istanza sensors_event_t;

linea 093: se il valore di event.pressure è verificato esegue le linee che seguono;

linee 096-098: scrivi nel monitor seriale i valori di Pressione;

linee 116-120: scrivi a video i valori di temperatura rilevati dal sensore;

linee 124-130: scrivi sul monitor seriale i valori di altitudine ricavati dalla combinazione di pressione e temperatura;

linee 132-135: esegui l’else se il controllo alla linea 093 fallisce e scrivi sul monito seriale “Sensor error”;

linea 136: attendi 1 secondo ( 1000 millisecondi ) prima di ricominciare il loop().

Quando trasferisci lo sketch su arduino e colleghi il sensore dovrai ottenere sul monitor seriale una serie di dati simili a quelli riportati di seguito:

BMP085 baromestric sensor serial monitor

Buona lettura DEI DATI DAL TUO BMP085 barometric sensor !!!

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/bmp085-barometric-sensor.html

2 commenti

1 ping

    • Savogin Amerigo il 29 Ottobre 2018 alle 11:05
    • Rispondi

    Gentile Sig Mauro Alfieri, ho scaricato il listato per il sensore bmp085 per arduino, ho scaricato le librerie come
    da listato , ho scritto tutto il programma ,quando clicco su compilazione il programma Mi restituisce il seguente messaggio : ‘ sensor_event_t’ was not declaredin in this score, riga 085 del listato.
    Ho controllato più volte se ho fatto errori nel digitare il listato , è tutto giusto,potreste gentilmente dirmi dove
    è l’inghippo.

    Grazie .

    1. Ciao Amerigo,
      il listato è un esempio dato con la libreria, come si vede dalle immagini, e consiglio di utilizzare quello.
      Potrebbe essere variata la libreria e questo esempio non essere più perfettamente compatibile.
      Certamente l’autore della libreria ( Adafruit ) avrà provveduto a correggere l’esempio rilasciato con la libreria stessa.

  1. […] Puoi leggere i test sui sensori citati in questi articoli già pubblicati DHT11, SHT10, BMP085 […]

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.