Construa uma Estação Meteorológica a Bateria com MKR FOX 1200
Componentes e Materiais
| Arduino MKR FOX 1200 | 1 |
| SparkFun Atmospheric Sensor Breakout - BME280 | 1 |
| Sensor de Luminosidade Digital TSL2561 | 1 |
| HTU21D | 1 |
Aplicações e Serviços Online
- Arduino Web Editor - IDE baseada na nuvem
- ThingSpeak API - Plataforma IoT para visualização de dados
- Sigfox - Rede LPWAN de longo alcance
Sobre o Projeto
Nota: Este tutorial pode estar desatualizado. Consulte esta versão mais atual.
Este projeto demonstra como transformar um MKR FOX 1200 e um conjunto de sensores I2C em uma estação meteorológica simples, alimentada por bateria.
Sensores Utilizados
- Sensor de temperatura integrado (baixa precisão, ±1 °C)
- HTU21D I2C para medição de umidade
- Bosch BMP280 para pressão barométrica e temperatura precisa
- TSL2561 para luminosidade
Configuração do Hardware
A conexão dos sensores é bastante simples: todos utilizam interface I2C e operam a 3,3V. Apenas quatro fios são necessários a partir do MKR FOX 1200: GND, 3,3V, SDA (pino 11) e SCL (pino 12). Como cada sensor possui um endereço I2C único, as mesmas quatro conexões podem ser compartilhadas em paralelo entre os três sensores — as bibliotecas e funções cuidam da discriminação de cada um.
O projeto inteiro pode ser alimentado por duas pilhas AA ou AAA alcalinas conectadas em série (3V), ligadas ao bloco de terminais de parafuso na placa.
Mensagens Sigfox
Como a rede Sigfox permite no máximo 140 mensagens por dia, otimizamos as leituras e enviamos os dados em formato binário compacto. A compactação é essencial porque o tamanho máximo de uma mensagem é 12 bytes. Um float ocupa 4 bytes, então precisamos empacotar nossas leituras em representações menores.
O formato float é muito amplo (pode representar números até 3,402823e+38) e não precisamos de todo esse espaço. Definimos limites seguros baseados no local de instalação e restauramos a representação original no backend.
Configuração dos Serviços na Nuvem
Utilizamos dois serviços na nuvem:
- Backend Sigfox
- ThingSpeak
Registre sua placa no backend Sigfox usando o PAC e ID fornecidos pelo exemplo FirstConfiguration (pode ser pulado se já feito em projeto anterior). Ambos precisam ser configurados para se comunicar e interpretar os dados no formato correto. Crie dois canais no ThingSpeak.
O primeiro canal receberá os dados brutos (readChannelID), enquanto o segundo coletará os dados reescalados (writeChannelID).
Configuração do Callback no Sigfox
- No backend Sigfox, clique em DEVICE TYPE → LIST, clique com botão direito na sua placa e selecione Edit
- No menu lateral, clique em CALLBACKS
- Clique no botão New no canto superior direito
- Selecione Custom callback
- Configure:
- TYPE:
DATA/UPLINK - Channel:
URL - HTTP method:
GET
Custom Payload:
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 estrutura corresponde ao que empacotamos no sketch, permitindo referenciar cada campo no callback HTTP.
URL Pattern:
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}
Substitua api_key pela Write API Key do Channel1 fornecida pelo ThingSpeak. Salve e abra a porta serial para observar a primeira mensagem sendo enviada.
De Dados Brutos a Gráficos
A configuração roteia os dados ao ThingSpeak, mas ainda em formato bruto. Para reconvertê-los, use a ferramenta de análise do ThingSpeak com o snippet abaixo:
% TODO - Substitua [] pelo ID do canal de leitura: readChannelID = [];
% TODO - Insira a Read API Key entre aspas: readAPIKey = 'T6UK7XO6A4H2AGT7';
% TODO - Substitua [] pelo ID do canal de escrita: writeChannelID = [];
% TODO - Insira a Write API Key entre aspas: writeAPIKey = 'XU4TGY261P6B5USN';
%% Leitura dos Dados %%
data = thingSpeakRead(readChannelID, 'ReadKey', readAPIKey,'OutputFormat','table');
analyzedData = data;
%% Análise dos Dados %%
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;
%% Escrita dos Dados %%
thingSpeakWrite(writeChannelID, analyzedData, 'WriteKey', writeAPIKey);
%% Agendamento: React → a cada 10 minutos
Substitua os IDs dos canais pelos seus e agende a ação de análise a cada 10 minutos usando React, ou ela nunca será executada. Pronto — você terá seus gráficos meteorológicos funcionando.
Código
WeatherMonitor
O código completo está disponível no repositório do projeto. Inclui a leitura dos sensores, empacotamento binário, envio via Sigfox e rotinas de baixo consumo para operação a bateria.
Processo de manufatura
- Construa Estação Meteorológica Raspberry Pi que Envia Dados Diários por Email
- Monitor Meteorológico – Estação Meteorológica DIY com Raspberry Pi e Upload para Dropbox
- Crie um Sistema Ambilight Impressionante para Monitor com Arduino
- Sensor K30 CO₂: Monitoramento de Qualidade do Ar Interno em Tempo Real
- Monitor de Frequência Cardíaca IoT em Tempo Real com Arduino e MAX30100
- Estação Meteorológica Compacta: Arduino Nano e ESP8266 com BMP280 e Display OLED/Nokia LCD
- Construa um Estadiómetro Digital: Acompanhe a Altura com Arduino e Sensor a Laser
- Integrando Sensor de Impressão Digital Capacitivo DFRobot com Arduino ou ESP8266
- Construa uma Torre de Sensores com Arduino Cloud: Monitoramento de Temperatura, Movimento e Gás
- Monitore a Qualidade do Ar com Precisão usando o Sensor Sharp GP2Y1010AU0F