Estación Meteorológica con Atmega328 y NRF24L01: Implementación de Hardware y Software
La estación base de la estación meteorológica está construida sobre el microcontrolador Atmega328 con un resonador externo de 16 MHz. La alimentación es de 5 V, con un regulador separado AMS1117 de 3,3 V para el módulo NRF24L01. El circuito incluye retroiluminación RGB con balance de brillo: una resistencia de 100 Ω en el canal rojo, 200 Ω en verde y azul para compensar la sensibilidad fisiológica del ojo y las diferencias en la emisión del cristal.
Optimización de la Fuente de Alimentación
En el circuito inicial, se utilizó un condensador de desacoplamiento para la alimentación y otro para AREF. Esto funcionaba pero violaba las recomendaciones: cada par VCC-GND requiere un condensador separado de 100 nF para suprimir el ruido de impulsos del microcontrolador. Lo óptimo son tres para la alimentación más uno en AREF. En el bus I²C, dos pares de resistencias pull-up son excesivos; un par de 4,7 kΩ es suficiente.
Diseño de PCB y Conexión a Tierra
La placa se fabricó a mano usando el método de fotoresistencia con máscara de soldadura UV. La capa inferior es un polígono sólido de GND, las vías se implementaron soldando cables. Separar la tierra analógica y digital para el fotorresistor resultó innecesario: el sensor es de baja frecuencia, la señal es de 0,5–4,5 V, el ruido en milivoltios. Un filtro de 0,1 µF en la entrada ADC deriva las interferencias de alta frecuencia y compensa los picos de tierra en modo común.
- Fotorresistor frente a fotodiodo: El fotorresistor (kΩ–MΩ) proporciona una señal de voltaje, robusto frente al ruido; el fotodiodo (µA) requiere AGND limpio.
- Recomendación: Tierra común + 0,1 µF en ADC para fotorresistores.
La separación de tierra es necesaria para sensores de baja corriente (termopares, piezo).
Filtrado de Parpadeo en Software
El brillo de la pantalla y la retroiluminación se ajustan mediante PWM basado en el fotorresistor. El ruido del ADC y el ruido térmico (±3–4 unidades) causan parpadeo. La fuente de alimentación no resolvió el problema; se aplicaron un filtro mediano de tercer orden y un filtro exponencial.
int rawValue = analogRead(0);
int filteredValue = med.filter(rawValue);
float smoothValue = expF.filter(filteredValue);
int fotoresistor = map(smoothValue, 260, 1023, 0, 255);
fotoresistor = constrain(fotoresistor, 0, 255);
anlogWrite(3, 255 - fotoresistor);
La combinación de filtros es mejor que promediar sobre 10: elimina picos sin retraso significativo en la reacción.
Pronóstico de Precipitaciones mediante Barómetro
El BMP280 mide la presión cada 10 min, promediando sobre 10 lecturas. Se analiza un array de los últimos 6 valores usando el método de mínimos cuadrados para aproximación.
if (millis() - lasttime > 600000) {
lasttime = millis();
PP = davlenie();
for (byte i = 0; i < 5; i++) {
pres1_array[i] = pres1_array[i + 1];
}
pres1_array[5] = PP;
}
// Mínimos cuadrados
for (byte i = 0; i < 6; i++) {
sumX += time_array[i];
sumY += (long)pres1_array[i];
sumX2 += time_array[i] * time_array[i];
sumXY += (long)time_array[i] * pres1_array[i];
}
a = (long)6 * sumXY - (long)sumX * sumY;
a = (float)a / (6 * sumX2 - sumX * sumX);
delta = a * 6;
rain = map(delta, -250, 250, 100, -100);
El coeficiente a es la pendiente, delta es el cambio por hora (Pa). rain va de -100 (subiendo, despejado) a +100 (bajando, lluvia).
Control de Comunicación y Tiempo de Espera
Al recibir un paquete del sensor exterior, se registra lastReceiveTime. Si está ausente >60 min:
if (radio.available()) {
radio.read(&rxData, sizeof(rxData));
lastReceiveTime = millis();
dataIsFresh = true;
}
if (lastReceiveTime > 0 && millis() - lastReceiveTime > 3600000) {
resetWirelessData();
}
resetWirelessData() pone a cero dataIsFresh, la pantalla muestra guiones.
Retroiluminación RGB Atmosférica
El color cambia con el tiempo, imitando la naturaleza: mañana — amarillo, día — azul, tarde — rosa, noche — púrpura. Interpolación lineal de RGB basada en el progreso dentro del intervalo.
float progress = (currentHour - 8 + (float)currentMinute / 60.0) / 3.0;
if (progress < 0.5) {
float subProgress = progress * 2.0;
r = 255;
g = 80 + subProgress * 90;
b = 0 + subProgress * 50;
} else {
float subProgress = (progress - 0.5) * 2.0;
r = 255 - subProgress * 170;
g = 180 - subProgress * 50;
b = 60 + subProgress * 195;
}
void dayy() {
r = 85; g = 130; b = 255;
}
Las fases aseguran suavidad sin saltos abruptos.
Carcasa y Firmware
Carcasa: ABS + PETG transparente, placa dimensionada a la pantalla. Firmware mediante Arduino como ISP en conectores PLS.
Puntos Clave
- Balance RGB: 100 Ω en rojo para igualación visual.
- Filtros: mediano + exponencial mejor que promediar contra parpadeo.
- Mínimos cuadrados para presión: delta ±250 Pa determina probabilidad de lluvia.
- Tiempo de espera de 60 min para NRF24L01 evita mostrar datos obsoletos.
- Tierra común suficiente para fotorresistor con 0,1 µF.
— Editorial Team
Aún no hay comentarios.