Il sensore BMP180 è prodotto dalla Bosch Sensortec permette di effettuare diverse misurazioni come: pressione barometrica, temperatura, altitudine.
Indice
Descrizione
Il sensore BMP180 permette di misurare pressioni da 300 a 1100hPa (.da -500m a +9000m relativi al livello del mare), la tensione di alimentazione è compresa tra 1.8-3,6 (VDD) e 1.62-3.6V (VDDIO), il consumo è di soli 5uA con una lettura al secondo. Il sensore è contenuto in un package tipo LGA con una dimensione di 3,6×3,8 mm.
Oltre al valore di pressione, il sensore fornisce anche la misurazione della temperatura; i dati sono trasmessi tramite un’interfaccia I2C, con un indirizzo fisso 0x77.
La calibrazione è fatta durante la produzione e i valori sono salvati nella memoria del sensore.
Per facilitare l’uso del sensore, questo si trova di solito già montato su una piccola basetta come per esempio la Breakout Board GY-68 oppure HW-596, dove oltre al sensore, trovano posto i pochi altri componenti necessari al suo funzionamento.
Tipi di sensore
Oltre al modulo a 5 pin, sono disponibili dei moduli a 4 pin, in cui è stato eliminato il pin marcato 3.3V.
Le caratteristiche sono le stesse, lo si può trovare con il codice BMP180 (GY 68, HW-596), le sue dimensioni sono più ridotte: 10×13 mm per un peso di 1,18 grammi.
Schema elettrico del modulo
Il circuito è molto semplice in quanto formato principalmente dal sensore BMP180 (GY 68, HW-596)con le resistenze R1 e R2 sulle linee SCL e SDA.
L’altro componente presente è un regolatore CMOS a basso dropout tipo 662K con relativi condensatori che fornisce l’alimentazione a 3.3V, quando il modulo viene alimentato dal pin VCC magari con la tensione 5V fornita da Arduino.
Il regolatore può fornire una corrente di uscita di 250 mA e consentire una tensione di ingresso fino a 6,5 V.
Caratteristiche
ALIMENTAZIONE | 3.3V - 5V |
ASSORBIMENTO | 0,5uA |
LOGICA | 3.3V |
PRESSIONE RILEVATA | 300 ÷1100 hPa (-500 ÷ 9000mt) |
RISOLUZIONE | 0,02 hPa (17cm) |
INTERFACCIA | I2C 7bit con indirizzo 0x77 |
DIMENSIONI | 21x18mm |
Dove trovare schema elettrico e PCB del modulo
Lo schema e il relativo PCB può essere scaricato dal mio account presso OSHWLab, utilizzando questo link.
Dove trovare il modulo BMP180
Il sensore BMP180 potrà essere acquistato presso il sito Homotix, codice HMTBMP180
Ricordo che inserendo il codice di sconto dedicato agli utenti del sito adrirobot questi usufruiranno di uno sconto3%.
Il sensore BMP180 può essere acquistato anche presso il sito FUTURA ELETTRONICA, il codice prodotto è 2846-BMP180
Libreria di gestione del sensore
Per facilitare l’uso del sensore è disponibile un’apposita libreria, questa funzione in unione alla libreria Wire.h è già presente come libreria standard dell’IDE di Arduino che permette l’utilizzo del protocollo I2C.
In rete ve ne sono molte versioni, quella utilizzata per questo test ha questi comandi:
- Initialize() – Inizializza il sensore
- GetUncompensatedTemperature();
- GetUncompensatedPressure();
- Compensate Temperature();
- CompensatePressure();
- SoftReset() – garantisce che quando si è collegato il sensore vi sia un avvio pulito.
- GetTemperature() – acquisisce dal sensore il dato della temperatura.
- GetPressure() – acquisisce dal sensore il dato della pressione in Pascal.
- GetAltitude() – acquisisce dal sensore il dato dell’altitudine in metri, il risultato ottenuto deve essere corretto per la pressione relativa al punto in cui avviene la misurazione, nel programma deve essere inserito il valore locale nella variabile seaLevelPressure, che di default è pari alla pressione a livello del mare pari a 101325 Pa;
- SetResolution();
- IsConnected() – verifica che il sensore sia effettivamente connesso.
- EnsureConnected() – verifica che sia possibile connettersi con il sensore.
- GetErrorText().
Nota: il dato della pressione è fornito in Pascal (Pa) nel Sistema internazionale pari a 1 newton su metro quadrato (1 N/m²). In ambito meteorologico, la pressione atmosferica si misura in centinaia di Pascal (o etto pascal, abbreviato con hPa). Si ha: 1 013,25 millibar = 101 325 Pa = 1 013,25 hPa
Per utilizzare la libreria sarà sufficiente scaricarla e salvarla all’interno della cartella Library dell’IDE di Arduino. Per utilizzarla all’interno del programma si dovranno aggiungere le seguenti righe:
#include <Wire.h>
#include <BMP180.h>
Taratura del sensore
Per ottenere i valori corretti dell’altitudine bisognerebbe inserire il valore relativo alla propria posizione nella variabile seaLevelPressure, questo di default contiene il valore 101325 (espresso in Pa), valore teorico a livello del mare.
Se non si modifica il valore, questo sarà solamente una stima, in quanto il valore diminuisce all’aumentare di quota.
Si consideri inoltre che il valore locale della pressione dell’aria dipende non solo dell’altitudine, ma anche da altri fattori quali temperatura, umidità relativa, e le condizioni atmosferiche.
Tuttavia, questa stima può essere utile per applicazioni non critiche.
Nota: Per i calcoli impostare il dato in uscita in Pa
Test base del modulo sensore
Materiale occorrente
Per testare il funzionamento del modulo sensore utilizzeremo lo sketch demo allegato alla libreria.
l materiale occorrente è:
- La scheda Arduino UNO R3 smd:
- Sensore di pressione BMP180;
- Cavi di collegamento;
- Breadboard.
Schema dei collegamenti
I collegamenti sono mostrati nella figura sottostante.
Programma di test
Una volta caricato lo sketch si dovrà attivare i monitor seriale dell’IDE, a questo punti si dovrebbero leggere i valori letti dal sensore al ritmo di 1 secondo
Nel caso fosse riportato la scritta “No sensor found”, controllare che il modulo sia correttamente alimentato, e che non siano invertiti i cavi SDA e SCL.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <BMP180.h> LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 20 chars and 4 line display // Store an instance of the BMP180 sensor. BMP180 barometer; // We are going to use the on board LED for an indicator. int indicatorLed = 13; // Store the current sea level pressure at your location in Pascals. float seaLevelPressure = 101325; void setup() { lcd.begin(); // initialize the lcd // We start the serial library to output our messages. Serial.begin(9600); // We start the I2C on the Arduino for communication with the BMP180 sensor. Wire.begin(); // Set up the Indicator LED. pinMode(indicatorLed, OUTPUT); // We create an instance of our BMP180 sensor. barometer = BMP180(); // We check to see if we can connect to the sensor. if(barometer.EnsureConnected()) { Serial.println("Connected to BMP180."); // Output we are connected to the computer. digitalWrite(indicatorLed, HIGH); // Set our LED. // When we have connected, we reset the device to ensure a clean start. barometer.SoftReset(); // Now we initialize the sensor and pull the calibration data. barometer.Initialize(); } else { Serial.println("No sensor found."); digitalWrite(indicatorLed, LOW); // Set our LED. } lcd.backlight(); lcd.setCursor(3, 0); lcd.print("Test BMP180"); lcd.setCursor(0, 1); lcd.print("www.adrirobot.it"); delay(5000); } void loop() { if(barometer.IsConnected) { // Retrive the current pressure in Pascals. long currentPressure = barometer.GetPressure(); // Retrive the current altitude (in meters). Current Sea Level Pressure is required for this. float altitude = barometer.GetAltitude(seaLevelPressure); // Retrive the current temperature in degrees celcius. float currentTemperature = barometer.GetTemperature(); Serial.println(); // Start a new line. lcd.clear(); lcd.setCursor(0, 0); lcd.print(currentPressure); lcd.print(" Pa"); lcd.setCursor(0, 1); lcd.print (altitude); lcd.print (" m"); lcd.setCursor(9, 1); lcd.print (currentTemperature); lcd.print (" C"); delay(1000); // Show new results every second. } } |
Lettura valori su display OLED
Per mostrare i dati rilevati dal sensore è quella di utilizzare un display OLED, per esempio un Display bicolore OLED 0.96″ 128×64 – SSD1306 .
Per interfacciare il modulo, il display utilizza un’interfaccia seriale I2C che richiede solo due pin di dati. Il circuito di reset è a bordo e significa che non è necessario un pin di reset aggiuntivo.
Sia il sensore che il display utilizzano la line I2C, ma avendo due indirizzi diversi non ci sono problemi.
Per altri tipi di display cedere l’articolo Panoramica display LCD, TFT, OLED.
Materiale necessario
Scheda Arduino UNO | Breadboard |
Sensore BMP180 | Display OLED 0.96″ 128×64 – SSD1306 |
Cavi colorati F/F |
Schema dei collegamenti
Sotto è riportato lo schema dei collegamenti
Librerie utilizzate
Per il funzionamento del programma, occorre utilizzare due librerie:
Libreria per gestione sensore BMP180
https://github.com/adafruit/Adafruit-BMP085-Library
Libreria per Display OLED 0.96″ 128×64 – SSD1306
https://github.com/adafruit/Adafruit_SSD1306
Vedete anche l’articolo Arduino – Tutorial, come installare una libreria
Sketch utilizzato
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | //Impostazione sensore BMP180 #include <Adafruit_BMP085.h> Adafruit_BMP085 bmp; // Impostazione OLED #include <Wire.h> #include <Adafruit_SSD1306.h> #define OLED_ADDR 0x3C #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); void setup() { Serial.begin(9600); // initializza e pulisce display display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR); display.display(); delay(1000); display.clearDisplay(); |
Breve video
Altri esempi di utilizzo
Nei prossimi articoli vedremo alcuni esempi di utilizzo tra cui come realizzare una piccola stazione metereologica.