Estación Meteorológica Inteligente con Arduino UNO e Integración AWS
Componentes y Suministros
| Componente | Descripción | Cantidad |
|---|---|---|
| Arduino UNO | Microcontrolador principal | 1 |
| Cable USB-A a Micro-USB | Programación y alimentación | 1 |
| Protoboard (genérica) | Montaje circuito | 1 |
| Cables jumper (genéricos) | Conexiones | 1 |
| Metacrilato (Plexiglass) 4mm | Caja protectora | 1 |
| Resistencia 221 ohm | Limitación corriente | 1 |
| Pantalla LCD Adafruit 16x2 Blanco/Azul | Visualización datos | 1 |
| RTC DS1307 (I²C) | Reloj tiempo real con batería | 1 |
| Fotorresistencia (LDR) | Sensor nivel de luz/oscuridad | 1 |
| DHT11 Temperatura y Humedad (4 pines) | Sensor T° y H% digital | 1 |
| Sensor Temperatura LM35 | Sensor temperatura analógico preciso | 1 |
| Receptor IR (genérico) | Control remoto infrarrojo | 1 |
| Sensor Nivel Agua | Detección nivel fluido | 1 |
| Kit RFID Sunfounder Starter | Módulo RFID (uso opcional) | 1 |
Herramientas Necesarias
- Cortadora láser (genérica) - Para fabricar caja de metacrilato
Sobre el Proyecto
AWS (Arduino Weather Station) proporciona datos ambientales precisos las 24 horas. Basado en Arduino UNO, soporta un completo conjunto de sensores para análisis ambiental.
Objetivo
Detectar datos mediante los sensores descritos e interfacarlos al usuario mediante pantalla LCD. El tamaño reducido permite encerrarlo en una caja pequeña fabricada con cortadora láser.
Sensores Utilizados
Sensor Nivel Agua/Nieve
Indica nivel de agua en depósitos elevados, evitando desbordamientos y permitiendo conocer el nivel en cualquier momento.
Sensor DHT11 Humedad y Temperatura
Sensor digital calibrado con salida de señal digital. Combina tecnología de captura específica y sensor digital para alta fiabilidad y estabilidad a largo plazo. Respuesta rápida, anti-interferencias, bajo coste.
Fotorresistencia (LDR)
Resistencias dependientes de la luz. Indican presencia/ausencia de luz o miden intensidad. En oscuridad resistencia muy alta; expuestas a luz, resistencia cae drásticamente (incluso a pocos ohmios).
Pantalla LCD I2C 1602
Bus serie de alto rendimiento con función de sincronización y arbitraje para sistemas multi-master. Potenciómetro azul ajusta retroiluminación. Usa solo dos líneas bidireccionales (SDA, SCL) con pull-up. Tensiones típicas +5V o +3.3V.
Módulo RTC DS1302
Basado en integrado DS1302 con reloj/calendario tiempo real y 31 bytes RAM estática. Formato hora hh/mm/ss, fecha yyyy/mm/dd.
Sensor Temperatura LM35
Sensor de precisión. ADC convierte valores analógicos a digitales: ADC = muestra * 1024 / voltaje referencia (+5V). Con referencia 5V, aproximación digital = voltaje entrada * 205.
Receptor IR y Control Remoto
Trabajan en conjunto: receptor IR recibe datos del mando. Botones asignados:
- Botón 0: Hora y fecha en LCD
- Botón 1: Temperatura (LM35) y humedad (DHT11)
- Botón 2: Porcentaje de oscuridad (LDR)
- Botón 3: Nivel fluido (mm)
- Botón "Cycle": Cicla todas las pantallas cada 4 segundos (una vuelta)
El AWS (Arduino Weather Station)
Paso 1: Construcción de la Caja
Diseñadas caras con AutoCAD (tamaños, encajes, agujeros para sensores), cortadas con láser y ensambladas con pegamento fuerte.
Paso 2: Esquemático y Conexiones
Esquemático realizado con Fritzing. Conexiones sencillas.
Paso 3: Programación Arduino
Código en Arduino IDE con todas las librerías necesarias.
Paso 4: Funcionamiento
AWS recoge datos ambientales y los muestra en LCD controlado por mando IR. 5 pantallas intercambiables:
- Pantalla Inicio: "Arduino Weather Station" con efecto fading. Se muestra al encender y tras cada consulta.
- Fecha y Hora (Botón 0): Acceso directo, 10s de visualización, retorno a Inicio.
- Humedad y Temperatura (Botón 1): Datos DHT11 y LM35, 10s, retorno a Inicio.
- Oscuridad (Botón 2): Porcentaje oscuridad en LDR, 10s, retorno a Inicio.
- Nivel Fluido (Botón 3): Altura fluido en mm, 10s, retorno a Inicio.
Modo Cycle: recorre las 4 pantallas cada 4s (una sola vuelta).
Precauciones
- Evitar contacto de líquidos/sustancias dañinas con la placa.
- Tras precipitaciones, vaciar recipiente agua, revisar y limpiar sensor.
- Batería recargable ~2 días. Recargar ~2 horas si se agota.
- Sensor IR puede fallar a bajas temperaturas (~0°C). Solución: abrir caja y pulsar reset.
- Al pulsar reset, RTC DS1302 mantiene fecha/hora gracias a pila interna (~10 años).
- Si se quita alimentación, fecha/hora cambian. Reconfigurar en código comentando/descomentando líneas de inicialización RTC.
Código
//include sketch libraries
#include <IRremote.h>
#include <stdio.h>
#include <string.h>
#include <DS1302.h>
#include <dht.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#define lmPin A1
LiquidCrystal_I2C lcd(0x27, 16, 2);
dht DHT;
const int DHT11_PIN = 4;
const int waterSensor = 0;
int waterValue = 0;
int mmwaterValue = 0;
int sensorPin = A3;
int luce = 0;
int pluce = 0;
float tem = 0;
long lmVal = 0;
const int irReceiverPin = 3;
IRrecv irrecv(irReceiverPin);
decode_results results;
uint8_t RST_PIN = 5;
uint8_t SDA_PIN = 6;
uint8_t SCL_PIN = 7;
char buf[50];
char day[10];
DS1302 rtc(RST_PIN, SDA_PIN, SCL_PIN);
void print_time() {
Time t = rtc.time();
memset(day, 0, sizeof(day));
switch (t.day) {
case 1: strcpy(day, "Sun"); break;
case 2: strcpy(day, "Mon"); break;
case 3: strcpy(day, "Tue"); break;
case 4: strcpy(day, "Wed"); break;
case 5: strcpy(day, "Thu"); break;
case 6: strcpy(day, "Fri"); break;
case 7: strcpy(day, "Sat"); break;
}
snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
Serial.println(buf);
lcd.setCursor(2, 0);
lcd.print(t.yr); lcd.print("-"); lcd.print(t.mon / 10); lcd.print(t.mon % 10);
lcd.print("-"); lcd.print(t.date / 10); lcd.print(t.date % 10); lcd.print(" "); lcd.print(day);
lcd.setCursor(4, 1);
lcd.print(t.hr); lcd.print(":"); lcd.print(t.min / 10); lcd.print(t.min % 10);
lcd.print(":"); lcd.print(t.sec / 10); lcd.print(t.sec % 10);
}
void setup() {
Serial.begin(9600);
rtc.write_protect(false);
rtc.halt(false);
irrecv.enableIRIn();
lcd.init();
lcd.backlight();
pinMode(sensorPin, INPUT);
Time t(2017, 12, 9, 11, 20, 00, 7);
rtc.time(t);
}
void loop() {
// Animación "Arduino Weather Station" letra a letra
lcd.setCursor(0, 0); lcd.print("A"); delay(50);
lcd.setCursor(1, 0); lcd.print("r"); delay(50);
lcd.setCursor(2, 0); lcd.print("d"); delay(50);
lcd.setCursor(3, 0); lcd.print("u"); delay(50);
lcd.setCursor(4, 0); lcd.print("i"); delay(50);
lcd.setCursor(5, 0); lcd.print("n"); delay(50);
lcd.setCursor(6, 0); lcd.print("o"); delay(50);
lcd.setCursor(8, 0); lcd.print("W"); delay(50);
lcd.setCursor(9, 0); lcd.print("e"); delay(50);
lcd.setCursor(10, 0); lcd.print("a"); delay(50);
lcd.setCursor(11, 0); lcd.print("t"); delay(50);
lcd.setCursor(12, 0); lcd.print("h"); delay(50);
lcd.setCursor(13, 0); lcd.print("e"); delay(50);
lcd.setCursor(14, 0); lcd.print("r"); delay(50);
lcd.setCursor(4, 1); lcd.print("S"); delay(50);
lcd.setCursor(5, 1); lcd.print("t"); delay(50);
lcd.setCursor(6, 1); lcd.print("a"); delay(50);
lcd.setCursor(7, 1); lcd.print("t"); delay(50);
lcd.setCursor(8, 1); lcd.print("i"); delay(50);
lcd.setCursor(9, 1); lcd.print("o"); delay(50);
lcd.setCursor(10, 1); lcd.print("n"); delay(50);
if (irrecv.decode(&results)) {
if (results.value == 0xFF6897) { // Botón 0 - HORA
lcd.clear(); print_time(); delay(10000); lcd.clear(); delay(200); irrecv.resume();
}
if (results.value == 0xFF30CF) { // Botón 1 - TEMP/HUM
lcd.clear();
int chk = DHT.read11(DHT11_PIN);
lcd.setCursor(0, 0); lcd.print("Tem:");
lmVal = analogRead(lmPin);
tem = (lmVal * 0.0048828125 * 100);
lcd.print(tem); lcd.print(char(223)); lcd.print("C ");
lcd.setCursor(0, 1); lcd.print("Hum:");
lcd.print(DHT.humidity, 1); lcd.print(" % ");
delay(10000); lcd.clear(); delay(200); irrecv.resume();
}
if (results.value == 0xFF18E7) { // Botón 2 - OSCURIDAD
lcd.clear();
lcd.setCursor(4, 0); lcd.print("Darkness:");
luce = analogRead(sensorPin);
pluce = map(luce, 0, 1023, 0, 100);
lcd.setCursor(6, 1); lcd.print(pluce); lcd.print("%");
delay(10000); lcd.clear(); delay(200); irrecv.resume();
}
if (results.value == 0xFF7A85) { // Botón 3 - NIVEL FLUIDO
lcd.clear();
lcd.setCursor(0, 0); lcd.print("Fluid level(mm):");
waterValue = analogRead(waterSensor);
mmwaterValue = map(waterValue, 0, 1023, 0, 40);
lcd.setCursor(6, 1); lcd.print(mmwaterValue);
delay(10000); lcd.clear(); delay(200); irrecv.resume();
}
if (results.value == 0xFF9867) { // Botón CYCLE - SECUENCIA COMPLETA
lcd.clear(); print_time(); delay(4000); lcd.clear(); delay(200);
int chk = DHT.read11(DHT11_PIN);
lcd.setCursor(0, 0); lcd.print("Tem:");
lmVal = analogRead(lmPin);
tem = (lmVal * 0.0048828125 * 100);
lcd.print(tem); lcd.print(char(223)); lcd.print("C ");
lcd.setCursor(0, 1); lcd.print("Hum:");
lcd.print(DHT.humidity, 1); lcd.print(" % ");
delay(4000); lcd.clear(); delay(200);
lcd.setCursor(4, 0); lcd.print("Darkness:");
luce = analogRead(sensorPin);
pluce = map(luce, 0, 1023, 0, 100);
lcd.setCursor(6, 1); lcd.print(pluce); lcd.print("%");
delay(4000); lcd.clear(); delay(200);
lcd.setCursor(0, 0); lcd.print("Fluid level(mm):");
waterValue = analogRead(waterSensor);
mmwaterValue = map(waterValue, 0, 1023, 0, 40);
lcd.setCursor(6, 1); lcd.print(mmwaterValue);
delay(4000); lcd.clear(); delay(200);
irrecv.resume();
}
}
}
Conclusiones
Estación meteorológica con Arduino que muestra fecha/hora actual y datos ambientales en LCD controlado por mando IR.
Partes Personalizadas y Cajas
box_a5et5f4U9F.dwg (Archivo DWG para corte láser)
Esquemáticos
aws_DMDwb4iUZp.fzz (Archivo Fritzing)
Proceso de manufactura
- Estación Meteorológica Avanzada v2.0: Monitorización en Tiempo Real de Temperatura, Presión, Humedad y Altitud
- Detector de idiomas TinyML con Edge Impulse en Arduino Nano 33 BLE Sense
- Construye un Juego Giroscópico en Tiempo Real con Arduino Nano y Sensor MPU-6050
- Estación de Mezcla de Cócteles "6-Shooter" con Arduino: Construye tu Propio Barman Automático
- Proyecto Dados Digitales Arduino: Construye tu Propio Generador de Números Aleatorios con LCD
- Find Me: Localizador Inteligente de Objetos con Arduino y Bluetooth
- Construir una lámpara de escritorio reactiva al audio con Arduino Nano
- Registrador de Datos de Alto Rendimiento para Globo Meteorológico con Arduino
- Estación Meteorológica Portátil Arduino por $10 – Nano, DHT22, BMP180 y LCD
- Pong Neón en Matriz NeoPixel con Arduino Nano
- Monitorización Meteorológica en Tiempo Real con Arduino y ThingSpeak IoT