Pantallas LCD y OLED en Arduino
1. Por qué usar una pantalla en Arduino? #
Con una pantalla puedes:
- Mostrar datos en tiempo real (temperatura, humedad, estado, alarmas…)
- Crear interfaces de usuario (menús, opciones)
- Hacer proyectos independientes del PC
- Visualizar errores o eventos del sistema
2. Parte 1: Pantalla LCD 16x2 (basada en HD44780) #
3. Requisitos #
- Pantalla LCD 16x2
- Potenciómetro (10kΩ) para ajustar contraste
- Conexión paralela (o por I2C para ahorrar pines)
- Librería:
LiquidCrystal.h(ya incluida en el IDE de Arduino)
4. Conexión básica (modo paralelo) #
| LCD Pin | Arduino |
|---|---|
| VSS | GND |
| VDD | 5V |
| VO | Potenciómetro (centro) |
| RS | 12 |
| RW | GND |
| E | 11 |
| D4 | 5 |
| D5 | 4 |
| D6 | 3 |
| D7 | 2 |
| A (LED+) | 5V |
| K (LED-) | GND |
5. Código básico con LiquidCrystal.h #
1#include <LiquidCrystal.h> 2 3// RS, E, D4, D5, D6, D7 4LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 5 6void setup() { 7 lcd.begin(16, 2); // LCD de 16 columnas y 2 filas 8 lcd.print("Hola, mundo!"); 9} 10 11void loop() { 12 // nada por ahora 13}
6. Mostrar datos en la segunda línea #
1lcd.setCursor(0, 1); // columna 0, fila 1 (segunda línea) 2lcd.print("Temp: 23.5 C");
7. Ejemplo: Mostrar temperatura desde un LM35 #
1#include <LiquidCrystal.h> 2 3const int sensor = A0; 4LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 5 6void setup() { 7 lcd.begin(16, 2); 8} 9 10void loop() { 11 int lectura = analogRead(sensor); 12 float voltaje = lectura * (5.0 / 1023.0); 13 float tempC = voltaje * 100.0; 14 15 lcd.clear(); 16 lcd.setCursor(0, 0); 17 lcd.print("Temperatura:"); 18 19 lcd.setCursor(0, 1); 20 lcd.print(tempC); 21 lcd.print(" C"); 22 23 delay(1000); 24}
8. Menú interactivo (ejemplo simple) #
1int opcion = 0; 2 3void loop() { 4 lcd.clear(); 5 lcd.setCursor(0, 0); 6 if (opcion == 0) lcd.print("> Estado LED"); 7 else lcd.print(" Estado LED"); 8 9 lcd.setCursor(0, 1); 10 if (opcion == 1) lcd.print("> Temp actual"); 11 else lcd.print(" Temp actual"); 12 13 // cambiar opción con botones (simulado aquí) 14 opcion = (opcion + 1) % 2; 15 delay(1000); 16}
9. Parte 2: Pantalla OLED I2C (SSD1306) #
10. Requisitos #
- Pantalla OLED 0.96" (SSD1306)
- 4 pines: VCC, GND, SDA, SCL
- Librerías necesarias:
Adafruit_SSD1306Adafruit_GFX
📌 Instálalas desde el Administrador de bibliotecas en Arduino IDE.
11. Conexión típica #
| Pantalla | Arduino UNO |
|---|---|
| VCC | 5V |
| GND | GND |
| SDA | A4 |
| SCL | A5 |
12. Código básico con texto #
1#include <Wire.h> 2#include <Adafruit_GFX.h> 3#include <Adafruit_SSD1306.h> 4 5#define ANCHO 128 6#define ALTO 64 7 8Adafruit_SSD1306 oled(ANCHO, ALTO, &Wire, -1); // sin pin RESET 9 10void setup() { 11 oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // dirección I2C común 12 oled.clearDisplay(); 13 14 oled.setTextSize(1); 15 oled.setTextColor(SSD1306_WHITE); 16 oled.setCursor(0, 0); 17 oled.println("Sensor listo..."); 18 oled.display(); 19} 20 21void loop() {}
13. Mostrar datos del sensor DHT11 #
1#include <DHT.h> 2#include <Adafruit_SSD1306.h> 3#include <Adafruit_GFX.h> 4 5#define DHTPIN 2 6#define DHTTYPE DHT11 7 8DHT dht(DHTPIN, DHTTYPE); 9Adafruit_SSD1306 oled(128, 64, &Wire, -1); 10 11void setup() { 12 oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); 13 dht.begin(); 14} 15 16void loop() { 17 float h = dht.readHumidity(); 18 float t = dht.readTemperature(); 19 20 oled.clearDisplay(); 21 oled.setTextSize(1); 22 oled.setTextColor(SSD1306_WHITE); 23 oled.setCursor(0, 0); 24 oled.print("Temp: "); 25 oled.print(t); 26 oled.println(" C"); 27 28 oled.print("Humedad: "); 29 oled.print(h); 30 oled.println(" %"); 31 oled.display(); 32 delay(2000); 33}
14. Crear menús e interfaces en OLED #
- Usa
oled.setCursor(x, y)para posicionar - Puedes dibujar íconos con
oled.drawBitmap() - Botones físicos cambian las opciones del menú
15. LCD o OLED? #
| Característica | LCD 16x2 | OLED 128x64 |
|---|---|---|
| Interfaz | Paralelo o I2C | I2C (fácil) |
| Píxeles | 16x2 caracteres | 128x64 pixeles |
| Gráficos | ❌ No | ✅ Sí (texto + íconos) |
| Brillo | Medio | Alto (blanco puro) |
| Costo | Bajo | Medio-bajo |
| Consumo | Bajo | Muy bajo |
Resumen del tema
Conceptos clave #
- Displays LCD Alfanuméricos (16x2): basados en el controlador HD44780, permiten mostrar caracteres alfanuméricos en dos líneas utilizando la librería estándar
LiquidCrystal.h(en paralelo o con módulo adaptador I2C). - Pantallas Gráficas OLED (SSD1306): pantallas monocromáticas de píxeles conectadas por bus I2C (pines SDA/SCL, dirección típica
0x3C) gestionadas con las libreríasAdafruit_SSD1306yAdafruit_GFX. - Primitivas de Visualización: métodos esenciales como
.clear(),.setCursor(x, y),.print(),.display()y renderizado de gráficos/bitmaps para construir interfaces y menús autónomos. - Criterio de Selección: LCD para proyectos básicos de bajo coste con solo texto; OLED para interfaces gráficas compactas, menor consumo y mejor visibilidad angular.
Qué debes recordar #
En pantallas OLED que utilizan Adafruit_SSD1306, cualquier cambio gráfico o de texto requiere ejecutar oled.display() para actualizar físicamente la imagen en pantalla.