Сборка автономной метеостанции на базе MKR FOX 1200
Компоненты и материалы
| Компонент | Количество |
|---|---|
| Arduino MKR Fox 1200 | 1 |
| Датчик атмосферы SparkFun BME280 (разъем для платы) | 1 |
| Цифровой датчик освещенности TSL2561 | 1 |
| Датчик влажности и температуры HTU21D | 1 |
Приложения и онлайн-сервисы
- Arduino Web Editor
- ThingSpeak API
- Sigfox
О проекте
Примечание: Это руководство может быть устаревшим. Актуальную версию можно найти здесь.
В этом проекте показано, как превратить MKR FOX 1200 и набор I2C-сенсоров в простую метеостанцию, работающую от батареи.
Используемые датчики
- Встроенный датчик температуры (низкая точность, ±1 °C)
- HTU21D (I2C) — для измерения влажности
- BMP280 (Bosch) — для измерения атмосферного давления и точной температуры
- TSL2561 — для измерения освещенности
Подключение оборудования
Схема подключения предельно проста: все датчики используют интерфейс I2C и работают от 3,3 В. Им требуется всего четыре провода от MKR FOX 1200: GND, 3,3 В, SDA (Pin 11) и SCL (Pin 12). Одинаковые четыре соединения можно распараллелить для трёх датчиков, так как у каждого свой уникальный I2C-адрес, а библиотеки автоматически различают их.
Вся система может питаться от двух щелочных элементов АА или ААА, соединённых последовательно (3 В), подключённых к клеммному блоку на плате.
Формат сообщений Sigfox
Сеть Sigfox позволяет отправлять максимум 140 сообщений в сутки, поэтому показания упаковываются в компактный бинарный формат. Максимальный размер сообщения — 12 байт. Тип float занимает 4 байта, поэтому показания сжимаются в более компактное представление. Формат float избыточен (диапазон до 3,4·10³⁸), поэтому задаются безопасные пределы значений (в зависимости от места установки), а обратное преобразование выполняется на сервере.
Настройка облачных сервисов
Используются два облачных сервиса:
- Sigfox Backend
- ThingSpeak
Зарегистрируйте плату в Sigfox Backend, используя PAC и ID из примера FirstConfiguration (можно пропустить, если уже делали это ранее). Оба сервиса нужно настроить на взаимодействие и корректную интерпретацию данных. Зарегистрируйтесь в обоих и создайте пару каналов на ThingSpeak. Настройка показана на скриншоте ниже.
Первый канал принимает «сырые» данные (readChannelID), второй — пересчитанные значения (writeChannelID).
Загрузите скетч через Arduino Create Editor. Скетч по умолчанию позволяет протестировать всю инфраструктуру перед развёртыванием. Установите:
oneshot = false
когда убедитесь, что бэкенд настроен верно. Скетч ожидает открытия последовательного порта, поэтому не запускайте его сразу. Вместо этого откройте Sigfox Backend и настройте callback:
- Нажмите DEVICE TYPE → LIST → правый клик по вашей плате → Edit.
- В левом меню выберите CALLBACKS.
- Нажмите New (правый верхний угол).
- Выберите Custom callback.
Настройте callback следующим образом:
- 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
Это структура, упакованная в скетче. Каждому полю назначается переменная для ссылки в HTTP-callback.
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}
Замените api_key на Write API Key канала 1 из ThingSpeak. Сохраните настройки. Теперь можно открыть последовательный порт и наблюдать отправку первого сообщения.
Преобразование сырых данных в графики
Настроенная маршрутизация отправляет данные в ThingSpeak, но они всё ещё в «сыром» виде. Для обратного преобразования используйте инструмент аналитики ThingSpeak со следующим скриптом (MATLAB):
% TODO - Замените [] на ID канала для чтения: readChannelID = [];
% TODO - Введите Read API Key между кавычками: readAPIKey = 'T6UK7XO6A4H2AGT7';
% TODO - Замените [] на ID канала для записи: writeChannelID = [];
% TODO - Введите Write API Key между кавычками: writeAPIKey = 'XU4TGY261P6B5USN';
%% Чтение данных %%
data = thingSpeakRead(readChannelID, 'ReadKey', readAPIKey,'OutputFormat','table');
analyzedData = data;
%% Анализ данных %%
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;
%% Запись данных %%
thingSpeakWrite(writeChannelID, analyzedData, 'WriteKey', writeAPIKey);
%% Планирование: React → каждые 10 минут %%
Подставьте свои Channel IDs. Не забудьте запланировать выполнение анализа каждые 10 минут через React, иначе скрипт никогда не запустится! В итоге вы получите наглядные графики погодных параметров.
Код
WeatherMonitor — полный скетч доступен в репозитории проекта.
Производственный процесс
- Создание метеостанции на Raspberry Pi с ежедневными email-отчётами о погоде
- Weather Monitor — DIY метеостанция на Raspberry Pi с загрузкой в Dropbox
- Создание потрясающей системы Ambilight для монитора на Arduino
- Датчик CO2 K30: мониторинг качества воздуха в реальном времени на Arduino
- IoT-монитор пульса в реальном времени на Arduino и MAX30100
- Компактная метеостанция: Arduino Nano + ESP8266, BMP280, OLED / Nokia 5110 LCD
- Цифровой стадиометр на Arduino: отслеживание роста лазерным датчиком VL53L0X
- Интеграция ёмкостного сканера отпечатков DFRobot с Arduino или ESP8266
- Сенсорная башня на Arduino Cloud: Мониторинг температуры, движения и газа
- Точный монитор качества воздуха на датчике Sharp GP2Y1010AU0F