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.
🧰 Lista de materiales
🎯 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
| Sensor | Pin |
|---|---|
| Temp/humedad (DHT data) | D2 |
| LDR (divisor) | A0 |
| Lluvia AO | A1 |
| OLED SDA / SCL | A4 / 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
- Monta el divisor de la LDR (A0) y el sensor de lluvia (A1).
- Conecta el sensor temp/humedad (sustituye las funciones simuladas por DHT).
- Cablea la OLED al bus I2C.
- Sube el sketch y observa el panel con la mini-gráfica.
🧩 Resolución de problemas
| Síntoma | Causa | Solución |
|---|---|---|
| Datos congelados | millis() mal usado | Verifica el temporizador |
| Gráfica plana | Histórico no se llena | Comprueba el índice circular |
| OLED no muestra | Dirección/bus | Escanea 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.