Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Портативная 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

Инструменты

Приложения и сервисы

О проекте

Много приложений для подключения смартфона к 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).

Портативная IoT-метеостанция на Arduino Nano 33 IoT

Корпус — маленький пластиковый бокс с прозрачной передней стенкой (для OLED и прохождения WiFi). Датчик выведен наружу через отверстие 1/2" внизу — сидит чуть внутри. Всё зафиксировано горячим клеем (для улицы лучше эпоксидку).

Питание через USB-кабель: один кабель для прошивки и работы (от ПК или USB-блока).

Софт

Код — комбинация примеров библиотек датчика, дисплея и Blynk. Библиотеки:

Все устанавливаются через 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 сначала сбивает с толку. Иконка слева вверху — проекты/выход. Справа вверху — вход/выход из режима редактирования. Средняя — зависит от контекста.

Портативная IoT-метеостанция на Arduino Nano 33 IoT

Управление встроенным 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.

Портативная IoT-метеостанция на Arduino Nano 33 IoT

Откройте 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:

Теперь график: виджет 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);
}

Схемы

Портативная IoT-метеостанция на Arduino Nano 33 IoT

Производственный процесс

  1. Интегральные схемы (ИС): компактные мощные чипы, питающие современную электронику
  2. DIY солнечная метеостанция на Raspberry Pi
  3. Сборка уличной метеостанции на Raspberry Pi 2 и ADS‑WS1
  4. Создание метеостанции на Raspberry Pi с ежедневными email-отчётами о погоде
  5. Интеграция метеостанции с CWOP: практическое руководство
  6. Продвинутая метеостанция v2.0: мониторинг температуры, давления, влажности и высоты в реальном времени
  7. Сборка DCC-командной станции для модельной железной дороги на Arduino с бесплатным приложением
  8. Автоматизированная барная станция «6-Сhooter» на Arduino — Собираем коктейльный робот своими руками
  9. MotionSense: умная система обнаружения проникновения на Arduino и ESP8266
  10. Высокопроизводительный регистратор данных для метеозонда на Arduino