Pressione e Temperatura: BMP085 e Arduino

Pressione e Temperatura: BMP085 e Arduino

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.

2 Comments

  1. Giorgio B. Giorgio B. 4 aprile 2014
  2. gioam.lorenzini 5 aprile 2014

Leave a Reply