Lição 96-4: Sensor de Pressão Barométrica, Temperatura e Altitude Aproximada BMP390 com Arduino como Termostato
Este tutorial demonstra como construir um termostato inteligente usando o sensor de pressão barométrica, temperatura e altitude aproximada BMP390 com um Arduino. O BMP390 é um sensor de alta precisão da Bosch que pode medir temperatura, pressão e calcular altitude aproximada com base na pressão ao nível do mar. Neste projeto, vamos usá-lo para controlar um relé que pode ligar e desligar um aquecedor ou resfriador com base em limites de temperatura, criando um sistema de termostato totalmente funcional.
Este projeto tem várias aplicações práticas, incluindo:
- Criar um termostato doméstico inteligente para manter uma temperatura ambiente confortável
- Construir um sistema de ventilação para estufa controlado por temperatura
- Proteger eletrônicos sensíveis contra superaquecimento
- Controlar uma incubadora para ovos ou répteis
- Monitorar e regular a temperatura em uma adega ou sala de armazenamento
Hardware Necessário
- Arduino Uno (ou placa compatível)
- Módulo sensor de pressão barométrica BMP390
- Módulo de relé (para controlar o aquecedor/resfriador)
- Dispositivo aquecedor ou resfriador para controlar
- Cabos jumper
- Protoboard (opcional)
Entendendo o Sensor BMP390
O BMP390 é um sensor de pressão barométrica de alta precisão fabricado pela Bosch. O sensor em si mede apenas 2mm x 2mm x 0,75mm, tornando-o incrivelmente compacto. A placa de expansão que você usará inclui todos os componentes de suporte necessários, como resistores de pull-up, um regulador de tensão e um conversor de nível lógico, permitindo alimentá-lo com 3,3V ou 5V (no vídeo em 01:44).
O sensor pode medir pressão de 300 a 1250 hectopascais com uma precisão absoluta de ±0,5 hPa entre 0 e 65 graus Celsius. Sua precisão relativa é ainda melhor, em ±0,03 hPa, o que se traduz em aproximadamente ±25 centímetros de diferença de altitude. O sensor também apresenta uma taxa máxima de amostragem de 200 Hz, tornando-o adequado para aplicações que exigem leituras rápidas (no vídeo em 04:10).
Guia de Conexões
Conectar o BMP390 ao seu Arduino é simples usando a interface I2C, que requer apenas dois fios para comunicação de dados, além das conexões de alimentação. O pino VIN do sensor conecta-se ao 5V (ou 3,3V) do Arduino, o terra conecta-se ao terra, o SCL conecta-se ao pino SCL (A5 no Uno) e o SDA conecta-se ao pino SDA (A4 no Uno) (no vídeo em 05:45).
Para o módulo de relé, você conectará seu pino de controle ao pino digital 8 do Arduino, o VCC ao 5V e o terra ao terra. O dispositivo que você deseja controlar (aquecedor ou resfriador) conecta-se aos terminais de saída do relé.
Uma característica única deste projeto é que o código define o pino 12 como saída de alimentação para o módulo BMP390. Isso significa que você pode alimentar o sensor diretamente de um pino do Arduino sem precisar de uma trilha de alimentação separada na protoboard (no vídeo em 08:46). O código define este pino como HIGH na configuração para fornecer 5V ao sensor.
Instalando as Bibliotecas Necessárias
Antes de enviar o código, você precisará instalar a biblioteca Adafruit BMP3XX. Abra o IDE do Arduino, vá em Sketch → Incluir Biblioteca → Gerenciar Bibliotecas, pesquise por "Adafruit BMP3XX" e clique em Instalar (no vídeo em 10:29). Esta biblioteca lida com toda a comunicação de baixo nível com o sensor BMP390.
Explicação do Código
O código para este projeto de termostato foi projetado para ser altamente configurável. Vamos examinar as principais configurações definidas pelo usuário no topo do programa.
Definições de Pinos
Você pode alterar quais pinos do Arduino são usados para a alimentação do sensor e o controle do relé:
int bmpVCCPin = 12;//define o pino 12 como VCC para o sensor bmp
const int relayPin = 8;
O bmpVCCPin fornece alimentação de 5V ao módulo BMP390. O relayPin controla o módulo de relé que liga e desliga seu aquecedor ou resfriador.
Configurações do Termostato
Estas constantes definem como seu termostato se comporta:
const int TEMPERATURE_UNIT = 1;//1=Celsius, 2=Fahrenheit, 3=Kelvin
const float START_TEMPERATURE = 32.0;//unidade acima
const float STOP_TEMPERATURE = 45.0;//unidade acima
const int CONTROL_TYPE = 2;// 1= aquecedor, 2=resfriador- TEMPERATURE_UNIT: Define a escala de temperatura. Use 1 para Celsius, 2 para Fahrenheit ou 3 para Kelvin.
- START_TEMPERATURE: A temperatura na qual o relé liga (no modo aquecedor) ou desliga (no modo resfriador).
- STOP_TEMPERATURE: A temperatura na qual o relé desliga (no modo aquecedor) ou liga (no modo resfriador).
- CONTROL_TYPE: Defina como 1 para controle de aquecedor (liga quando frio) ou 2 para controle de resfriador (liga quando quente).
Por exemplo, na demonstração, a temperatura inicial é definida em 30°C e a temperatura final em 45°C para que você possa testar rapidamente o comportamento com uma pistola de calor. Em uma aplicação real, você definiria valores mais próximos, como 20°C e 23°C, para manter uma temperatura ambiente confortável (no vídeo em 30:07).
Funções Personalizadas
O código inclui várias funções personalizadas que você pode usar e modificar:
- loadControl(): Esta função implementa a lógica do termostato. Ela compara a temperatura atual com seus limites START e STOP e chama
relayControl()de acordo. O comportamento muda dependendo se você definiu CONTROL_TYPE como 1 (aquecedor) ou 2 (resfriador). - relayControl(int state): Esta função liga ou desliga o relé e imprime o status no monitor serial. Passe
relayONourelayOFF. - readValues(): Esta função lê o sensor e armazena temperatura, pressão e altitude em variáveis globais. Ela converte automaticamente a temperatura para a unidade escolhida.
- printTemperature(): Esta função imprime a leitura de temperatura com o símbolo de unidade apropriado no monitor serial.
Como o Termostato Funciona
A lógica do termostato funciona comparando a temperatura atual com os limites configurados. No modo aquecedor (CONTROL_TYPE = 1), quando a temperatura cai para ou abaixo da START_TEMPERATURE, o relé liga para ativar seu dispositivo de aquecimento. O aquecedor permanece ligado até que a temperatura suba até a STOP_TEMPERATURE, momento em que o relé desliga. Isso cria um efeito de histerese que evita ciclos rápidos de ligar/desligar (no vídeo em 31:04).
No modo resfriador (CONTROL_TYPE = 2), a lógica é invertida. O relé liga quando a temperatura atinge ou excede a STOP_TEMPERATURE e desliga quando cai de volta para a START_TEMPERATURE.
A demonstração no vídeo mostra isso funcionando com uma pistola de calor. Quando a temperatura atingiu 45°C, o relé desligou e a luz indicadora apagou. Após esfriar até 30°C, o relé ativou novamente para ligar o aquecedor (no vídeo em 31:53).
Demonstração Prática do Projeto
O vídeo inclui um teste prático de altitude do BMP390. O apresentador levou o sensor a um local em Ajax, Ontário, Canadá, e mediu a altitude ao nível do solo perto de uma pista de patinação no gelo. O sensor inicialmente leu aproximadamente -15 metros, o que representa a diferença entre a calibração local da pressão ao nível do mar e a elevação real daquele ponto (no vídeo em 33:04).
Levando o sensor ao 25º andar de um prédio próximo, a leitura mudou para aproximadamente 57,2 metros. A diferença de cerca de 72 metros entre o térreo e o 25º andar demonstra a capacidade do sensor de detectar mudanças significativas de altitude. Este teste confirma a utilidade do BMP390 para aplicações que exigem monitoramento de elevação (no vídeo em 36:16).
A demonstração do termostato mostra o relé desligando quando a temperatura excedeu o limite de parada de 45°C, com a luz indicadora apagando. Após resfriar o sensor de volta abaixo de 30°C, o relé ativou novamente, demonstrando um controle de temperatura confiável baseado em histerese (no vídeo em 31:04).
Projetos relacionados deste vídeo
- Lição 96-1: Sensor de Pressão Barométrica, Temperatura e Altitude Aproximada BMP390 com Arduino Código Básico
- Lição 96-2: Sensor de Pressão Barométrica, Temperatura e Altitude Aproximada BMP390 com Arduino no LCD1602
- Lição 96-3: Sensor de Pressão Barométrica, Temperatura e Altitude Aproximada BMP390 com Arduino no LCD2004
Capítulos
- [00:00] Introdução ao projeto do sensor BMP390
- [01:19] Entendendo as especificações do sensor BMP390
- [05:45] Diagrama de ligação do BMP390 com Arduino Uno
- [10:29] Instalando a biblioteca Adafruit BMP3XX
- [11:38] Explicação do código para leitura básica do sensor
- [15:51] Adicionando controle de relé para operação do termostato
- [17:30] Configurando o display LCD (opcional)
- [22:52] Exibindo pressão e altitude no LCD
- [30:07] Demonstração do termostato com pistola de calor
- [32:12] Teste de altitude no 25º andar
Imagens
/*
* Lesson 96: Using BMP390 as thermostat
* with Arduino using it as a Thermostat to control a heater or cooler
* Download and resource page https://robojax.com/RJT457
* 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 the Arduino Step by Step Course which starts here: https://youtu.be/-6qSrDUA5a8
If you found this tutorial helpful, please support me so I can continue creating content like this
and make a donation using PayPal http://robojax.com/L/?id=64
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)
Adafruit_BMP3XX bmp;
int bmpVCCPin = 12;//define pin 12 as VCC for bmp sensor
// all thermostat settings
const int relayPin =8;
const int relayON = HIGH;//
const int relayOFF = LOW; //
int relayState = relayOFF;//initial state of relay
const int TEMPERATURE_UNIT =1;//1=Celsius, 2=Fahrenheit, 3=Kelvin
const float START_TEMPERATURE = 32.0;//unit above
const float STOP_TEMPERATURE = 45.0;//unit above
const int CONTROL_TYPE = 2;// 1= heater, 2=cooler
//do not change the line below
float temperature, pressure, altitude;
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println("Adafruit BMP388 / BMP390 test");
pinMode(bmpVCCPin, OUTPUT);// set pin as output
digitalWrite(bmpVCCPin,HIGH);// always keep it high (5V) for BMB390 module
delay(500);//wait for the bmpVCCPin to turn ON.
pinMode(relayPin, OUTPUT);//pin for relay
digitalWrite(relayPin, relayState);//change initial state of relay
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();
printTemperature();
Serial.println();
loadControl();
//do extra action if temperature is greater than 89.5
if(temperature >=89.5)
{
///and your code here
}
delay(2000);//wait 2 seconds or make is less or more
}
/*
* loadControl()
* @brief controls the load based
* @param state can be either : relayON or relayOFF
* @return returns none
* Written by Ahmad Shamshiri for robojax.com
* on Jan 15, 2022 at 08:11 in Ajax, Ontario, Canada
*/
void loadControl()
{
//Robojax.com heater/cooler with BMP390 Thermocoupler
// Serial.print("Start: ");
// Serial.print(START_TEMPERATURE);
// Serial.print(" Stop: ");
//Serial.println(STOP_TEMPERATURE);
if(CONTROL_TYPE ==1)
{
if(START_TEMPERATURE >= temperature && STOP_TEMPERATURE >=temperature)
{
relayControl(relayON);
}
if(STOP_TEMPERATURE <=temperature)
{
relayControl(relayOFF);
}
}else{
if(START_TEMPERATURE >= temperature && STOP_TEMPERATURE >=temperature)
{
relayControl(relayOFF);
}
if(STOP_TEMPERATURE <=temperature)
{
relayControl(relayON);
}
}
//Robojax.com heater/cooler with BMP390 Thermocoupler
}//loadControl()
/*
* relayControl(int state))
* @brief turns the relay ON or OFF
* @param state is "relayON" or "relayOFF" defined at the top of the code
* @return returns none
* Written by Ahmad Shamshiri for robojax.com
* on May 20, 2020 at 15:23 in Ajax, Ontario, Canada
*/
void relayControl(int state)
{
//Robojax.com heater/cooler with BMP390 Thermocoupler
if(state ==relayON)
{
digitalWrite(relayPin, relayON);
Serial.println("Relay ON");
}else{
digitalWrite(relayPin, relayOFF);
Serial.println("Relay OFF");
}
//Robojax.com heater/cooler with BMP390 Thermocoupler
}//relayControl()
/*
* 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 heater/cooler with BMP390 Thermocoupler
altitude = bmp.readAltitude(SEALEVELPRESSURE_HPA);// read altitude
pressure = bmp.pressure / 100.0F; // get pressure in hecto pascal
if(TEMPERATURE_UNIT ==2)
{
temperature = bmp.temperature *9/5 + 32;//convert to Fahrenheit
}else if(TEMPERATURE_UNIT ==3)
{
temperature = bmp.temperature + 273.15;//convert to Kelvin
}else{
temperature = bmp.temperature;// return Celsius
}
//Robojax.com heater/cooler with BMP390 Thermocoupler
}// readValues()
/*
* printTemperature()
* @brief prints temperature on serial monitor
* @param character type
* @param "type" is character
* C = Celsius
* K = Kelvin
* F = Fahrenheit
* @return none
* Written by Ahmad Shamshiri for robojax.com
* on Jan 15, 2022 at 08:09 in Ajax, Ontario, Canada
* www.Robojax.com
*/
void printTemperature()
{
//Robojax.com heater/cooler with BMP390 Thermocoupler
Serial.print(temperature);
printDegree();
if(TEMPERATURE_UNIT ==2)
{
Serial.print("F");
}else if(TEMPERATURE_UNIT ==3)
{
Serial.print("K");
}else{
Serial.print("C");
}
Serial.println();
//Robojax.com heater/cooler with BMP390 Thermocoupler
}//printTemperature()
/*
* @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