Exibindo a Temperatura BMP180 como um Gráfico de Barras no LCD
Exibir a temperatura como um gráfico de barras em uma tela LCD é uma maneira prática de tornar os dados legíveis à primeira vista, especialmente à distância. Em vez de apertar os olhos para enxergar um valor numérico, um gráfico de barras fornece uma representação visual imediata da temperatura atual em relação a um máximo definido. Este projeto combina um sensor de pressão barométrica e temperatura BMP180 com um LCD I2C 16x2 para criar um display de temperatura claro e proporcional. O gráfico de barras se preenche à medida que a temperatura aumenta, e quando a leitura excede o máximo definido, o display muda para mostrar "Max" para evitar transbordamento.

Esta configuração é perfeita para uma variedade de aplicações onde o feedback visual rápido é mais importante do que números precisos:
- Construindo um termômetro visual para uma casa ou escritório.
- Criando um monitor de temperatura para um terrário de répteis ou plantas.
- Exibindo a temperatura da placa de controle de uma impressora 3D ou máquina CNC.
- Fazendo uma estação meteorológica simples com uma leitura de temperatura fácil de visualizar.
- Adicionar um medidor de temperatura visual a uma construção de PC personalizada ou amplificador de áudio.
Este guia irá orientá-lo sobre a fiação do sensor e do display, a configuração do código fornecido e a compreensão de como personalizá-lo para seus próprios projetos. Este tutorial presume que você está familiarizado com os fundamentos do sensor BMP180 e do módulo LCD I2C, pois se concentra em combiná-los com uma biblioteca de gráficos de barras.
Hardware Necessário
- Arduino Uno (ou placa similar)
- Sensor de Pressão Barométrica/Temperatura BMP180
- LCD 16x2 com módulo I2C
- Fios de jumper
- Protoboard (opcional)
Guia de Fiação
Este projeto utiliza o protocolo I2C tanto para o LCD quanto para o sensor BMP180, o que simplifica significativamente a fiação. Ambos os dispositivos se conectam às mesmas duas linhas de dados e trilhos de alimentação. A fiação é simples, e as conexões codificadas por cores abaixo correspondem à demonstração no vídeo.
Primeiro, conecte o módulo LCD. A placa I2C no LCD tem quatro pinos: VCC, GND, SDA e SCL.
- VCC do LCDfio branco para Arduino5V
- GND LCDpara ArduinoGND
- LCD SDA(fio cinza) para ArduinoA4(Pino SDA)
- LCD SCLfio rosa para ArduinoA5(Pino SCL)
Em seguida, conecte o sensor BMP180. É crucial notar que este sensor não é tolerante a 5V em seu pino VIN e deve ser alimentado pela linha de 3,3V.
- BMP180 VINfio cinza para Arduino3.3V(AVISO: Não conecte a 5V ou o sensor será danificado!)
- BMP180 GNDfio roxo para ArduinoGND
- BMP180 SDAfio verde para ArduinoA4(pino SDA)
- BMP180 SCL(fio azul) para ArduinoA5(pino SCL)
Como ambos os dispositivos estão no mesmo barramento I2C, você pode conectar os pinos SDA e SCL deles aos mesmos pinos do Arduino (A4 e A5, respectivamente).

Explicação do Código
O código foi projetado para ser facilmente configurável. As principais configurações estão todas localizadas no topo do esboço, permitindo que você ajuste o comportamento sem precisar entrar na lógica central. Aqui estão os principais parâmetros que você pode alterar:
#define UNIT 'C' // unit type C for Celsius F for Fahrenheit
#define maxTemperature 40 // is the value in Celsius or Fahrenheit set in line aboveEssas duas linhas controlam a unidade e a escala da sua exibição. OUNITconstante aceita ou uma letra maiúscula'C'por Celsius ou um maiúsculo'F'para Fahrenheit. OmaxTemperaturevalor define o limite superior do seu gráfico de barras. Por exemplo, se você definir isso para50e a unidade é Celsius, então 25°C aparecerá como uma barra meio preenchida, e 50°C a preencherá completamente. Se a temperatura ultrapassar este valor, o display mostrará "Max" em vez de um gráfico. (no vídeo às 05:49)
LiquidCrystal_I2C lcd(0x3f,lcdNumCols,lcdLine); //0x3f is address for I2CEsta linha inicializa o LCD. O0x3fé o endereço I2C do seu módulo LCD específico. Este endereço pode variar entre os fabricantes. Para encontrar o seu, você pode executar um sketch de scanner I2C, que geralmente está incluído na biblioteca LCD ou disponível online. Basta carregar o scanner, abrir o Monitor Serial e ele relatará o endereço de qualquer dispositivo I2C conectado. (no vídeo às 07:13)
LcdBarGraphRobojax robojax(&lcd, 16, 0, 0); // -- creating 16 character long bargraph starting at char 0 of line 0 (see video)Esta linha configura o próprio gráfico de barras. O primeiro parâmetro (&lcd) passa uma referência ao seu objeto LCD. O segundo parâmetro (16) é o comprimento do gráfico de barras em caracteres. O terceiro e o quarto parâmetros (0, 0defina a posição inicial: a primeira0é a coluna (posição do caractere), e a segunda0é a linha. Para colocar o gráfico na segunda linha, você precisaria mudar o último valor para1. (no vídeo às 09:24)
Também há uma função personalizada chamadagetTemp()no código. Esta função lida com a comunicação com o sensor BMP180. Ela lê a temperatura, converte para Fahrenheit se você tiver configuradoUNITpara'F', e retorna o valor. Se o sensor falhar em se comunicar, a função retorna999como um código de erro, que o loop principal verifica e exibe uma mensagem de "Erro" no LCD. (no vídeo às 15:31)
Demonstração de Projeto Ao Vivo
No vídeo, o projeto é demonstrado usando um soprador térmico. Quando o soprador térmico é direcionado ao sensor BMP180, a leitura da temperatura no LCD aumenta. À medida que a temperatura sobe, o gráfico de barras se preenche visualmente de forma proporcional. Quando a temperatura excede o máximo definido (50°C na demonstração), o gráfico de barras desaparece e o display mostra "Max" junto com a leitura atual da temperatura. Assim que a fonte de calor é removida e a temperatura cai abaixo do máximo, o gráfico de barras reaparece e funciona normalmente novamente. Isso demonstra claramente como o gráfico escala com a temperatura e como a proteção contra transbordamento "Max" funciona. (no vídeo às 17:34)
Você também pode mudar a unidade para Fahrenheit configurando#define UNIT 'F'e ajustando omaxTemperatureconsequentemente. A demonstração mostra que com um máximo de 100°F, o display funciona da mesma forma, exibindo a temperatura e o gráfico de barras na unidade selecionada.
Capítulos
- [00:00] Introdução à exibição da temperatura BMP180 como um gráfico de barras
- Por que usar um gráfico de barras para exibir a temperatura
- [02:34] Conectando o LCD e o sensor BMP180
- [03:34] Explicando o código e as bibliotecas necessárias
- [07:13] Encontrando o endereço I2C do seu LCD
- [09:24] Configurando a posição e comprimento do gráfico de barras
- [15:31] Compreendendo a função getTemp()
- [17:34] Demonstração ao vivo com uma pistola de calor
/* Display temperature from BMP180 as bargraph on LCD
* Original Sources:
* BMP180 library from https://www.sparkfun.com/products/11824
* LCD library: https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
* Bargraph library from https://playground.arduino.cc/Code/LcdBarGraph/
*
*
* Written and updated by Ahmad Shamshiri on June 05, 2019
* for Robojax in Ajax, Ontario
Watch video tutorial for this code: https://youtu.be/0IojNYgDD7U
If you need the schematic diagram of this circuit, please visit http://bit.ly/rj-udemy
* Robojax Arduino Course on Udemy where you get the schematic diagram of this sketch
* and many other robotics-related lectures and codes. Purchase the course here: http://bit.ly/rj-udemy
- (GND) to GND
+ (VDD) to 3.3V
(WARNING: Do not connect + to 5V or the sensor will be damaged!)
*/
#include <SFE_BMP180.h>
#include <Wire.h>
SFE_BMP180 rjt;// creating object called "rjt" (robojax temperature)
#define UNIT 'C' // unit type C for Celsius F for Fahrenheit
#define maxTemperature 40 // is the value in Celsius or Fahrenheit set in line above
// LCD settings
#include <LiquidCrystal_I2C.h>
byte lcdNumCols = 16; // -- number of columns in the LCD
byte lcdLine = 2; // -- number of lines in the LCD
LiquidCrystal_I2C lcd(0x3f,lcdNumCols,lcdLine); //0x3f is address for I2C
// to get I2C address, run I2C Scanner.
//Link is provided (in same page as this code) at http://robojax.com/learn/arduino
// bargraph settings
#include <LcdBarGraphRobojax.h>
LcdBarGraphRobojax robojax(&lcd, 16, 0, 0); // -- creating 16 character long bargraph starting at char 0 of line 0 (see video)
void setup()
{
Serial.begin(9600);//initialize serial monitor
// -- initializing the LCD
lcd.begin();
lcd.clear();
lcd.print("Robojax");
// Initialize the sensor (it is important to get calibration values stored on the device).
if (rjt.begin())
{
lcd.setCursor (0,1); //
lcd.print("BMP180 Bargraph");
}else {
lcd.setCursor (0,1); //
lcd.print("BMP180 Failed");
while(1); // Pause forever.
}
// -- give use some time to read the text above
delay(2000);
lcd.clear();
}// setup
void loop()
{
// Robojax BMP180 Bargraph main loop
robojax.clearLine(1);// clear line 1 to display fresh temperature
float T = getTemp();// get the temperature
float Tgraph=T;
if(T !=999){
if( Tgraph > maxTemperature){
Tgraph =0;
}
robojax.drawValue( Tgraph, maxTemperature);// draw the bargraph
// Print out the measurement:
Serial.print("temperature: ");
Serial.print(T,2);
lcd.setCursor (0,1); //
if(T< maxTemperature){
lcd.print("Temp.:");
}else{
lcd.print("Max.:");
}
lcd.setCursor (7,1); //
lcd.print(T); // print
lcd.print((char)223);// prints degree symbol
if(UNIT =='C'){
lcd.print("C");//
Serial.println(" deg C");
}else{
lcd.print("F");
Serial.println(" deg F");
}
}else{
Serial.print("Status error");
lcd.setCursor (0,1); //
lcd.print("Error ");
}
delay(500);
}
/*
*
* @brief gets the temperature in Celsius or Fahrenheit
* @param unit, should be capital C or capital F, C=Celsius F=Fahrenheit
* @return temperature in Celsius or Fahrenheit
* Written by Ahmad Shamshiri for Robojax.com
* on Wednesday, June 5th, 2019 at 22:30 in Ajax, Ontario, Canada
*
*/
////////////////////////////////////////////
double getTemp(){
char status;
double Temp,newTemp;
status = rjt.startTemperature();
if (status != 0)
{
// Wait for the measurement to complete:
delay(status);
// Retrieve the completed temperature measurement:
// Note that the measurement is stored in the variable T.
// Function returns 1 if successful, 0 if failure.
status = rjt.getTemperature(Temp);
if (status != 0)
{
if (UNIT =='F')
{
newTemp = (9.0/5.0)*Temp+32.0;// convert to degrees Fahrenheit
}else{
newTemp = Temp;// keeps degree Celsius
}
}
return newTemp;
}else{
return 999;// if error, then return 999
}
}//getTemp/////////////////////////////
Coisas que você pode precisar
-
AmazonasCompre o BMP180 na Amazonamzn.to
Recursos e referências
-
ExternoBiblioteca BMP180 da SparkFungithub.com
-
ExternoDetalhes do produto do fabricantebosch-sensortec.com
-
ExternoFolha de dados BMP180 (PDF)cdn-shop.adafruit.com
-
ExternoIntrodução ao sensor BMP180youtube.com
Arquivos📁
Bibliotecas do Arduino (zip)
-
Biblioteca de Gráfico em Barras LCD Robojax (arquivo ZIP)
robojax-LCD-bargraph-Library.zip0.10 MB