Início
/
Projetos Arduino
/
Projetos Squids
/
Básico
/
Projeto101 - Como usar o sensor BMP280 para medir pressão atmosférica, altitude e temperatura com Arduino
Projeto101 - Como usar o sensor BMP280 para medir pressão atmosférica, altitude e temperatura com Arduino
Angelo Luis Ferreira | 29/12/2021
Acessos: 7.896
Básico - Projeto 101
Medindo pressão, temperatura e altitude com BMP280 e display LCD
Objetivo
O objetivo deste projeto é mostrar como utilizar o sensor BMP280 junto com o Arduino para medir a temperatura ambiente, a pressão atmosférica e a altitude. Os valores aferidos são exibidos em um display de LCD através de um menu simples controlado por chaves táteis (push buttons).
Sensor BMP289
Módulo Sensor de Pressão e Temperatura BMP280 é um componente eletrônico desenvolvido pela empresa Bosch capaz de medir com precisão a temperatura ambiente e a pressão atmosférica, apesar do seu tamanho reduzido. Por essa característica o módulo BMP280 se tornou bastante comum em dispositivos móveis e portáteis.
O módulo BMP280 funciona com interfaces I2C ou SPI e tensão mínima de 1,7 V a 3,6 V, sendo que o baixo consumo de energia permite o funcionando por longos períodos com alimentação por bateria, e é indicado para projetos como drones, estações meteorológicas, dispositivos com GPS, relógios, etc.
O BMP280 realiza medições de pressão com precisão de ±1 hPa e temperatura com precisão de ±1 °C. Com essa precisão, é possível realizar medições de altitude local aproximada.
Definições
Pressão atmosférica ou pressão barométrica é a força exercida, por unidade de área, pela coluna de ar atmosférico acima de nós. A pressão atmosférica pode ser lida em diversas unidades, sendo as mais comuns o atm (atmosfera) e o pascal (1 atm =101.325 Pa). Portanto, 1 atm = 1.013,25 hPa (hectopascal).
A pressão atmosférica varia com a altitude e a temperatura: Quanto maior for a altitude, menor será a pressão atmosférica. Ao nível do mar a pressão atmosférica é igual a 1 atm. Sempre que houver aumento da pressão atmosférica, haverá aumento da temperatura. É justamente por isso que, em maiores altitudes, a temperatura tende a ser menor do que ao nível do mar. Leia mais sobre pressão atmosférica: Wikipédia
Referências
Projeto 48 - Como controlar um display LCD com o módulo I2C
Aplicação
Para fins didáticos e projetos que necessitem aferir pressão atmosférica e temperatura ambiente.
Componentes necessários
Referência
|
Componente
|
Quantidade
|
Imagem
|
Observação
|
Protoboard |
Protoboard 830 pontos |
1 |
|
No mínimo utilizar protoboard com 830 pontos
|
Jumpers |
Kit cabos ligação macho / macho |
1 |
|
|
Módulo Sensor de Pressão |
Módulo Sensor de Pressão BMP280
|
1 |
|
Especificações: – BMP280 (datasheet) – Tensão de operação: 1.7V a 3.6V – Consumo de corrente: 2.7µA – Interfaces: I2C e SPI – Faixa de medição pressão: 300 – 1100hPa (equiv. +9000 à -500m acima/abaixo do nível do mar) – Precisão: ±0.12hPa (equiv. ±1m) – Faixa de temperatura: -40 à 85 °C – Precisão temperatura: ±1.0 °C – Dimensões: 15 x 12 x 2,3mm (sem os pinos) |
Display LCD
|
Display LCD 16X2 (com pinos soldados) |
1 |
|
LCD que utilize o controlador HD44780 (veja na descrição ou datasheet do componente)
O display poderá ser de qualquer cor (fundo verde, azul ou vermelho)
|
Módulo I2C para display LCD
|
Módulo I2C com CI PCF8574 |
1 |
|
O módulo I2C poderá vir separado ou já soldado no display LCD
(datasheet)
Se você não possui um módulo I2C para display LCD, poderá adaptar o projeto para o display LCD sem o adaptador.
|
Push Button |
Push button 6X6X5mm |
2 |
|
|
Arduino UNO R3 |
Arduino UNO |
1 |
|
Você poderá utilizar uma placa Arduino UNO original ou similar
|
Montagem do Circuito
Conecte os componentes no Protoboard como mostra a figura abaixo. Verifique cuidadosamente os cabos de ligação antes de ligar seu Arduino. Lembre-se que o Arduino deve estar totalmente desconectado da força enquanto você monta o circuito.
ATENÇÃO: O módulo BMP280 deverá estar conectado no Arduino na fonte de energia 3.3V (Vcc). Tensões muito maiores podem queimar o componente.
Atenção
1. Veja na imagem abaixo a "pinagem" do módulo BMP280, que funciona com interfaces SPI ou I2C.
1.1. Observe que temos os pinos de alimentação Vcc 3.3V e GND, e os pinos de interface: SCL(Clock) e SDA (Data), CSB (Chip Select) e SDO (Serial Data OUT).
1.1.1. Para a interface SPI, usamos os pinos SCL, SDA, CSB e SDO.
1.1.2. Para a interface I2C, vamos usar os pinos SCL, SDA e SDO.
2. No nosso exemplo usamos o protocolo I2C para fazer a montagem do módulo BMP280 no no circuito. Veja abaixo as conexões:
2.1. Para a montagem do módulo bmp280 no Arduino via protocolo I2C, faça a conexão dos pinos SCL e SDA com o Arduino da seguinte forma:
Arduino Uno |
A5 |
A4 |
Arduino Nano |
A5 |
A4 |
Arduino Mega |
21 |
20 |
Leonardo/Micro |
3 |
2 |
2.2. O pino SDO é usado para seleção do endereço I2C: 0x76 com o pino em estado baixo (LOW), e 0x77 para o estado alto (HIGH). No nosso projeto, vamos usar o endereço 0X77, portanto o pino SDO deve estar conectado no Vcc. Veja a imagem abaixo:
3. Neste projeto vamos utilizar um display LCD 16x2 com controlador HD44780, que se adapta aos mais diversos projetos com vários modelos de placas e microcontroladores. Este display possui 16 colunas por 2 linhas com backlight (luz de fundo) verde, azul ou vermelha e tem 16 pinos para a conexão.
4. Para a montagem do display com adaptador, entenda a estrutura do módulo I2C para display LCD 16x2 / 20X4:
4.1. Na lateral do adaptador encontramos 4 pinos, sendo: 2 pinos para alimentação (Vcc e GND) e 2 pinos para conexão com a interface I2C (SDA e SCL) que deverão estar conectados nos pinos analógicos A4 (SDA) e A5 (SCL) do Arduino Uno ou nos pinos A20 (SDA) e A21 (SCL) do Arduino Mega 2560. Veja a tabela abaixo com onde temos as principais placas Arduino e suas conexões com o I2C.
4.2. Para controlar o contraste do display, utilize o potenciômetro de ajuste de contraste. O jumper lateral, quando utilizado, permite que a luz do fundo (backlight) seja controlada pelo programa ou permaneça apagada.
4.3. A seleção de endereço do adaptador I2C para display LCD, na maioria dos módulos fornecidos no mercado já vêm configurados com o com o endereço 0x27. Se você não sabe qual endereço que o seu módulo I2C e/ou módulo RTC DS3231 está configurado, baixe o seguinte "sketch":
DOWNLOAD - I2C_scanner.ino
2.3.1 Após instalar e rodar o sketch acima, abra o monitor serial que mostrará qual é o endereço que o seu módulo I2C está configurado:
4.3.2 Nos casos em que módulo I2C estiver configurado com uma faixa de endereços diferente do endereço 0X27 altere a alinha de programação -> LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); com o endereço correto.
4.4. Para saber mais sobre a montagem e utilização de display LCD com módulo I2C leia: Projeto 48 - Como controlar um display LCD com o módulo I2C.
5. Monte o botão (push button) sem o resistor, pois através da programação vamos habilitar o resistor pull-up interno do Arduino. Desta forma, quando o botão estiver pressionado, o Arduino retornará "LOW" ou "0". Assista o vídeo Arduino: Botão e Resistor de Pull Up Interno
5.1. No nosso exemplo conectamos o botão no pino digital 3 do Arduino.
5. A montagem do nosso exemplo foi realizada em um protoboard com 400 pontos e com um display LCD com comunicação via protocolo I2C (Módulo I2C). Verifique sempre se o seu protoboard possui linhas de alimentação contínuas ou separadas.
Incluindo a biblioteca Adafruit BMP280
Para utilizarmos o módulo BMP280 incluiremos a biblioteca Adafruit BMP280. Esta biblioteca foi escrita para obter, calcular e resolver os dados captados pelos sensores internos do componente, gerando os resultados da pressão atmosférica, altitude local e temperatura ambiente.
Instalação das biblioteca
1. No IDE do Arduino, acesse a aba Sketch, selecione [Incluir Biblioteca] e depois [Gerenciar Bibliotecas...].
2. No campo de pesquisa digite Adafruit BMP280. Localizada a biblioteca BMP280 clique no botão [Instalar].
3.Após a instalação, observe que aparecerá a informação que a biblioteca foi instalada.
Incluindo a biblioteca LiquidCrystal_I2C
Atenção: Caso você opte pela utilização do display de LCD sem o módulo I2C, siga os procedimentos do Projeto 38 - Controlando um display LCD (instalação e comandos básicos) e não instale a biblioteca abaixo.
Para que o módulo I2C funcione corretamente é necessário adicionarmos a biblioteca LiquidCrystal_I2C no IDE do Arduino. Uma das grandes vantagens das placas Arduino é a diversidade de bibliotecas disponíveis que podem ser utilizadas em seus programas. Estas bibliotecas podem ser criadas para a linguagem "C" ou especificamente para o Arduino, reduzindo drasticamente o tempo gasto com programação. Veja a tabela Coletânea de bibliotecas para módulos.
Download dos arquivos da biblioteca LiquidCrystal_I2C
DOWNLOAD - NewliquidCrystal_1.3.4.zip
Para saber detalhes desta biblioteca clique aqui.
Instalando a biblioteca pelo IDE do Arduino
Após fazer o download do arquivo NewliquidCrystal_1.3.4.zip com todos os arquivos da biblioteca compactados no formato zip, abra o IDE do Arduino e siga o tutorial: Como incluir uma biblioteca no IDE do Arduino.
Para instalação e utilização da biblioteca para o módulo I2C como comunicação para um display LCD siga o tutorial: Projeto 48 - Como controlar um display LCD com o módulo I2C.
Testando o componente (BMP280)
Depois de instaladas as bibliotecas, vamos fazer um teste para verificar se o componente é funcional e se as conexões com o Arduino foram feitas corretamente.
1. Copie o código abaixo e cole no IDE do Arduino.
/*******************************************************************************
Projeto 101 (teste) - Medir temperatura, pressão e altitude - BMP280
Autor: Angelo Luis Ferreira
Data: 26/12/2021
http://squids.com.br/arduino
*******************************************************************************/
#include <Wire.h> // biblioteca requerida para rodar I2C
#include <SPI.h> // biblioteca requerida para rodar I2C
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h> // biblioteca BMP280
// Objects create
Adafruit_BMP280 sensor; // cria o objeto sensor
void setup() {
Serial.begin(9600);
Serial.print("Teste modulo BMP280");
sensor.begin();
// verifica a conexão do sensor
if (!sensor.begin()) {
Serial.println("Sensor não encontrado. Verifique as conexoes do circuito!");
//while (1);
} else Serial.println(" - testando");
}
void loop() {
Serial.print("Temeperature: ");
Serial.print(sensor.readTemperature(), 2);
Serial.print(" ºC - Pressure: ");
Serial.print(sensor.readPressure()/101325, 2); // // converte pressão em hPa para atm
Serial.print(" atm - Altitude: ");
Serial.print(sensor.readAltitude(1013.25), 2);
Serial.println(" m");
delay(1000);
}
2. Rode o programa e abra o monitor serial.
2.1. Se o componente está funcionando e as conexões estão corretas, a tela aparecerá conforme figura abaixo:
2.1.1. Observe que a leitura da pressão atmosférica pela biblioteca BMP280 é feita em Pa (pascal). Para convertermos o valor para atm (atmosfera), dividimos o valor por 101325, pois 1 atm = 101.325 Pa (pascal).
2.1.2. Para obtermos a altitude local aproximada, usamos o parâmetro 1.013.25 no comando sensor.readAltitude(1013.25). Usando esse parâmetro vamos obter a altitude do local aferido aproximada em relação ao nível do mar.
2.1.3. Caso o resultado ao abrir o Monitor Serial for "Sensor não encontrado. Verifique as conexoes do circuito!", é porque houve algum erro nas conexões do módulo BMP280 ou porque o componente está danificado. Isso pode ocorrer caso você tenha utilizado uma fonte de energia maior que 3.3V, que é a tensão de operação do componente. Também pode acontecer problemas com o componente no momento da soldagem dos pinos. Por isso, tome muito cuidado com a soldagem dos mesmos.
Código do Projeto (Sketch)
1. Faça o download e abra o arquivo projeto100.ino no IDE do Arduino: DOWNLOAD - projeto101.ino
Obs. 1: Nos casos em que módulo I2C estiver configurado com um endereço diferente do endereço 0X27, altere a alinha de programação -> LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); com o endereço correto. - Veja o tutorial Projeto 48 - Como controlar um display LCD com o módulo I2C
Obs. 2: Se estiver utilizando um display de LCD 20 X 4, altere o comando de inicialização para lcd.begin (20,4);
Obs.3: Se não possuir o módulo I2C utilize apenas o display LCD conforme Projeto 38 - Controlando um display LCD (instalação e comandos básicos) .
2. Se preferir, copie e cole o código abaixo no IDE do Arduino:
/*******************************************************************************
Projeto 101 - Medir temperatura, pressão e altitude - BMP280
Autor: Angelo Luis Ferreira
Data: 06/01/2022
http://squids.com.br/arduino
*******************************************************************************/
#include <Wire.h> // biblioteca requerida para rodar I2C
#include <SPI.h> // biblioteca requerida para rodar I2C
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h> // biblioteca BMP280
#include <LiquidCrystal_I2C.h> // inclui a biblioteca LCD com I2C
// objetos
Adafruit_BMP280 bmp; // cria o objeto bmp
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); // cria o objeto lcd
// pinos conexão com o Arduino
byte btnRight = 12;
byte btnLeft = 11;
// constantes
const byte menuMax = 3; // número de itens do menu
// variáveis globais
byte menu = 1;
unsigned long previous = 0;
void setup() {
//define pinMode (entrada ou saída)
pinMode(btnRight, INPUT_PULLUP);
pinMode(btnLeft, INPUT_PULLUP);
// inicializações
Serial.begin(9600); // inicializa a comunicação serial
lcd.begin(16,2); // inicializa o lcd 16X2 com I2C
bmp.begin(); // inicializa o módulo bmp280
// verifica a conexão do sensor
if (!bmp.begin()) {
Serial.println("Sensor não encontrado. Verifique as conexoes do circuito!");
while (1);
};
}
void loop() {
unsigned long current = millis();
controle(); // le se os botões foram pressionados
// exibe valores a cada 1 segundo (1000ms)
if (current - previous > 2000) {
switch(menu) {
case(1): menu1(); break;
case(2): menu2(); break;
case(3): menu3(); break;
}
previous = current;
}
}
// funções de controle
void controle() {
if (!digitalRead(btnRight)) {
delay(250); // unbounce
if (menu < menuMax) {
menu++;
lcd.clear();
previous = 0;
}
Serial.println(menu);
}
if (!digitalRead(btnLeft)) {
delay(250); // unbounce
if (menu > 1) {
menu--;
lcd.clear();
previous = 0;
}
Serial.println(menu);
}
}
// funçoes do menu
void menu1() {
lcd.setCursor(0,0);
lcd.print(" Temperature >");
lcd.setCursor(5,1);
lcd.print(bmp.readTemperature(), 2);
lcd.setCursor(9,1);
lcd.print((char)223);
lcd.setCursor(10,1);
lcd.print("C");
}
void menu2() {
lcd.setCursor(0,0);
lcd.print("< Pressure >");
lcd.setCursor(4,1);
lcd.print(bmp.readPressure()/101325, 2); // converte pressão em hPa para atm
lcd.setCursor(9,1);
lcd.print("atm");
}
void menu3() {
lcd.setCursor(0,0);
lcd.print("< Altitute ");
lcd.setCursor(6,1);
lcd.print(bmp.readAltitude(1013.25), 0); // altitude local em relação ao nível do mar
lcd.setCursor(10,1);
lcd.print("m");
}
Vídeo
Como o projeto deve funcionar
1. Ao rodar o programa, será exibido no display LCD a temperatura ambiente lida no módulo BMP280. Clique na seta a direita para exibir a pressão atmosférica em atm.
2. Agora, clique na seta a direita para visualizar a altitude local.
3. Na tela agora a altitude local aproximada (em relação ao nível do mar). Para voltar, clique na seta à esquerda, sempre seguindo as setas no menu exibido no display.
Desafios
Com base neste projeto, resolva o seguinte desafio: Desafio 92
O anúncio abaixo ajuda a manter o Squids Arduino funcionando
Comentários