Código de Pesquisa

Exibindo a Temperatura BMP180 como um Gráfico de Barras no LCD

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).

LCD Bargraph BMP180 LCD1602 wiring

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 above

Essas 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 I2C

Esta 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

Imagens

LCD1602-I2C display module with 4 wires
LCD1602-I2C display module with 4 wires
LCD Bargraph BMP180 LCD1602 wiring
LCD Bargraph BMP180 LCD1602 wiring
BMP180 module 1
BMP180 module 1
BMP180 module 2 back
BMP180 module 2 back
BMP180 module 3 with pin
BMP180 module 3 with pin
195-Display BMP180 temperature as a bar graph on an LCD using Arduino
Idioma: C++
/* 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

Recursos e referências

Arquivos📁

Bibliotecas do Arduino (zip)