Lezione 96-1: Sensore di pressione barometrica, temperatura e altitudine approssimativa BMP390 con codice base Arduino
Questa guida ti accompagna nella costruzione di un sistema di monitoraggio ambientale ad alta precisione utilizzando il sensore Bosch BMP390 e un Arduino. A differenza di sensori più vecchi come il BMP180 o il BMP280, il BMP390 offre una precisione eccezionale, rendendolo ideale per progetti in cui piccole variazioni di pressione o altitudine sono importanti. Questo tutorial ti mostrerà come leggere temperatura, pressione e altitudine approssimativa, visualizzare questi dati su monitor seriali e schermi LCD, e persino utilizzare le letture per controllare altri dispositivi come i relè.
Questo progetto è perfetto per un'ampia gamma di applicazioni. Ecco alcune idee per iniziare:
- Stazione meteorologica: Costruisci una stazione meteorologica domestica compatta e precisa per monitorare le tendenze della pressione barometrica e la temperatura locale.
- Registratore di elevazione e altitudine: Crea un dispositivo per misurare e registrare i cambiamenti di altitudine, utile per escursioni, voli di droni o anche per verificare il piano di un edificio.
- Controller per termostato intelligente: Usa la lettura della temperatura per controllare un riscaldatore o un raffreddatore tramite un relè, mantenendo un intervallo di temperatura specifico.
- Monitor per contenitori ambientali: Tieni d'occhio le condizioni all'interno di un rack di server, una serra o un contenitore per stampante 3D e attiva allarmi o ventole quando vengono superate le soglie.
-
BMP380_pink-module-gravitiy-1
Componenti hardware
Per seguire questo progetto, avrai bisogno dei seguenti componenti. Il sensore è il protagonista, ma le opzioni di display e relè ti permettono di espandere le sue funzionalità.
- Arduino Uno (o scheda simile)
- Modulo sensore di pressione barometrica BMP390
- LCD1602 (16x2) o LCD2004 (20x4) con interfaccia I2C
- Modulo relè (per la dimostrazione di controllo)
- Cavi jumper
- Breadboard (opzionale, per connessioni facili)
Capire il sensore BMP390
Il BMP390 è un sensore molto piccolo e ad alta precisione di Bosch. Le sue dimensioni ridotte (2,0 x 2,0 x 0,75 mm) nascondono capacità impressionanti. Può misurare la pressione da 300 hPa a 1250 hPa con una precisione assoluta di ±0,5 hPa. Questo si traduce in un'incredibile precisione relativa dell'altitudine di soli ±0,25 metri, rendendolo un aggiornamento significativo rispetto ai suoi predecessori. Il modulo che acquisti include tipicamente un regolatore di tensione e un convertitore di livello logico, il che significa che è sicuro da usare sia con logica e alimentazione a 3,3 V che a 5 V, semplificando il cablaggio. Comunica tramite I2C o SPI, e per questo progetto useremo il protocollo I2C più semplice.
Guida al cablaggio
Collegare il BMP390 è semplice. Per questa guida, useremo l'interfaccia I2C, che richiede solo quattro fili. Lo schema di cablaggio qui sotto mostra le connessioni per un Arduino Uno.
Ecco la tabella di connessione per il modulo BMP390:
| Modulo BMP390 | Arduino Uno |
|---|---|
| VIN (o VCC) | 5V (o 3,3V) |
| GND | GND |
| SDA | A4 (SDA) |
| SCL | A5 (SCL) |
Nota importante per progetti con LCD: Se stai usando anche un display LCD, puoi alimentare il sensore da un pin digitale di Arduino. Nel video, il pin 12 è definito come pin di alimentazione per il sensore, che viene impostato su HIGH nel setup per fornire 5V. Questo è un modo intelligente per gestire l'alimentazione senza breadboard. Anche SDA e SCL dell'LCD sono collegati rispettivamente ad A4 e A5.
Spiegazione del codice
Il codice per questo progetto è progettato per essere modulare e facile da adattare. Di seguito sono riportate le sezioni chiave configurabili dall'utente. Il programma completo è disponibile per il download sotto l'articolo.
1. Inizializzazione di librerie e oggetti
Prima di tutto, dobbiamo includere le librerie necessarie per la comunicazione I2C e per il sensore stesso. Creiamo quindi un oggetto per il sensore.
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BMP3XX.h"
Adafruit_BMP3XX bmp; // Crea un oggetto chiamato 'bmp'
Puoi cambiare il nome dell'oggetto da bmp a qualsiasi cosa tu voglia, ma devi aggiornare tutti i riferimenti ad esso nel codice. La libreria Wire.h è essenziale per la comunicazione I2C.
2. Calibrazione della pressione a livello del mare
Questa costante è fondamentale per letture accurate dell'altitudine. Il sensore calcola l'altitudine confrontando la pressione attuale con questa pressione di riferimento. Dovresti aggiornare questo valore con la pressione a livello del mare attuale per la tua posizione per ottenere i risultati più accurati.
#define SEALEVELPRESSURE_HPA (1013.25)
3. Configurazione LCD
Se stai utilizzando un LCD, dovrai configurare il suo indirizzo I2C e le dimensioni. Il codice utilizza la libreria LiquidCrystal_I2C. Puoi trovare l'indirizzo del tuo LCD utilizzando uno sketch scanner I2C, come mostrato nel video.
LiquidCrystal_I2C lcd(0x3F, 16, 2); // Indirizzo 0x3F, 16 caratteri, 2 righe
Se stai utilizzando un LCD 20x4, cambia 16, 2 in 20, 4. L'indirizzo I2C 0x3F è comune, ma può variare. Se il tuo display non funziona, esegui uno scanner I2C per trovare l'indirizzo corretto.
4. Logica di controllo (Esempio con relè)
Questa sezione mostra come utilizzare i dati del sensore per agire. Il codice verifica se la temperatura supera una soglia e attiva un relè collegato al pin 10. Puoi modificare la soglia e il numero del pin in base alle tue esigenze.
if(temperatureC >38.0)
{
digitalWrite(10, HIGH); // Attiva il relè
}else{
digitalWrite(10, LOW); // Disattiva il relè
}
5. Funzione personalizzata: readValues()
Questa funzione personalizzata viene utilizzata per leggere il sensore e memorizzare i valori in variabili globali. Semplifica il loop principale e rende il codice più pulito. Legge la temperatura in Celsius e calcola anche Fahrenheit e Kelvin.
void readValues()
{
temperatureC = bmp.temperature; // Legge la temperatura in Celsius
temperatureF = bmp.temperature * 9/5 + 32; // Converte in Fahrenheit
temperatureK = bmp.temperature + 273.15; // Converte in Kelvin
altitude = bmp.readAltitude(SEALEVELPRESSURE_HPA); // Legge l'altitudine in metri
pressure = bmp.pressure / 100.0F; // Legge la pressione in hPa
}
Dimostrazione dal vivo del progetto
Nel video, Robojax dimostra diversi test reali del sensore. Prima, applica calore al sensore con una pistola termica, mostrando la lettura della temperatura sul monitor seriale che sale dalla temperatura ambiente a oltre 60°C e poi si raffredda lentamente. Questo conferma la reattività del sensore.
Successivamente, mostra i dati visualizzati sia su un LCD 16x2 che su un 20x4, ciclando tra temperatura in Celsius e Fahrenheit, pressione in hPa e altitudine approssimativa. Poi dimostra l'applicazione di controllo del relè, impostando una temperatura di avvio di 30°C e una temperatura di arresto di 45°C. Applicando calore al sensore, il relè si spegne quando la temperatura supera i 45°C e si riaccende quando la temperatura scende sotto i 30°C.
Infine, esegue un impressionante test di altitudine. Prima misura l'altitudine a livello del suolo (una pista di pattinaggio sul ghiaccio), che legge circa -15 metri. Poi si reca al 25° piano di un edificio vicino e effettua un'altra misurazione. Il sensore riporta un'altitudine di circa 57,2 metri. La differenza tra le due letture è di circa 72 metri, che si allinea bene con l'altezza prevista di un edificio di 25 piani. Questo dimostra la capacità pratica del sensore di misurare variazioni approssimative di altitudine.
Capitoli
- [00:00] Introduzione e panoramica del progetto
- [01:19] Introduzione al sensore BMP390 e alle sue caratteristiche
- [03:43] Specifiche del sensore dal produttore
- [05:45] Schema di collegamento per BMP390 con Arduino Uno
- [07:48] Schema di collegamento per BMP390 con display LCD
- [09:46] Collegamento per comunicazione SPI
- [10:29] Installazione delle librerie richieste
- [11:38] Spiegazione del codice di base
- [15:46] Aggiunta della logica di controllo (es. attivazione di un relè)
- [17:30] Spiegazione del codice per display LCD
- [25:09] Codice per LCD 20x4 e comunicazione SPI
- [26:22] Dimostrazione dal vivo: riscaldamento del sensore
- [28:05] Dimostrazione con display LCD
- [29:42] Dimostrazione con LCD 20x4
- [30:07] Dimostrazione del controllo del relè con pistola termica
- [32:12] Test di altitudine reale in un edificio al 25° piano
++
/*
* Lesson 96: Using Precision BMP390 Barometric Pressure and Temperature Sensor
* with Arduino
Download and resource page https://robojax.com/RJT454
* Watch video instruction on YouTube: https://youtu.be/XevQYG_A5xA
*
* Code updated by Ahmad Shamshiri for Robojax.com
* on Jan 13, 2022 at 17:10 in Ajax, Ontario, Canada
This video is part of Arduino Step by Step Course which starts here: https://youtu.be/-6qSrDUA5a8
This is a library for the BMP390 temperature & pressure sensor
Designed specifically to work with the Adafruit BMP388 Breakout
----> http://www.adafruit.com/products/3966
These sensors use I2C or SPI to communicate, 2 or 4 pins are required
to interface.
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing products
from Adafruit!
Written by Limor Fried & Kevin Townsend for Adafruit Industries.
BSD license, all text above must be included in any redistribution
**************************************************************************
*/
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BMP3XX.h"
#define SEALEVELPRESSURE_HPA (1013.25)
float temperatureC, temperatureK, temperatureF, pressure, altitude;
Adafruit_BMP3XX bmp;
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println("Adafruit BMP388 / BMP390 test");
if (!bmp.begin_I2C()) { // hardware I2C mode, can pass in address & alt Wire
Serial.println("Could not find a valid BMP3 sensor, check wiring!");
while (1);
}
// Set up oversampling and filter initialization
bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X);
bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X);
bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3);
bmp.setOutputDataRate(BMP3_ODR_50_HZ);
}
void loop() {
if (! bmp.performReading()) {
Serial.println("Failed to perform reading :(");
return;
}
readValues();
Serial.print("Temperature C: ");
Serial.print(temperatureC);
printDegree();
Serial.println(" C");
Serial.print("Pressure: ");
Serial.print(pressure);
Serial.println(" hPa");
Serial.print("Approximate Altitude: ");
Serial.print(altitude);
Serial.println(" m");
Serial.println();
if(temperatureC >38.0)
{
digitalWrite(10, HIGH);
}else{
digitalWrite(10, LOW);
}
delay(2000);
}
/*
* readValues()
* @brief reads the temperature based on the TEMPERATURE_UNIT
* @param average temperature
* @return returns one of the values above
* Written by Ahmad Shamshiri for robojax.com
* on Jan 15, 2022 at 08:02 in Ajax, Ontario, Canada
*/
void readValues()
{
//Robojax.com BMP390
temperatureC = bmp.temperature;// return Celsius
temperatureF = bmp.temperature *9/5 + 32;//convert to Fahrenheit
temperatureK = bmp.temperature + 273.15;//convert to Kelvin
altitude = bmp.readAltitude(SEALEVELPRESSURE_HPA);// read altitude
pressure = bmp.pressure / 100.0F; // get pressure in hecto pascal
}// readValues()
/*
* @brief prints degree symbol on serial monitor
* @param none
* @return returns nothing
* Written by Ahmad Shamshiri on July 13, 2019
* for Robojax Tutorial Robojax.com
*/
void printDegree()
{
Serial.print("\\xC2");
Serial.print("\\xB0");
}
Cose di cui potresti avere bisogno
-
Amazon
-
AliExpressAcquistalo su AliExpresss.click.aliexpress.com
-
AliExpressBMP388 High Precision Digital Atmospheric Pressure on AliExpresss.click.aliexpress.com
-
BanggoodAcquistalo su Banggoodbanggood.com
Risorse e riferimenti
-
Esterno
-
EsternoAcquistalo su AliExpresss.click.aliexpress.com
-
EsternoAcquistalo su Amazon Canadaamzn.to
-
EsternoAcquistalo su Amazon, USAamzn.to
-
EsternoAcquistalo su Banggoodbanggood.com
-
EsternoPagina ufficiale del prodotto BMP390 Boschbosch-sensortec.com