In questo articolo vi spiegherò come funziona e come usare, in special modo con Arduino, il sensore di pressione e di temperatura BMP085 della Bosch. Vedremo insieme anche degli esempi per utilizzarlo per fare un datalogger, per visualizzare su un display i dati e per creare una pagina web con i dati.
In questo progetto useremo Arduino, acquistabile da Conrad ed il sensore di pressione BMP085.
Come si può vedere dall'immagine, il sensore vero e proprio (quello grigio con un buchino) è montato su una schedina con alcuni componenti.
Questo sensore è digitale e utilizza il sistema di comunicazione I2C.
All'interno contiene un sensore piezo-resistivo, un ADC (analog to digital converter, convertitore da analogico a digitale) e un unità di controllo con EPROM che utilizza il sistema di comunicazione I2C.
Il BMP085 misura pressione e temperatura con step di 0,1 hPa e 0,1 °C.
I vantaggi offerti dall'utilizzo del sensore sono:
- Range elevato (da 300 a 1100 hPa come da 9000 a -500 m s.l.m);
- Basso errore (0,03 hPa nella modalità ad alta precisione e 0,06 nella modalità a risparmio energetico, equivalenti a 0,25 e 0,50 m);
- Consumo ridotto (5 uA);
- Sensore di temperatura integrato;
- Comunicazione I2C;
- Già calibrato accuratamente in fabbbrica.
Ecco delle possibili applicazioni:
- Previsioni meteo;
- Tempo libero e sport;
- Velocità verticale;
- Potenziamento della navigazione GPS.
Protocollo I2C

Il protocollo I2C utilizza due pin:
- il pin SCL da il segnale di clock (Serial Clock Line);
- il pin SDA trasmette i dati (Serial DAta Line).
Questi corrispondono ai pin di Arduino UNO:
- SDA → A4;
- SCL → A5.
Su l'Arduino mega sono separati e sono scritti sulla scheda.

Con questo protocollo possono essere collegati fino a 112 dispositivi sulla stessa linea e la velocità standard è di 100 kbit/s.
I dispositivi vengono chiamati nodi e sono divisi in slave e master; quest'ultimi sono quelli che generano il segnale di clock (soltanto uno alla volta). Lo slave non controlla il clock, ma invia e riceve solo dati.
La trasmissione inizia con un segnale di start e finisce con uno di stop.
- Lo start (S) è costituito da una transizione da alto a basso del bus dati SDA mentre il clock (SCL) è alto;
- Trasmissione partendo dal bit più significativo B1 e terminando con il bit meno significativo B7;
- Lo stop (P) è rappresentato da una transizione da basso ad alto del SDA mentre il SCL è alto.

Utilizzo con Arduino
Per questo sensore esiste già una libreria apposita per Arduino.
Per chi non lo sapesse, le librerie sono un insieme di funzioni o strutture dati predisposte per essere collegate ad uno sketch attraverso un collegamento, ad esempio:
#include <Adafruit_BMP085.h>
La libreria può essere scaricata da qui.
Per utilizzarla è necessaria copiare la cartella della libreria nella cartella documenti/Arduino/librerie/
NB: In fondo all'articolo c'è il file zip da scaricare con tutti gli sketch e la libreria.
Ecco uno sketch per leggere i dati e scriverli nel monitor seriale:
#include <wire.h>
#include <Adafruit_BMP085.h>
// Connettere VCC a 3.3V
// Connettere GND a Ground
// Connettere SCL a Analog 5
// Connettere SDA a Analog 4
Adafruit_BMP085 bmp;
void setup() {
Serial.begin(9600);
if (!bmp.begin()) {
while (1) {}
}
}
void loop() {
Serial.print(bmp.readTemperature());
Serial.print(" C "); //lcd.setCursor(8, 0);
Serial.print(bmp.readPressure()/100);
Serial.println(" hPa ");
Serial.println();
delay(500);
}
Come si può vedere, bisogna includere le librerie: Adafruit_BMP085.h e Wire.h che è già istallata in Arduino.
Dopo bisogna fare questo comando: Adafruit_BMP085 bmp;
Nel setup serve inizializzare la comunicazione seriale per trasmettere i dati al PC e guardare se il sensore è pronto.
Per leggere la temperatura si utilizza questo comando: (bmp.readTemperature());
Per leggere la pressione si utilizza questo comando: (bmp.readPressure());
Io ho utilizzato questo sensore nella mia stazione meteo, che carica i dati online, che ho già pubblicato su questo sito: .
Mentre questo sensore viene utilizzato e ben descritto in un altro articolo di Piero Boccadoro.
Volete raccogliere dei dati e salvarli in un file su una micro SD per poi importarli in excel e analizzarli? Si può fare. Ecco come:
Bisogna acquistare un lettore di micro SD per Arduino e
- Collegare il pin MOSI al pin 11 di Arduino;
- Collegare il pin MISO al pin 12 di Arduino;
- Collegare il pin CLK al pin 13 di Arduino;
- Collegare il pin CS al pin 4 di Arduino.
Poi un esempio di sketch per salvare i dati su SD potrebbe essere questo:
#include <SPI.h>
#include <SD.h>
File myFile;
#include <Wire.h>
#include <Adafruit_BMP085>
// Connettere VCC a 3.3V
// Connettere GND a Ground
// Connettere SCL a Analog 5
// Connettere SDA a Analog 4
Adafruit_BMP085 bmp;
void setup()
{
if (!SD.begin(4)) {
return;
}
if (!bmp.begin()) {
while (1) {}
}
}
void loop()
{
myFile = SD.open("nome.txt", FILE_WRITE);
if (myFile) {
myFile.print("Pressione: ");
myFile.print(bmp.readPressure()/100);
myFile.print(" % ");
myFile.print("Temperatura: ");
myFile.print(bmp.readTemperature());
myFile.prinln(" *C ");
myFile.close();
delay(30000);
}
}
I dati poi possono essere importati in excel ed elaborati. Ecco i dati con dei grafici:

Volete invece visualizzare la pressione e la temperatura su un display?
Ecco lo sketch che ho usato io:
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
Adafruit_BMP085 bmp;
void setup() {
lcd.begin(16, 2);
if (!bmp.begin()) {
while (1) {}
}
}
void loop() {
lcd.clear();
lcd.print(bmp.readTemperature());
lcd.print(" C "); //lcd.setCursor(8, 0);
lcd.print(bmp.readPressure()/100);
lcd.print(" hPa ");
delay(1000);
}
Io ho anche creato una pagina web, accessibile solo in locale in cui ci sono scritti i due valori.
è necessario avere la Ethernet Shield.
Ecco lo sketch:
#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>
// Connettere VCC a 3.3V
// Connettere GND a Ground
// Connettere SCL a Analog 5
// Connettere SDA a Analog 4
Adafruit_BMP085 bmp;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,50,177);
EthernetServer server(80);
void setup() {
Serial.begin(9600);
if (!bmp.begin()) {
while (1) {}
}
Ethernet.begin(mac, ip);
server.begin();
Serial.println("Server è all'indirizzo IP (scrivere nel browser)");
Serial.println(Ethernet.localIP());
}
void loop() {
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
if (c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println("Refresh: 5");
client.println();
client.println("");
client.println("
");
client.print("Pressione: ");
client.print(bmp.readPressure()/100);
client.print(" hPa ");
client.print("Temperatura: ");
client.print(bmp.readTemperature());
client.println(" *C");
client.println("
");
break;
}
if (c == '\n') {
currentLineIsBlank = true;
}
else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
Serial.println("Client disconnesso");
}
}
Ecco il risultato su PC:

E su dispositivo mobile (iPod):

Adesso dovete usare la vostra fantasia per trovare un applicazione e magari condividerla con la community. Se vi è piaciuto condividete questo articolo su Facebook, Twitter.




Si, l’articolo è ben fatto.
Però, vista così è un po’ fine a se stessa. Userai il sensore in qualche applicazione?
Adesso utilizzo il sensore su quella stazione meteo che ho linkato sopra: stazione meteo
Complimenti! Ottimo articolo per degli spunti!!
domanda: saprebbe indicarmi quali sono (se ci sono) delle compatibilità della libreria con un componente BMP180,sempre Bosch ?
In particolare il sensore è il GY-68.
Grazie
Gianluca