Портативная IoT-метеостанция на Arduino Nano 33 IoT
Компоненты и материалы
| Arduino Nano 33 IoT | × | 1 |
| Датчик погоды BME280 (температура, влажность, давление) | × | 1 |
| OLED-дисплей 0.96" 128x64 | × | 1 |
| Пластиковый корпус 3.9" x 2.7" | × | 1 |
| Micro USB кабель | × | 1 |
| Провода male-female для макетки | × | 1 |
| USB сетевой зарядник | × | 1 |
Инструменты
- Клейкий пистолет
Приложения и сервисы
- Arduino IDE
- Blynk
О проекте
Много приложений для подключения смартфона к IoT. Пробовал много — обычно разочаровывался. Blynk — исключение: гибкий, красивый UI, работает со множеством платформ, на Android и iOS, бесплатен для хоббистов! Этот проект — простая IoT-метеостанция для освоения Blynk.
Железо
Основа — Arduino Nano 33 IoT (встроенный WiFi), плата датчика BME280 (температура, влажность, давление в одном корпусе), 1-дюймовый OLED-дисплей. Все работают от 3.3 В. Дисплей опционален — цель: данные на телефоне. Но с OLED проще отладить всё до подключения Blynk.
Схема ниже: датчик и дисплей на I2C. Теоретически один I2C поддерживает несколько устройств, но библиотеки конфликтовали — пришлось использовать два разных I2C-порта. Датчик на стандартном I2C (аналоговые пины A4/A5). Дисплей на вторичном I2C (цифровые пины 4 и 5, SDA на D5).

Корпус — маленький пластиковый бокс с прозрачной передней стенкой (для OLED и прохождения WiFi). Датчик выведен наружу через отверстие 1/2" внизу — сидит чуть внутри. Всё зафиксировано горячим клеем (для улицы лучше эпоксидку).
Питание через USB-кабель: один кабель для прошивки и работы (от ПК или USB-блока).
Софт
Код — комбинация примеров библиотек датчика, дисплея и Blynk. Библиотеки:
- Adafruit_BME280_Library (датчик)
- ss_oled (дисплей)
- Blynk (IoT)
Все устанавливаются через Library Manager Arduino. Поэкспериментируйте с каждой отдельно для понимания.
Blynk примеры: examples.blynk.cc. Nano 33 IoT не в списке поддерживаемых, но Blynk работает с WiFiNINA — библиотека Nano 33 IoT. Добавьте:
#include <WiFiNINA.h>
#include <BlynkSimpleWiFiNINA.h>
Также нужен #include <avr/dtostrf.h> — для преобразования чисел датчика в строки для OLED. Blynk принимает и строки, и числа. Сначала слал строки — работало, но графики не строили. Для графиков нужны числа.
Важно: атмосферное давление обычно приводят к уровню моря. На высоте давление ниже. Для коррекции добавьте ~1 дюйм Hg на каждые 1000 фут высоты. В моём коде +1.3 для моей высоты 1300 фут. Замените на свою. Для точной коррекции используйте онлайн-таблицы.
Метеостанция без Blynk
Можно запустить только с OLED: закомментируйте Blynk.begin() в setup(). (Если не закомментировать — скетч зависнет на подключении к Blynk). Далее настройка Blynk.
Настройка Blynk
Blynk легко ставится на iPhone/Android, документация: docs.blynk.cc. Но много опций — запутаться легко. Мой краткий гайд.
Использовал iPhone, на Android похоже. После установки — создайте аккаунт. В приложении — новый проект. Получите Auth Token для связи железа с проектом. Первая задача — подключить железо к Blynk через WiFi. Протестируйте стандартным скетчем Blynk Blink (examples.blynk.cc) — управление встроенным LED (D13).
В примерах Blynk по умолчанию ESP8266. Замените:
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
// на:
#include <WiFiNINA.h>
#include <BlynkSimpleWiFiNINA.h>
Добавьте WiFi-креды и Auth Token. Про LED ниже, но сначала проверьте связь: загрузите настроенный Blink, откройте Serial Monitor — увидите подключение к Blynk Cloud. Железо можно отложить, работаем с приложением.
Интерфейс Blynk сначала сбивает с толку. Иконка слева вверху — проекты/выход. Справа вверху — вход/выход из режима редактирования. Средняя — зависит от контекста.

Управление встроенным LED: войдите в Edit mode, экран пустой. Свайп влево — панель виджетов. Выберите Button, появится на экране. Нажмите на него — настройка. Режим: Switch (не Push). Pin Select → Digital Pin 13 (встроенный LED Nano 33 IoT). OK, выйдите из Edit mode. Кнопка управляет LED.
Метеостанция с Blynk
Готово к подключении метеостанции. Откройте мой код, раскомментируйте Blynk.begin(), вставьте Auth Token и WiFi-креды, загрузите в Arduino.

Откройте Blynk на телефоне. Кнопка LED всё ещё там — работает. Войдите в Edit, настройте кнопку, удалите (Delete внизу). Из панели виджетов выберите Labeled Value (в разделе Displays). Нажмите на него — настройка. Pin → Virtual Pin V3. Label: «Temp /pin.#/ deg.F» (.# — одна цифра после запятой). Размер текста: Large. Refresh Interval: Push. Text Color: Green. OK. Виджет узкий — растяните медленно (чтобы не войти в настройку) на ~3/4 экрана. Выйдите из Edit — температура на телефоне.
Виртуальные пины Blynk: Виджет может читать аналоговый/цифровой пин процессора, но чаще нужно отобразить переменную. Присваиваете переменной номер виртуального пина — приложение обращается к ней по этому номеру. В коде температура в Фаренгейтах присвоена V3.
Refresh Interval (Push): Arduino толкает данные (в коде — раз в минуту). Есть и Pull-режим: приложение само опрашивает железо.
Добавляем ещё два Labeled Value:
- Влажность % (Virtual Pin V4), цвет Gold, 1 знак после запятой.
- Давление в дюймах Hg (Virtual Pin V5), цвет Red, 2 знака после запятой.
Теперь график: виджет SuperChart. Растяните вниз на весь экран. Настройка: Show X axis values. Разрешения: live, 1h, 6h, 1d, 1w, 1mo, 3mo. Три потока данных — по одному на переменную. Настройте каждый: иконка справа → Virtual Pin (V3, V4, V5). Y-axis scaling: Height. Температура: 67–100. Влажность: 34–66. Давление: 0–33. Цвета как у Labeled Value. Show Y axis: on. Выход из Edit — телефон показывает как у меня. График набирает данные — для быстрого результата смотрите live или 1 hour.
Шеринг проекта: в Edit mode → иконка Project Settings (середина сверху) → Enable Sharing → Generate Link. Получите QR-код — шлите по email. Новый пользователь нужен только Blynk-приложение (аккаунт не обязателен). В приложении незарегистрированного пользователя есть ссылка «Load QR code». Готово.
Это краткий ввод в Blynk — хорошая база. Blynk «почти бесплатен»: виджеты и шеринг тратят Energy (очки). 2500 очков дают бесплатно — хватает для этого проекта. Дальше может потребоваться покупка (я потратил $6 на 5000 очков).
Код
Tiny Internet Weather Station Arduino
С WiFi и Blynk на смартфон
/* This sketch is for the Arduino Nano 33 IoT
* It uses a BME280 sensor board
* It uses a 0.96 inch 128 x 64 OLED display
* It connects through WiFi to the Blynk cloud server for display of weather data on a smartphone
*/
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BME280.h> // BME280 library
#include <avr/dtostrf.h> // used to convert weather numbers to strings for display on OLED
#include <ss_oled.h> // OLED library
// Next two includes required to make Nano 33 IoT work with Blynk
#include <WiFiNINA.h>
#include <BlynkSimpleWiFiNINA.h>
char auth[] = "YourBlynkProjectCode";
char ssid[] = "YourWifiID";
char pass[] = "YourWiFiPassword";
Adafruit_BME280 bme; // use I2C interface
Adafruit_Sensor *bme_temp = bme.getTemperatureSensor();
Adafruit_Sensor *bme_pressure = bme.getPressureSensor();
Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();
#define SDA_PIN 5
#define SCL_PIN 4
#define RESET_PIN -1
#define OLED_ADDR -1
#define FLIP180 0
#define INVERT 0
#define USE_HW_I2C 0
#define MY_OLED OLED_128x64
#define OLED_WIDTH 128
#define OLED_HEIGHT 64
SSOLED ssoled; // instance of OLED
BlynkTimer timer; // instance of Blynk timer
void setup() {
if (!bme.begin(0x76)) {
// wait until sensor is detected
while (1) delay(10);
}
bme_temp->printSensorDetails();
bme_pressure->printSensorDetails();
bme_humidity->printSensorDetails();
oledInit(&ssoled, MY_OLED, OLED_ADDR, FLIP180, INVERT, USE_HW_I2C, SDA_PIN, SCL_PIN, RESET_PIN, 400000L);
oledFill(&ssoled, 0x0, 1);
Blynk.begin(auth, ssid, pass); // comment this line out to operate weather station without Blynk
timer.setInterval(60000L, myupdate); // runs myupdate once per minute
myupdate(); // run an initial update of display and data to Blynk because main loop waits one minute
}
void loop() {
Blynk.run(); // Blynk prefers to run by itself in the main loop.
timer.run(); // Everything else is handled through Blynk timer
}
// this routine is called by the Blynk timer to update both the OLED display and push data to Blynk
void myupdate(){
sensors_event_t temp_event, pressure_event, humidity_event;
bme_temp->getEvent(&temp_event);
bme_pressure->getEvent(&pressure_event);
bme_humidity->getEvent(&humidity_event);
float ctemp = temp_event.temperature; // get temp in centigrade
float ftemp = 32 + (9*ctemp)/5; // convert temp to fahrenheit
float hum = humidity_event.relative_humidity; // get relative humidity
float ppress = pressure_event.pressure; // get pressure in mm
float mpress = 1.3 + ppress/33.8939; // convert to inch Hg and add 1.3 to match actual locally reported barometric
// pressure. You may want to remove the 1.3 and/or add your own adjustment.
char mytemp[8];
dtostrf(ftemp, 6, 2, mytemp); // convert temp to a string
char myhum[8];
dtostrf(hum, 6, 2, myhum); // convert humidity to a string
char mypress[8];
dtostrf(mpress, 6, 2, mypress); // convert pressure to a string
// update OLED display
oledWriteString(&ssoled, 0,2,1,(char *)"Weather Station", FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0,2,3,(char *)"Temp = ", FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0,50,3,(char *)mytemp, FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0,105,3,(char *)"F", FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0,2,5,(char *)"Humid=", FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0,50,5,(char *)myhum, FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0,105,5,(char *)"%", FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0,2,7,(char *)"Press=", FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0,50,7,(char *)mypress, FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0,105,7,(char *)"in", FONT_NORMAL, 0, 1);
// push new weather data to Blynk
Blynk.virtualWrite(V3, ftemp);
Blynk.virtualWrite(V4, hum);
Blynk.virtualWrite(V5, mpress);
}
Схемы
Производственный процесс
- Интегральные схемы (ИС): компактные мощные чипы, питающие современную электронику
- DIY солнечная метеостанция на Raspberry Pi
- Сборка уличной метеостанции на Raspberry Pi 2 и ADS‑WS1
- Создание метеостанции на Raspberry Pi с ежедневными email-отчётами о погоде
- Интеграция метеостанции с CWOP: практическое руководство
- Продвинутая метеостанция v2.0: мониторинг температуры, давления, влажности и высоты в реальном времени
- Сборка DCC-командной станции для модельной железной дороги на Arduino с бесплатным приложением
- Автоматизированная барная станция «6-Сhooter» на Arduino — Собираем коктейльный робот своими руками
- MotionSense: умная система обнаружения проникновения на Arduino и ESP8266
- Высокопроизводительный регистратор данных для метеозонда на Arduino