Mostrando la temperatura BMP180 como un gráfico de barras en LCD
Mostrar la temperatura como un gráfico de barras en una pantalla LCD es una forma práctica de hacer que los datos sean legibles de un vistazo, especialmente desde una distancia. En lugar de entrecerrar los ojos ante un valor numérico, un gráfico de barras te brinda una representación visual inmediata de la temperatura actual en relación con un máximo definido. Este proyecto combina un sensor de presión barométrica y temperatura BMP180 con una LCD I2C de 16x2 para crear una pantalla de temperatura clara y proporcional. El gráfico de barras se llena a medida que la temperatura aumenta, y cuando la lectura supera tu máximo establecido, la pantalla cambia para mostrar "Max" y evitar desbordamientos.

Esta configuración es perfecta para una variedad de aplicaciones donde la retroalimentación visual rápida es más importante que los números precisos:
- Construyendo un termómetro visual para una habitación en casa o en la oficina.
- Creando un monitor de temperatura para un recinto de reptiles o terrario de plantas.
- Mostrando la temperatura de la placa de control de una impresora 3D o máquina CNC.
- Construyendo una estación meteorológica sencilla con una lectura de temperatura rápida.
- Agregar un medidor de temperatura visual a una construcción de PC personalizada o a un amplificador de audio.
Esta guía te guiará a través del cableado del sensor y la pantalla, la configuración del código proporcionado y la comprensión de cómo personalizarlo para tus propios proyectos. Este tutorial asume que estás familiarizado con los conceptos básicos del sensor BMP180 y el módulo LCD I2C, ya que se centra en combinarlos con una biblioteca de gráficos de barras.
Hardware requerido
- Arduino Uno (o placa similar)
- Sensor de presión/temperatura barométrica BMP180
- LCD 16x2 con módulo I2C
- Cables de puente
- Placa de pruebas (opcional)
Guía de cableado
Este proyecto utiliza el protocolo I2C tanto para la pantalla LCD como para el sensor BMP180, lo que simplifica significativamente el cableado. Ambos dispositivos se conectan a las mismas dos líneas de datos y rieles de alimentación. El cableado es sencillo, y las conexiones codificadas por colores a continuación coinciden con la demostración en el video.
Primero, conecta el módulo LCD. La placa I2C en el LCD tiene cuatro pines: VCC, GND, SDA y SCL.
- VCC de LCD( cable blanco) a Arduino5V
- GND LCDa ArduinoGND
- LCD SDA(cable gris) al ArduinoA4(Acente de SDA)
- LCD SCLcable rosa al ArduinoA5(Pin SCL)
A continuación, conecta el sensor BMP180. Es fundamental tener en cuenta que este sensor no es tolerante a 5V en su pin VIN y debe ser alimentado desde el riel de 3.3V.
- BMP180 VIN(cable gris) a Arduino3.3V(ADVERTENCIA: ¡No conecte a 5V o el sensor se dañará!)
- BMP180 GND(cable púrpura) a ArduinoGND
- BMP180 SDAcable verde) al ArduinoA4(puerto SDA)
- BMP180 SCL(cable azul) al ArduinoA5(Pin SCL)
Dado que ambos dispositivos están en el mismo bus I2C, puedes conectar sus pines SDA y SCL a los mismos pines de Arduino (A4 y A5, respectivamente).

Explicación del Código
El código está diseñado para ser fácilmente configurable. Los ajustes clave se encuentran todos en la parte superior del boceto, lo que te permite ajustar el comportamiento sin profundizar en la lógica central. Aquí están los principales parámetros que puedes cambiar:
#define UNIT 'C' // unit type C for Celsius F for Fahrenheit
#define maxTemperature 40 // is the value in Celsius or Fahrenheit set in line aboveEstas dos líneas controlan la unidad y la escala de tu pantalla. ElUNITconstante acepta ya sea una mayúscula'C'por Celsius o una mayúscula'F'para Fahrenheit. ElmaxTemperatureel valor define el límite superior de tu gráfico de barras. Por ejemplo, si estableces esto en50y la unidad es Celsius, entonces 25°C aparecerá como una barra medio llena, y 50°C la llenará completamente. Si la temperatura supera este valor, la pantalla mostrará "Max" en lugar de un gráfico. (en el video a las 05:49)
LiquidCrystal_I2C lcd(0x3f,lcdNumCols,lcdLine); //0x3f is address for I2CEsta línea inicializa el LCD. El0x3fes la dirección I2C de tu módulo LCD específico. Esta dirección puede variar entre los fabricantes. Para encontrar la tuya, puedes ejecutar un boceto de escáner I2C, que a menudo se incluye con la biblioteca LCD o está disponible en línea. Simplemente carga el escáner, abre el Monitor Serial, y reportará la dirección de cualquier dispositivo I2C conectado. (en el video a las 07:13)
LcdBarGraphRobojax robojax(&lcd, 16, 0, 0); // -- creating 16 character long bargraph starting at char 0 of line 0 (see video)Esta línea configura el gráfico de barras en sí. El primer parámetro (&lcdpasa una referencia a tu objeto LCD. El segundo parámetro16) es la longitud del gráfico de barras en caracteres. Los tercer y cuarto parámetros (0, 0definir la posición inicial: el primero0es la columna (posición de caracteres), y la segunda0es la fila (línea). Para colocar el gráfico en la segunda línea, deberías cambiar el último valor a1. (en video a las 09:24)
También hay una función personalizada llamadagetTemp()en el código. Esta función maneja la comunicación con el sensor BMP180. Lee la temperatura, la convierte a Fahrenheit si has configuradoUNITa'F', y devuelve el valor. Si el sensor no logra comunicarse, la función devuelve999como un código de error, que el bucle principal verifica y muestra un mensaje de "Error" en la pantalla LCD. (en el video a las 15:31)
Demostración de Proyecto en Vivo
En el video, el proyecto se demuestra utilizando un pistón de calor. Cuando el pistón de calor se sopla sobre el sensor BMP180, la lectura de temperatura en el LCD aumenta. A medida que la temperatura sube, el gráfico de barras se llena visualmente de manera proporcional. Cuando la temperatura supera el máximo definido (50°C en la demostración), el gráfico de barras desaparece y la pantalla muestra "Max" junto con la lectura de temperatura actual. Una vez que se retira la fuente de calor y la temperatura baja nuevamente por debajo del máximo, el gráfico de barras reaparece y funciona normalmente de nuevo. Esto muestra claramente cómo el gráfico se escala con la temperatura y cómo funciona la protección contra sobrepresión "Max". (en video a las 17:34)
También puedes cambiar la unidad a Fahrenheit configurando#define UNIT 'F'y ajustando elmaxTemperatureen consecuencia. La demostración muestra que con un máximo de 100°F, la pantalla funciona de manera igualmente efectiva, mostrando la temperatura y el gráfico de barras en la unidad seleccionada.
Capítulos
- Introducción a la visualización de la temperatura BMP180 como un gráfico de barras
- [00:43] ¿Por qué usar un gráfico de barras para mostrar la temperatura?
- [02:34] Cableado de la pantalla LCD y el sensor BMP180
- [03:34] Explicando el código y las bibliotecas requeridas
- [07:13] Encontrando la dirección I2C de tu LCD
- [09:24] Configurando la posición y longitud del gráfico de barras
- [15:31] Entendiendo la función getTemp()
- [17:34] Demostración en vivo con una 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/////////////////////////////
Cosas que podrías necesitar
-
AmazonasCompra BMP180 en Amazonamzn.to
Recursos y referencias
-
ExternoBiblioteca BMP180 de SparkFungithub.com
-
ExternoDetalles del producto del fabricantebosch-sensortec.com
-
ExternoHoja de datos BMP180 (PDF)cdn-shop.adafruit.com
-
ExternoIntroducción al sensor BMP180youtube.com
Archivos📁
Bibliotecas de Arduino (zip)
-
Biblioteca de gráfico de barras LCD de Robojax (archivo ZIP)
robojax-LCD-bargraph-Library.zip0.10 MB