Construye una estación meteorológica MKR FOX 1200 alimentada por batería
Componentes y suministros
| Arduino MKR Fox 1200 | × | 1 |
| SparkFun Atmospheric Sensor Breakout - BME280 | × | 1 |
| TSL2561 sensor digital de luminosidad | × | 1 |
| HTU21D | × | 1 |
Aplicaciones y servicios en línea
- Arduino Web Editor - Entorno de desarrollo en la nube
- ThingSpeak API - Plataforma IoT para almacenamiento y visualización de datos
- Sigfox - Red de área amplia de baja potencia (LPWAN) para comunicación de largo alcance
Sobre este proyecto
Nota: Este tutorial podría estar desactualizado. Para una versión más actual, consulta este enlace.
Este proyecto muestra cómo convertir un MKR FOX 1200 y varios sensores I2C en una estación meteorológica simple alimentada por batería.
Sensores utilizados
- Sensor de temperatura integrado (baja precisión, ±1 °C)
- Sensor HTU21D I2C para humedad relativa
- Bosch BMP280 (referido como BME280 en la lista) para presión barométrica y temperatura precisa
- TSL2561 para medición de luminosidad
Montaje del hardware
Las conexiones son muy sencillas: todos los sensores usan interfaz I2C y funcionan a 3,3 V. Necesitan cuatro cables desde el MKR FOX 1200: GND, 3,3 V, SDA (pin 11) y SCL (pin 12). Los tres sensores comparten las mismas cuatro conexiones en paralelo porque cada uno tiene una dirección I2C única; las bibliotecas correspondientes se encargan de discriminarlos.
El proyecto completo puede alimentarse con dos pilas alcalinas AA o AAA conectadas en serie (3 V) y cableadas al bloque de terminales de tornillo de la placa.
Mensajes Sigfox
La red Sigfox permite un máximo de 140 mensajes al día, por lo que optimizaremos las lecturas y enviaremos los datos en formato binario compacto.
El empaquetado de datos es crucial porque el tamaño máximo de un mensaje es 12 bytes. Un float ocupa 4 bytes, así que necesitamos empaquetar nuestras lecturas en una representación más pequeña.
El formato float es muy amplio (puede representar números tan grandes como 3,402823e+38) y no necesitamos todo ese espacio; podemos definir límites seguros (basados en dónde se desplegará la estación) y restaurar la representación original en el backend.
Configuración de los servicios en la nube
Utilizaremos dos servicios en la nube:
- Backend de Sigfox
- ThingSpeak
Registra tu placa en el backend de Sigfox usando el PAC y el ID proporcionados por el ejemplo FirstConfiguration (puedes omitir este paso si ya lo hiciste para un proyecto anterior).
Ambos servicios deben configurarse para comunicarse e interpretar los datos en el formato correcto. Regístrate en ambos y crea un par de canales en ThingSpeak. La configuración se muestra en la imagen siguiente.
El primer canal configurado recibirá los datos en bruto (readChannelID), mientras que el segundo recopilará los datos reescalados (writeChannelID).
Es hora de subir el sketch usando el Arduino Create Editor. El sketch por defecto te permite probar exhaustivamente toda la infraestructura antes de desplegar en campo.
Recuerda declarar:
oneshot = false
cuando estés seguro de que la configuración del backend es correcta. El sketch espera al puerto serie, así que no lo lanzaremos aún. En su lugar, abre el backend de Sigfox y configura un callback:
- Haz clic en DEVICE TYPE → LIST → clic derecho en tu placa → Edit.
- En el menú lateral, selecciona CALLBACKS.
- Pulsa el botón New (arriba a la derecha).
- Selecciona Custom callback.
La configuración relevante es:
- TYPE:
DATA/UPLINK - Channel:
URL - Http method:
GET
Como Custom Payload, establece:
status::uint:8 temp1::int:16:little-endian temp2::int:16:little-endian press::uint:16:little-endian hum::uint:16:little-endian light::uint:16:little-endian lastMsg::uint:8
Esta estructura coincide con la que empaquetamos en el sketch. Asignamos una variable a cada campo para referenciarlas en el callback HTTP.
Como URL Pattern, establece:
https://api.thingspeak.com/update?api_key=XXXXXXXXXXXX&field1={customData#temp1}&field2={customData#press}&field3={customData#temp2}&field4={customData#hum}&field5={customData#light}&field6={customData#status}&field7={customData#lastMsg}
Recuerda cambiar la api_key por la Write API Key que ThingSpeak proporciona para el Channel1.
Guarda y sal. Ahora puedes abrir el puerto serie y observar el primer mensaje enviado. ¡Listo!
De datos brutos a gráficos
La configuración anterior envía los datos al backend de ThingSpeak, pero aún están en formato bruto. Para reconvertirlos, usamos la herramienta de análisis de ThingSpeak (MATLAB) con el siguiente fragmento:
% TODO - Reemplaza [] con el channel ID de lectura: readChannelID = [];
% TODO - Introduce la Read API Key entre comillas: readAPIKey = 'T6UK7XO6A4H2AGT7';
% TODO - Reemplaza [] con el channel ID de escritura: writeChannelID = [];
% TODO - Introduce la Write API Key entre comillas: writeAPIKey = 'XU4TGY261P6B5USN';
%% Lectura de datos %%
data = thingSpeakRead(readChannelID, 'ReadKey', readAPIKey,'OutputFormat','table');
analyzedData = data;
%% Análisis de datos %%
INT16_t_MAX = 32767;
UINT16_t_MAX = 65536;
analyzedData.('Temperature1') = data.('Temperature1') / INT16_t_MAX * 120 ;
analyzedData.('Temperature2') = data.('Temperature2') / INT16_t_MAX * 120 ;
analyzedData.('Pressure') = data.('Pressure') / UINT16_t_MAX * 200000 ;
analyzedData.('Light') = data.('Light') / UINT16_t_MAX * 100000 ;
analyzedData.('Humidity') = data.('Humidity') / UINT16_t_MAX * 110 ;
%% Escritura de datos %%
thingSpeakWrite(writeChannelID, analyzedData, 'WriteKey', writeAPIKey);
%% Programar acción: React → cada 10 minutos
Sustituyendo los channel IDs por los nuestros, convertimos los datos brutos en valores reales. ¡Recuerda programar la acción de análisis cada 10 minutos usando React o nunca se ejecutará!
Finalmente, obtenemos nuestras maravillosas gráficas.
Código
WeatherMonitor
El código completo está disponible en el repositorio del proyecto. Incluye la inicialización de sensores, empaquetado de datos, envío por Sigfox y gestión de bajo consumo.
Proceso de manufactura
- Construya una estación meteorológica con Raspberry Pi que envíe datos diarios por email
- Monitor Meteorológico – Estación Meteorológica DIY con Raspberry Pi y Subida a Dropbox
- Crea un Impresionante Sistema Ambilight para Monitor con Arduino
- Sensor K30 CO₂: Monitorización en tiempo real de la calidad del aire interior
- Monitor de Frecuencia Cardíaca IoT en Tiempo Real con Arduino y MAX30100
- Estación meteorológica compacta: Arduino Nano y ESP8266 con sensor BMP280 y pantalla OLED/Nokia LCD
- Construye un estadiómetro digital: Controla tu altura con Arduino y sensor láser
- Integración del sensor de huella capacitivo DFRobot (ID809) con Arduino o ESP8266
- Construye una Torre de Sensores con Arduino Cloud: Temperatura, Movimiento y Gas
- Construye un monitor de calidad del aire preciso con el sensor Sharp GP2Y1010AU0F
- Estación meteorológica Arduino Nano: Sensores BMP280, DHT11, UV y RTC en OLED 0,96"