Ir al contenido
← Volver a Formación Arduino Avanzado

25. Estación meteorológica con registro en OLED

Mide temperatura, humedad, luz y lluvia, y los muestra en pantalla con tendencias. Integra varios sensores en un solo sistema.

Dificultad: Avanzado · Tiempo: 100 min · Cerebro: Arduino Uno

🧰 Lista de materiales

Arduino Uno R3 (ATmega328P)
Arduino Uno R3 (ATmega328P)
Recoge y muestra los datos
sin foto
Pods temp/humedad Wi-Fi
Temperatura y humedad (o DHT)
Fotorresistencia LDR GL5537
Fotorresistencia LDR GL5537
Nivel de luz
sin foto
Módulo sensor agua/lluvia
Detección de lluvia
sin foto
Pantalla OLED I2C 0,96" (SSD1306)
Panel de datos
Breadboard 830 puntos
Breadboard 830 puntos
Montaje

🎯 Qué vas a aprender

A integrar múltiples sensores en un solo programa bien organizado, gestionar lecturas periódicas sin bloquear, y presentar varios datos en una pantalla con histórico de tendencia.

📚 Teoría: muestreo periódico y organización

Con varios sensores, la clave es estructurar el código: una función por sensor, un temporizador con millis() que dispara la lectura cada N segundos, y una pantalla que se refresca aparte. Guardamos un pequeño histórico en un array para dibujar una mini-gráfica de tendencia.

🔌 Conexiones

SensorPin
Temp/humedad (DHT data)D2
LDR (divisor)A0
Lluvia AOA1
OLED SDA / SCLA4 / A5

💻 Código completo

// Estación meteorológica multisensor con OLED
#include 
#include 
#include 

Adafruit_SSD1306 oled(128, 64, &Wire, -1);
const int PIN_LDR = A0, PIN_LLUVIA = A1;

float temp = 0, hum = 0;
int luz = 0; bool lluvia = false;
float historico[64]; int hidx = 0;

unsigned long ultimaLectura = 0;
const unsigned long INTERVALO = 3000;

float leerTemp() { return 21.0 + random(-15, 15) / 10.0; } // sustituir por DHT
float leerHum()  { return 50.0 + random(-30, 30) / 10.0; } // sustituir por DHT

void leerSensores() {
  temp   = leerTemp();
  hum    = leerHum();
  luz    = map(analogRead(PIN_LDR), 0, 1023, 0, 100);
  lluvia = analogRead(PIN_LLUVIA) < 500;
  historico[hidx] = temp;
  hidx = (hidx + 1) % 64;
}

void pintar() {
  oled.clearDisplay();
  oled.setTextColor(SSD1306_WHITE);
  oled.setTextSize(1);
  oled.setCursor(0, 0);  oled.print("T:"); oled.print(temp,1); oled.print((char)247); oled.print("C");
  oled.setCursor(70, 0); oled.print("H:"); oled.print(hum,0);  oled.print("%");
  oled.setCursor(0, 12); oled.print("Luz:"); oled.print(luz); oled.print("%");
  oled.setCursor(70, 12);oled.print(lluvia ? "LLUVIA" : "Seco");

  // mini-gráfica de temperatura (20..30 C -> alto)
  for (int x = 0; x < 64; x++) {
    int i = (hidx + x) % 64;
    int y = map((int)(historico[i]*10), 200, 300, 63, 28);
    oled.drawPixel(x * 2, constrain(y, 28, 63), SSD1306_WHITE);
  }
  oled.display();
}

void setup() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  leerSensores();
}

void loop() {
  if (millis() - ultimaLectura > INTERVALO) {
    ultimaLectura = millis();
    leerSensores();
  }
  pintar();
  delay(200);
}

🛠️ Montaje paso a paso

  1. Monta el divisor de la LDR (A0) y el sensor de lluvia (A1).
  2. Conecta el sensor temp/humedad (sustituye las funciones simuladas por DHT).
  3. Cablea la OLED al bus I2C.
  4. Sube el sketch y observa el panel con la mini-gráfica.

🧩 Resolución de problemas

SíntomaCausaSolución
Datos congeladosmillis() mal usadoVerifica el temporizador
Gráfica planaHistórico no se llenaComprueba el índice circular
OLED no muestraDirección/busEscanea I2C, prueba 0x3D

🚀 Para ir más lejos

  • Registra datos en una tarjeta SD o envíalos por Wi-Fi (Pico W / ESP).
  • Integra los sensores Zigbee/Wi-Fi del inventario para multi-habitación.
← Volver a Formación Arduino