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.
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:
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:
- Adafruit_BMP085_U.h
- 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:
una volta salvato il file compresso sl tuo computer devi procedere alla decompressione:
quindi copia la directory decompressa:
e posizionala nella directory libraries di arduino perché l’IDE possa trovarla:
infine perché funzioni è necessario rinominarlo, ricorda che il nome può contenere solo lettere e numeri:
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:
nella pagina che ti si apre troverai in basso a destra il solito pulsante Download:
una volta scaricata puoi procedere a decomprimerla:
e copiare solo il suo contenuto facendo attenzione a selezionare solo i file .h e .cpp:
posiziona i file nella stessa directory in cui hai copiato la Adafruit_BMP085 library in modo che lo sketch possa trovare entrambe:
otterrai una situazione simile:
ora apri l’IDE arduino e seleziona il percorso:
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:
Buona lettura DEI DATI DAL TUO BMP085 barometric sensor !!!
2 commenti
1 ping
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 .
Autore
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.
[…] Puoi leggere i test sui sensori citati in questi articoli già pubblicati DHT11, SHT10, BMP085 […]