Lição 96-1: Sensor de Pressão Barométrica, Temperatura e Altitude Aproximada BMP390 com Código Básico Arduino
Este guia orienta você na construção de um sistema de monitoramento ambiental de alta precisão usando o sensor Bosch BMP390 e um Arduino. Diferente de sensores mais antigos como o BMP180 ou BMP280, o BMP390 oferece precisão excepcional, tornando-o ideal para projetos onde pequenas mudanças na pressão ou altitude importam. Este tutorial mostrará como ler temperatura, pressão e altitude aproximada, exibir esses dados em monitores seriais e telas LCD, e até usar as leituras para controlar outros dispositivos como relés.
Este projeto é perfeito para uma ampla gama de aplicações. Aqui estão algumas ideias para começar:
- Estação Meteorológica: Construa uma estação meteorológica doméstica compacta e precisa para rastrear tendências de pressão barométrica e temperatura local.
- Registrador de Elevação e Altitude: Crie um dispositivo para medir e registrar mudanças de altitude, útil para caminhadas, voos de drones ou até mesmo para verificar o andar de um edifício.
- Controlador de Termostato Inteligente: Use a leitura de temperatura para controlar um aquecedor ou cooler via relé, mantendo uma faixa de temperatura específica.
- Monitor de Gabinete Ambiental: Fique de olho nas condições dentro de um rack de servidores, estufa ou gabinete de impressora 3D e acione alarmes ou ventiladores quando os limites forem ultrapassados.
-
BMP380_pink-module-gravitiy-1
Componentes de Hardware
Para acompanhar este projeto, você precisará dos seguintes componentes. O sensor é a estrela do show, mas as opções de display e relé permitem expandir sua funcionalidade.
- Arduino Uno (ou placa similar)
- Módulo Sensor de Pressão Barométrica BMP390
- LCD1602 (16x2) ou LCD2004 (20x4) com interface I2C
- Módulo Relé (para a demonstração de controle)
- Cabos Jumper
- Protoboard (opcional, para conexões fáceis)
Entendendo o Sensor BMP390
O BMP390 é um sensor muito pequeno e de alta precisão da Bosch. Seu tamanho minúsculo (2,0 x 2,0 x 0,75 mm) contradiz suas capacidades impressionantes. Ele pode medir pressão de 300 hPa a 1250 hPa com precisão absoluta de ±0,5 hPa. Isso se traduz em uma incrível precisão relativa de altitude de apenas ±0,25 metros, tornando-o uma atualização significativa em relação aos seus antecessores. O módulo que você compra normalmente inclui um regulador de tensão e conversor de nível lógico, o que significa que é seguro usar com lógica e alimentação de 3,3V e 5V, simplificando sua fiação. Ele se comunica via I2C ou SPI, e usaremos o protocolo I2C mais simples para este projeto.
Guia de Conexões
Conectar o BMP390 é simples. Para este guia, usaremos a interface I2C, que requer apenas quatro fios. O diagrama de conexões abaixo mostra as conexões para um Arduino Uno.
Aqui está a tabela de conexões para o módulo BMP390:
| Módulo BMP390 | Arduino Uno |
|---|---|
| VIN (ou VCC) | 5V (ou 3,3V) |
| GND | GND |
| SDA | A4 (SDA) |
| SCL | A5 (SCL) |
Nota Importante para Projetos com LCD: Se você também estiver usando um display LCD, pode alimentar o sensor a partir de um pino digital do Arduino. No vídeo, o pino 12 é definido como pino de alimentação para o sensor, que é configurado como HIGH na configuração para fornecer 5V. Esta é uma maneira inteligente de gerenciar a energia sem uma protoboard. O SDA e SCL do LCD também estão conectados a A4 e A5, respectivamente.
Explicação do Código
O código para este projeto é projetado para ser modular e fácil de adaptar. Abaixo estão as principais seções configuráveis pelo usuário. O programa completo está disponível para download abaixo do artigo.
1. Inicialização de Biblioteca e Objeto
Primeiro, precisamos incluir as bibliotecas necessárias para a comunicação I2C e o próprio sensor. Em seguida, criamos um objeto para o sensor.
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BMP3XX.h"
Adafruit_BMP3XX bmp; // Cria um objeto chamado 'bmp'
Você pode mudar o nome do objeto de bmp para qualquer coisa que desejar, mas deve atualizar todas as referências a ele no código. A biblioteca Wire.h é essencial para a comunicação I2C.
2. Calibração da Pressão ao Nível do Mar
Esta constante é crucial para leituras precisas de altitude. O sensor calcula a altitude comparando a pressão atual com esta pressão de referência. Você deve atualizar este valor para a pressão ao nível do mar atual do seu local para obter os resultados mais precisos.
#define SEALEVELPRESSURE_HPA (1013.25)
3. Configuração do LCD
Se você estiver usando um LCD, precisará configurar seu endereço I2C e dimensões. O código usa a biblioteca LiquidCrystal_I2C. Você pode encontrar o endereço do seu LCD usando um sketch de varredura I2C, como mostrado no vídeo.
LiquidCrystal_I2C lcd(0x3F, 16, 2); // Endereço 0x3F, 16 caracteres, 2 linhas
Se você estiver usando um LCD 20x4, altere 16, 2 para 20, 4. O endereço I2C 0x3F é comum, mas pode variar. Se o seu display não funcionar, execute um scanner I2C para encontrar o endereço correto.
4. Lógica de Controle (Exemplo com Relé)
Esta seção mostra como usar os dados do sensor para tomar ação. O código verifica se a temperatura excede um limite e liga um relé conectado ao pino 10. Você pode modificar o limite e o número do pino conforme suas necessidades.
if(temperatureC >38.0)
{
digitalWrite(10, HIGH); // Liga o relé
}else{
digitalWrite(10, LOW); // Desliga o relé
}
5. Função Personalizada: readValues()
Esta função personalizada é usada para ler o sensor e armazenar os valores em variáveis globais. Ela simplifica o loop principal e torna o código mais limpo. Ela lê a temperatura em Celsius e também calcula Fahrenheit e Kelvin.
void readValues()
{
temperatureC = bmp.temperature; // Lê a temperatura em Celsius
temperatureF = bmp.temperature * 9/5 + 32; // Converte para Fahrenheit
temperatureK = bmp.temperature + 273.15; // Converte para Kelvin
altitude = bmp.readAltitude(SEALEVELPRESSURE_HPA); // Lê a altitude em metros
pressure = bmp.pressure / 100.0F; // Lê a pressão em hPa
}
Demonstração ao Vivo do Projeto
No vídeo, Robojax demonstra vários testes do sensor em situações reais. Primeiro, ele aplica calor ao sensor com uma pistola de ar quente, mostrando a leitura de temperatura no monitor serial subindo da temperatura ambiente para mais de 60°C e depois esfriando lentamente de volta. Isso confirma a capacidade de resposta do sensor.
Em seguida, ele mostra os dados sendo exibidos em um LCD 16x2 e um 20x4, alternando entre temperatura em Celsius e Fahrenheit, pressão em hPa e altitude aproximada. Ele então demonstra a aplicação de controle do relé, definindo uma temperatura de início de 30°C e uma temperatura de parada de 45°C. Aplicar calor ao sensor faz o relé desligar quando a temperatura excede 45°C, e ele liga novamente quando a temperatura cai abaixo de 30°C.
Finalmente, ele realiza um teste impressionante de altitude. Ele primeiro mede a altitude ao nível do solo (uma pista de patinação no gelo), que registra cerca de -15 metros. Ele então viaja até o 25º andar de um prédio próximo e faz outra medição. O sensor relata uma altitude de aproximadamente 57,2 metros. A diferença entre as duas leituras é de cerca de 72 metros, o que está alinhado com a altura esperada de um prédio de 25 andares. Isso demonstra a capacidade prática do sensor de medir mudanças aproximadas de altitude.
Capítulos
- [00:00] Introdução e Visão Geral do Projeto
- [01:19] Apresentando o Sensor BMP390 e suas Características
- [03:43] Especificações do Sensor do Fabricante
- [05:45] Diagrama de Ligação do BMP390 com Arduino Uno
- [07:48] Diagrama de Ligação do BMP390 com Display LCD
- [09:46] Ligação para Comunicação SPI
- [10:29] Instalando as Bibliotecas Necessárias
- [11:38] Explicação do Código Básico
- [15:46] Adicionando Lógica de Controle (ex.: Ligando um Relé)
- [17:30] Explicação do Código para Display LCD
- [25:09] Código para LCD 20x4 e Comunicação SPI
- [26:22] Demonstração ao Vivo: Aquecendo o Sensor
- [28:05] Demonstração com Displays LCD
- [29:42] Demonstração com LCD 20x4
- [30:07] Demonstração de Controle do Relé com Pistola de Ar Quente
- [32:12] Teste de Altitude em Situação Real no 25º Andar de um Prédio
++
/*
* 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");
}
Coisas que você pode precisar
-
Amazonas
-
AliExpressBMP388 High Precision Digital Atmospheric Pressure on AliExpresss.click.aliexpress.com
-
AliExpressCompre-o no AliExpress.s.click.aliexpress.com
-
BanggoodCompre-o na Banggood.banggood.com
Recursos e referências
-
Externo
-
ExternoCompre-o na Amazon Canadáamzn.to
-
ExternoCompre-o na Amazon, EUA.amzn.to
-
ExternoCompre-o na Banggood.banggood.com
-
ExternoCompre-o no AliExpress.s.click.aliexpress.com
-
ExternoPágina oficial do produto BMP390 da Boschbosch-sensortec.com