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