Curso C para Arduino

🖥️ ¿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

🔹 Parte 1: Pantalla LCD 16x2 (basada en HD44780)


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

🔌 Conexión básica (modo paralelo)

LCD PinArduino
VSSGND
VDD5V
VOPotenciómetro (centro)
RS12
RWGND
E11
D45
D54
D63
D72
A (LED+)5V
K (LED-)GND

✅ 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}

📄 Mostrar datos en la segunda línea

1lcd.setCursor(0, 1); // columna 0, fila 1 (segunda línea)
2lcd.print("Temp: 23.5 C");

📋 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}

🔁 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}

🔹 Parte 2: Pantalla OLED I2C (SSD1306)


📦 Requisitos

  • Pantalla OLED 0.96" (SSD1306)
  • 4 pines: VCC, GND, SDA, SCL
  • Librerías necesarias:
    • Adafruit_SSD1306
    • Adafruit_GFX

📌 Instálalas desde el Administrador de bibliotecas en Arduino IDE.


🔌 Conexión típica

PantallaArduino UNO
VCC5V
GNDGND
SDAA4
SCLA5

✅ 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() {}

🧪 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}

✍️ 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ú

🧠 ¿LCD o OLED?

CaracterísticaLCD 16x2OLED 128x64
InterfazParalelo o I2CI2C (fácil)
Píxeles16x2 caracteres128x64 pixeles
Gráficos❌ No✅ Sí (texto + íconos)
BrilloMedioAlto (blanco puro)
CostoBajoMedio-bajo
ConsumoBajoMuy bajo