Código de Pesquisa

Lição 96-1: Sensor de Pressão Barométrica, Temperatura e Altitude Aproximada BMP390 com Código Básico Arduino

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.

BMP380_pink-module-1

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

BMP390_arduino_wiring_2-gravity-module-sda-scl-pins
BMP390_arduino_wiring_2-gravity-module
BMP390_arduino_wiring_pink-1-from-sda-scl-pins
BMP390_arduino_wiring_pink-2
BMP380_pink-module-4

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

Imagens

BMP380_pink-module-4
BMP380_pink-module-4
BMP380_pink-module-3-size
BMP380_pink-module-3-size
BMP380_pink-module-2
BMP380_pink-module-2
BMP380_pink-module-1
BMP380_pink-module-1
BMP380_pink-module-gravitiy-1
BMP380_pink-module-gravitiy-1
BMP390_arduino_wiring_2-gravity-module-sda-scl-pins
BMP390_arduino_wiring_2-gravity-module-sda-scl-pins
BMP390_arduino_wiring_2-gravity-module
BMP390_arduino_wiring_2-gravity-module
BMP390_arduino_wiring_pink-1-from-sda-scl-pins
BMP390_arduino_wiring_pink-1-from-sda-scl-pins
BMP390_arduino_wiring_pink-2
BMP390_arduino_wiring_pink-2
434-Lesson 96-1: Basic code for BMP390
Idioma: C++
++
/*
 * 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");  
}

Recursos e referências

Arquivos📁

Folha de dados (pdf)