Общие сведения о проекте.
Проект «Метеостанция на ESP8266 и BME280 Народного мониторинга» (МНМ) раскрывает один из простейших вариантов реализации персональной метеостанции с использованием многофункционального датчика (температура, давление, влажность) BME280 и Wi-Fi модуля ESP8266 и отправки получаемых данных на сервер Народного Мониторинга по протоколу UDP.
Проект МНМ будет интересен начинающим электронщикам, как способ достижения полезного результата с минимальными затратами времени и средств и предоставлением возможности рассмотрения аппаратной и программной реализации.
Интернет проект «Народный Мониторинг» (НМ) предоставляет доступный набор инструментов для реализации проектов по сбору и использованию различных данных. Наиболее востребован он для сбора метеоданных от персональных метеостанций, хотя с успехом может быть использован и для других проектов мониторинга или интернета вещей.
Народный мониторинг предоставляет возможность:
- загрузки данных посредством использования различных протоколов;
- привязки местоположения метеостанции на карте;
- отображения метеоданных на карте;
- визуализации данных графиками;
- назначения пороговых значений;
- назначения команд при достижении пороговых значений;
- назначения адреса получателя команд;
- и др.
Проект МНМ демонстрирует элементную базу (компоненты), схемотехническое решение и программное обеспечение, позволяющее получать данные с универсального датчика BME280 и отправлять их на сервер НМ по (простейшему) протоколу UDP, т.е. решает первую (и основную) задачу взаимодействия с сервером НМ. Данные, полученные сервером НМ, могут быть использованы различным образом и с различными целями, например, опубликованы с привязкой к географическому положению метеостанции, с возможностью онлайн просмотра их изменения за требуемый промежуток времени и т.д.
Реализация данного проекта предусматривает наличие регистрации на сервере Народного Мониторинга.
Простота проекта обеспечивается минимальным количеством требуемых для его реализации компонентов:
- универсальный датчик (температура, давление, влажность) BME280;
- Wi-Fi модуль ESP8266;
- соединительные провода;
- блок электрического питания на 5 В;
- монтажная коробка для размещения компонентов и защиты их от воздействия внешней среды.
Компоненты, используемые в проекте.
Универсальный датчик (температура, давление, влажность) BME280.
Универсальный датчик BME280 представляет собой систему на кристалле, способную производить измерение значения температуры, давления, влажности и передавать получаемые данные по интерфейсу I2C.
На рисунке представлен модуль BME280 со своим «младшим братом» BMP280.
Необходимость упомянуть BMP280 вызвана тем, что магазины лукавят и выдают BMP280 за BME280. А функционал, цена, программная поддержка различны.
Обращаю внимание на различия, которые отличают требуемый датчик — BME280 и BMP280 (на нижних рисунках это хорошо видно):
- BME280 имеет чуть БОЛЬШИЙ КВАДРАТНЫЙ корпус;
- цена BME280 в три раза выше, чем у BMP280;
- на плате под маркировкой BME в белом квадратике должна стоять точка (многие, как на рисунке, не ставят).
Что касается МОДУЛЕЙ BME280 (верхние рисунки). Они бывают размещены на плате с двумя крепежными отверстиями и с одним. Питаются датчики электрическим напряжением 3,3 В. В связи с чем есть версии модулей, с установленным стабилизатором на 3,3 В (версия 5 В) (с одним крепёжным отверстием) и есть без стабилизатора (версия 3.3 В) (с двумя крепёжными отверстиями).
Лучше выбирать версию 5В — она универсальнее. Можно подавать и 5 В и 3.3 В. Стабилизатор имеет низкое проходное падение напряжения и, при подключении к 3,3 В, модуль сохраняет работоспособность (обратную совместимость не проверял. Можете проверить сами и сообщить результат. :)).
Подключаются модули четырьмя проводами. Два провода питания и два провода интерфейса I2C.
Wi-Fi модуль ESP8266.
Wi-Fi модуль ESP8266 представляет собой плату со всеми необходимыми компонентами для загрузки программного кода пользователя из среды IDE Arduino через USB соединение, установления радиосвязи с точкой доступа Wi-Fi, считывания значений различных датчиков, их преобразования, и отправки по требуемому протоколу заданному адресату в Internet.
Для данного проекта достаточна самая простая плата типа ESP8266 WeMos D1 mini. Она обладает необходимыми выводами для подключения универсального датчика BME280 и требуемыми для реализации программного обеспечения возможностями.
Соединительные провода.
Соединительные провода требуются для подключения универсального датчика BME280 к Wi-Fi модулю ESP8266 WEMOS D1 mini в количестве 4 шт. Т.к. на модулях распаяны штыревые контакты (ШК), то провода, соответственно должны иметь гнездовые контакты (ГК).
Поскольку имеются провода различных цветов, то следует выбирать провода адекватных функциональному назначению цветов. Например, для соединения земляной шины GND подходят черный или зеленый цвет — цвет земли или травы; для соединения питания +5 В подходят яркие цвета: красный или оранжевый; для соединения линий I2C интерфейса я выбираю желтый и фиолетовый. Впрочем, когда отрываешь провода от шлейфа получается, что получается. Важно быть внимательным, когда производишь соединение и проверять каждый провод: что с чем соединено.
Блок электрического питания на 5 В.
Блок электрического питания на 5 В требуется при стационарном размещении метеостанции в рабочей позиции. В большинстве случаев будет пригоден стандартный блок электрического питания на 5 В с током более 0,5 А (500 мA) и разъёмом для подключения нагрузки micro USB для подключения к Wi-Fi модулю ESP8266 WEMOS D1 mini.
Отдельный блок питания используется при автономном размещении МНМ. При размещении её вблизи персонального компьютера, можно подавать напряжение электропитания от порта USB.
Загрузочный кабель.
Загрузка программного обеспечения и проверка работоспособности производится с использованием стандартного USB кабеля.
Кабель содержит четыре провода:
- красный — +5 В;
- черный — «Земля»;
- белый — «Data +»;
- зеленый — «Data -«.
Т.е. он может быть использован, как для программирования модуля ESP8266, так и для его питания от разъёмов персонального компьютера USB розетка тип А.
Стремление к экономии со стороны производителей привело к некоторым обстоятельствам, которые необходимо учитывать.
Имеют место кабели, в которых сигнальные проводники отсутствуют. Они пригодны только для подачи питания или зарядки. Такие кабели, при подключении модуля к ПК, только подают питание на плату, но не соединяют информационные лини интерфейса, вследствие чего, при подключении модуля микроконтроллера к персональному компьютеру, в IDE Arduino не появляется новый COM порт, соответствующий подключенному модулю и их использовать для загрузки программы или просмотра сообщений COM порта невозможно.
Многие производители соединительных кабелей уменьшают сечение используемых проводников в кабелях. Это может приводить к повышенному падению напряжения на жилах кабеля при подаче напряжения электрического питания, вследствие чего, во время функционирования, может происходить самопроизвольная перезагрузка микроконтроллера. Для микроконтроллеров ESP8266 это не является правилом, но для микроконтроллеров типа ESP32 это надо учитывать.
Схема соединений.
Схема соединений для данного проекта приведена на рисунке.
Длины проводников в 10 см будет достаточно и для проверки функционирования и переноса конструкции в постоянное место размещения.
Соединение BME280 с модулем ESP8266 WeMos D1 mini производится при отключенном кабеле USB. Назначение соединений указано в таблице.
WeMos D1 mini | Назначение соединения | Цвет провода | BME280 |
5V | Напряжение питания | Красный | VIN |
G | Земля | Черный | GND |
D2 | I2C — SDA | Фиолетовый | SDA |
D1 | I2C — SCL | Желтый | SCL |
После электрического соединения модулей полезно проверить правильность. Особое внимание необходимо уделять соединению земли и питания.
Программа проекта.
Программа проекта отображена в следующем окне.
/*
Модуль ESP8266 LOLOIN(WeMos) D1 R2 & mini
BME280 подключение I2C: D1(GPIO5)-SCL; D2(GPIO4)-SDA
Библиотека BME280_Zanshin
DNS IP ADDRESS «Народного мониторинга»
*/
// Закомментировать для «Народного мониторинга»
#define UDP_LN
// Закомментировать для локальной сети
//#define UDP_NM
// ----- ***** ----- ESP8266 ----- ***** -----
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <Dns.h>
#define name_sketch "ESP8266_BME280_UDP_HWS_NM_240319" // Имя скетча
#define QTH "Google Drive Arduino" // Папка скетча
const char *ssid = "Name_Wi-Fi_network";
const char *password = "Password_Wi-Fi_network";
// Параметры сетевого подключения
// В некоторых роутерах используется сеть с параметрами (192, 168, 1, 1)
// Узнать можно по IP персонального компьютера (xxx, xxx, 1, xxx)
// Требуется поменять третье значение с 0 на 1)
IPAddress myDNS (192, 168, 0, 1); // IP локального DNS сервера (роутера для подключения Интернет)
IPAddress gateway (192, 168, 0, 1); // IP Интернет шлюза ((роутера для подключения Интернет)
IPAddress subnet (255, 255, 0, 0); // Маска подсети
const char* host = "narodmon.ru";
IPAddress IPNMDNS;
// Для локальной сети
#ifdef UDP_LN
// Указать параметры своего персонального компьютера
IPAddress UDP_IP (192, 168, 0, 71);
const int UDP_PORT = 7171; // Я задаю как повторение последнего значения IP адреса
#endif
// Для «Народного мониторинга»
#ifdef UDP_NM
const int UDP_PORT = 8283;
IPAddress UDP_IP (185, 245, 187, 136);
#endif
// Объявление UDP
WiFiUDP udp;
unsigned int portLN = 2573; // Произвольное значение
const uint8_t incomingPacketSize = 255; // Размер UDP пакета
char incomingPacket[incomingPacketSize]; // Буфер UDP пакета
String data_UDP_String_TX; // UDP строка данных
// ----- End ESP8266 -----
// ----- ***** ----- BME280 ----- ***** -----
#include <BME280.h> // Библиотека BME280_Zanshin
BME280_Class BME280; // Объявление датчика BME280
float altitude(const float seaLevel = 1013.25) // Уровень моря
{
static float Altitude;
int32_t temp, hum, press;
BME280.getSensorData(temp, hum, press); // Получение параметров от BME280: температуры, вдажности, давления
Altitude = 44330.0 * (1.0 - pow(((float)press / 100.0) / seaLevel, 0.1903)); // Преобразование разности давлений в метры
return (Altitude);
}
// ----- End BME280 -----
// ----- ***** ----- ***** ----- ***** ----- Global ----- ***** ----- ***** ----- ***** -----
// ----- ***** ----- ***** ----- Constants ----- ***** ----- ***** -----
const unsigned long T_Tx = 60000; // 300000 - 5 min; 60000 - 1 min
const float kP = 0.749; // Корректировка значений давления
// ----- End constants -----
// ----- ***** ----- ***** ----- Variables ----- ***** ----- ***** -----
String RW, myName;
int minSys, minSend;
unsigned long sysmillis;
float tflt, hflt, pflt; // температура, влажность, давление
// ----- End variables -----
// ----- ***** ----- End global ----- ***** -----
// ----- ***** ----- ***** ----- ***** ----- SETUP ----- ***** ----- ***** ----- ***** -----
void setup() {
delay(500);
Serial.begin(115200);
delay(500);
Serial.printf("\n\nThe name of the sketch is %s\n", name_sketch);
Serial.printf("QTH is %s\n", QTH);
Serial.println(" ----- ***** ----- Setup start ----- ***** ----- ");
// Сетевой адрес
// Для локальной сети
#ifdef UDP_LN
Serial.println("\n ----- Режим отправки метеоданных на локальный компьютер -----");
#endif
// Для «Народного мониторинга»
#ifdef UDP_NM
Serial.println("\n ----- Режим отправки метеоданных на «Народный мониторинг» -----");
#endif
Serial.print(" по сетевому адресу: ");
Serial.print("IP: ");
Serial.printf("%i:%i:%i:%i ", UDP_IP[0], UDP_IP[1], UDP_IP[2], UDP_IP[3]);
Serial.print(" Порт: ");
Serial.println(UDP_PORT);
WIFI_START(); // Подключение к Wi-Fi с DNS
Serial.print("Starting UDP.");
udp.begin(portLN);
Serial.print("\tLocal port: ");
Serial.println(udp.localPort());
BME280_START();
sysmillis = 0;
minSys = 4; // Значение для старта без ожидания
Serial.println(" ----- ***** ----- Setup end ----- ***** ----- ");
Serial.println("\n ----- ***** ----- Loop start ----- ***** ----- ");
} // ----- ***** End setup ***** -----
// ----- ***** ----- ***** ----- ***** ----- LOOP ----- ***** ----- ***** ----- ***** -----
void loop() {
// ----- ***** ----- Sys minute ----- ***** -----
if (millis() > sysmillis) {
if (minSys == 59) minSys = 0;
minSys += 1;
sysmillis += T_Tx;
Serial.print("minSys = ");
Serial.print(minSys);
Serial.print("\t");
// Ежеминтуное выполнение
// Ничего
// Окончание ежеминутного выполнения
} // ----- End sys minute -----
// ----- ***** ----- Five minutes ----- ***** -----
if (minSys % 5 == 0 && minSend != minSys) {
// Пятимунутное выполнение
read_BME280();
send_UDP_STR();
minSend = minSys;
// Окончание пятимунутного выполнения
} // ----- End five minutes -----
} // ----- ***** ----- ***** ----- End loop ----- ***** ----- ***** ----
// ***** ----- ***** ----- ***** ----- ***** ----- VOIDS ----- ***** ----- ***** ----- ***** -----
// ----- ***** ----- WIFI_START ----- ***** -----
void WIFI_START() {
Serial.printf("\nConnecting to %s ", ssid);
WiFi.begin(ssid, password);
int na = 0;
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
// Отображение сетевых параметров
Serial.println("\tConnected. ");
Serial.print("My MAC: \t");
Serial.println(WiFi.macAddress()); // Автоматическое задание имени датчику через MAC
macToTXT();
Serial.print("My IP address: \t");
Serial.println(WiFi.localIP());
// ----- end WiFi -----
// Получение IPAddress NMDNS
Serial.print("\nDNS start...");
if (!WiFi.hostByName("narodmon.ru", IPNMDNS))
{
Serial.println("Couldn't get IPAddress NMDNS");
return;
}
else {
Serial.print("\nIP narodmon.ru: ");
Serial.println(IPNMDNS);
}
} // ----- end WIFI_START -----
// ----- ***** ----- macToTXT ----- ***** -----
void macToTXT() {
String myMAC = WiFi.macAddress();
myName = "";
myName += myMAC.substring(9, 11);
myName += myMAC.substring(12, 14);
myName += myMAC.substring(15);
Serial.print("My name: \t");
Serial.println(myName);
}// ----- End macToTXT -----
// ----- ***** ----- send_UDP_STR ----- ***** -----
void send_UDP_STR() {
// Строка для передачи
String UDP_Str;
UDP_Str += "#Meteo_" + myName + "\n";
UDP_Str += "#T_" + myName + "#" + String(tflt) + "\n";
UDP_Str += "#H_" + myName + "#" + String(hflt) + "\n";
UDP_Str += "#P_" + myName + "#" + String(pflt) + "\n";
UDP_Str += "##";
Serial.println("Отправка сообщения: ");
Serial.println(UDP_Str);
// Преобразование строки в массив символов
uint16_t len_UDP_Str = UDP_Str.length();
char tts[len_UDP_Str + 1];
strcpy(tts, UDP_Str.c_str());
// Отправка сообщения
Serial.print("по сетевому адресу: ");
Serial.print("IP: ");
Serial.printf("%i:%i:%i:%i\t", UDP_IP[0], UDP_IP[1], UDP_IP[2], UDP_IP[3]);
Serial.print(" Порт: ");
Serial.println(UDP_PORT);
udp.beginPacket(UDP_IP, UDP_PORT);
udp.write(tts);
udp.endPacket();
} // ----- Еnd send_UDP_STR -----
// ----- ***** ----- BME280_START ----- ***** -----
void BME280_START() {
Serial.println ("\n Initializing BME280 sensor");
while (!BME280.begin(I2C_FAST_MODE_PLUS_MODE)) // Start BME280 using I2C protocol
{
Serial.println(F(" Unable to find BME280. Waiting 3 seconds."));
delay(3000);
} // of loop until device is located
BME280.mode(SleepMode);
Serial.print(F("- Sensor detected in operating mode \""));
Serial.print(BME280.mode());
Serial.println(F("\"."));
if (BME280.mode() == 0)
{
Serial.print(F("- Turning sensor to normal mode, mode is now \""));
Serial.print(BME280.mode(NormalMode)); // Use enumerated type values
Serial.println("\"");
} // of if-then we have sleep mode
Serial.println(F("- Setting 16x oversampling for all sensors"));
BME280.setOversampling(TemperatureSensor, Oversample16);
BME280.setOversampling(HumiditySensor, Oversample16);
BME280.setOversampling(PressureSensor, Oversample16);
Serial.println(F("- Setting IIR filter to maximum value of 16 samples"));
BME280.iirFilter(IIR16);
Serial.println(F("- Setting time between measurements to 1 second"));
BME280.inactiveTime(inactive1000ms);
Serial.print(F("- Each measurement cycle will take "));
Serial.print(BME280.measurementTime(MaximumMeasure) / 1000);
Serial.println(F(" ms."));
} // ----- ***** End BME280_START ***** -----
// ----- ***** ----- Read_BME280 ----- ***** -----
void read_BME280() {
Serial.println("\nИзмерение метеопараметров:");
static uint8_t loopCounter = 0; // iteration counter
static int32_t temperature, humidity, pressure; // Store readings
BME280.getSensorData(temperature, humidity, pressure); // Get most recent readings
tflt = temperature / 100.0;
hflt = humidity / 100.0;
pflt = pressure / 100.0 * kP;
Serial.print(F("Temperature: "));
Serial.print(tflt); // Temperature in deci-degrees
Serial.print(F(" 0C; "));
if (BME280.getOversampling(HumiditySensor) != 0)
{
Serial.print(F("Humidity: "));
Serial.print(hflt); // Humidity in deci-percent
Serial.print(F(" %; "));
} // of if-then humidity sensing turned off
Serial.print(F("Pressure: "));
Serial.print(pflt);
Serial.print(F(" mmH; Altitude: "));
Serial.print(altitude());
Serial.println(F(" m"));
delay(5000);
if (++loopCounter % 10 == 0) // Every 10th reading
{
Serial.print(F("\n- Turning "));
if (BME280.getOversampling(HumiditySensor) == 0)
{
BME280.setOversampling(HumiditySensor, Oversample16); // Turn humidity sensing on
Serial.print(F("ON"));
} else
{
BME280.setOversampling(HumiditySensor, SensorOff);
Serial.print(F("OFF"));
} // of if-then-else humidity sensing turned off
Serial.println(F(" humidity sensing"));
BME280.setOversampling(HumiditySensor, SensorOff); // No longer interested in humidity
Serial.print(F("- Each measurement cycle will now take "));
Serial.print(BME280.measurementTime(MaximumMeasure) / 1000.0); // returns microseconds
Serial.println(F("ms.\n"));
} // of if-then first loop iteration
}// ----- End read_BME280() -----
Замечания по использованию программы.
Скопируйте текст программы в буфер обмена с помощью команды копирования (Прямоугольники в правом верхнем углу окна программы. Проявляются при наведении курсора.).
Вставьте скопированный текст в ПУСТОЕ окно нового скетча IDE Arduino (предварительно выделите всё, что там есть и удалите).
Присвойте скетчу имя и сохраните его.
Внесите в программу изменения:
- Узнайте IP адрес своего персонального компьютера (СПК) и укажите его в стр. 39. (IP адрес указывается как последовательность четырёх целых значений в диапазоне 0..255, разделённых запятой — представляет собой целочисленный массив, состоящий из четырёх элементов с индексами 0, 1, 2, 3);
- Назначьте произвольный номер UDP порта СПК в стр. 40. Для простоты можно дублировать цифры последнего элемента IP адреса СПК;
- Проверить соответствие сетевых настроек в стр. 26..32 IP адресу СПК (x, x, 0 или 1?, x);
- При проверке проверить активность стр.10: #define UDP_LN и комментарий стр. 12: //#define UDP_NM. Это определит передачу UDP пакетов на СПК.
Установите в настройках IDE Arduino плату типа ESP8266 LOLIN (WEMOS) D1 R2 & mini.
Соберите устройство в соответствии со схемой.
Подключите плату модуля ESP8266 к USB порту СПК с помощью соответствующего USB кабеля.
Определите номер COM порта и установите его в IDE Arduino (может потребоваться несколько раз подключить/отключить плату, чтобы его узнать).
Откройте монитор COM порта IDE Arduino. Установите скорость обмена данными 115 200 бод/с.
Загрузите программу в модуль ESP8266.
В мониторе COM порта должны появиться данные функционирования программы (см. окно).
The name of the sketch is ESP8266_BME280_UDP_HWS_NM_240319
QTH is Google Drive Arduino
----- ***** ----- Setup start ----- ***** -----
----- Режим отправки метеоданных на локальный компьютер -----
по сетевому адресу: IP: 192:168:0:71 Порт: 7171
Connecting to Name_Wi-Fi_network ....... Connected.
My MAC: 84:0D:8E:8E:3B:1A
My name: 8E3B1A
My IP address: 192.168.0.63
DNS start...
IP narodmon.ru: 185.245.187.136
Starting UDP. Local port: 2573
Initializing BME280 sensor
- Sensor detected in operating mode "0".
- Turning sensor to normal mode, mode is now "3"
- Setting 16x oversampling for all sensors
- Setting IIR filter to maximum value of 16 samples
- Setting time between measurements to 1 second
- Each measurement cycle will take 1112 ms.
----- ***** ----- Setup end ----- ***** -----
----- ***** ----- Loop start ----- ***** -----
minSys = 5
Измерение метеопараметров:
Temperature: 23.06 0C; Humidity: 45.48 %; Pressure: 759.95 mmH; Altitude: -11.40 m
Отправка сообщения:
#Meteo_8E3B1A
#T_8E3B1A#23.06
#H_8E3B1A#45.48
#P_8E3B1A#759.95
##
по сетевому адресу: IP: 192:168:0:71 Порт: 7171
minSys = 6 minSys = 7 minSys = 8 minSys = 9 minSys = 10
Измерение метеопараметров:
Temperature: 23.21 0C; Humidity: 45.39 %; Pressure: 759.97 mmH; Altitude: -11.57 m
Отправка сообщения:
#Meteo_8E3B1A
#T_8E3B1A#23.21
#H_8E3B1A#45.39
#P_8E3B1A#759.97
##
по сетевому адресу: IP: 192:168:0:71 Порт: 7171
Данное содержимое будет получено, если всё сделано и работает правильно.
Проверка выполнения программы.
Пройдёмся по последовательности выполнения.
—— ***** —— Setup start —— ***** ——
Идентификация программы.
стр. 1 Имя программы должно соответствовать данному Вами названию скетча.
стр. 2 Местоположение программы должно соответствовать папке IDE Arduino.
Подключение к Wi-Fi сети.
Если подключение не происходит (стр. 4) (подключение происходит более 30 сек), проверьте в программе (стр. 23, 24):
- Имя Wi-Fi сети;
- Пароль Wi-Fi сети.
Заглавные и строчные буквы, как и остальные символы имеют значение.
Подключение произошло успешно, если в конце стр. 8, после многоточия, получено сообщение «… Connected».
Идентификаторы модуля ESP8266 (MAC, name, IP address) формируются программно, являются уникальными для используемого модуля ESP8266 и будут далее использованы для идентификации метеостанции на сервере «Народного мониторинга».
Cоединение с Интернет.
Успешное соединение с Wi-Fi сетью, правильное задание сетевых параметров и подключение к Интернет подтверждается работой службы DNS и определением DNS сайта «Народного мониторинга».
Сравните полученное значение IP адреса сервера «Народного мониторинга» (стр. 14) с указанным в скетче (стр. 46). Эти два значения должны совпадать.
Инициализация датчика BME280.
Реализуется подпрограммой BME280_START().
Результаты успешного выполнения отображены в стр. 17..23.
Если результаты инициализации отсутствуют, то следует проверить:
- имя и версию используемой библиотеки;
- подключение датчика BME280 к модулю ESP8266;
- работоспособность датчика с используемым примером из библиотеки для подключения датчика.
В результатах инициализации датчика BME280 следует обратить внимание на стр. 23, где указано, что цикл измерения составляет 1112 мс — более 1 сек. Датчик очень медленный.
Инициализация датчика BME280 завершает выполнение Setup программы и программа переходит на выполнение рабочего цикла.
—— ***** —— Loop start —— ***** ——
В рабочем цикле программы производится отсчёт времени по таймеру миллисекунд.
Отсчитываются два временных интервала: минутный и пятиминутный.
Минутный цикл.
В минутном цикле никаких действий, кроме отсчёта минут и их вывода в монитор (стр. 37) не производится. Предусмотрена возможность выполнения требуемых задач, определяемых пользователем. Код (имена исполняемых подпрограмм) можно вставить между стр. 143..145 программы.
Пятиминутный цикл.
В пятиминутном цикле производятся действия:
- измерение метеопараметров (read_BME280());
- отправка метеопараметров по протоколу UDP по заданному сетевому адресу (send_UDP_STR()).
Измерение метеопараметров.
Производится подпрограммой read_BME280() (стр. 274..316).
Она обращается к датчику BME280, запускает измерение параметров и возвращает измеренные значения температуры — tflt, влажности — hflt, давления — pflt в числовой форме. Эти переменные глобальные и служат для передачи значений в другие подпрограммы, например, для отправки по протоколу UDP по заданному сетевому адресу.
Отправка значений метеопараметров по протоколу UDP по заданному сетевому адресу.
Производится подпрограммой send_UDP_STR() (стр. 212..238).
Эта подпрограмма:
- формирует формат сообщения (многострочное текстовое сообщение с дополнением необходимыми разделителями данных);
- преобразует формат строки в массив символов, необходимых для их отправки;
- выводит сообщение и используемый сетевой адрес в монитор для контроля пользователем;
- отправляет сообщение.
Результаты выполнения подпрограммы находятся на стр. 30..36.
Проверка отправки сообщения по протоколу UDP по заданному сетевому адресу.
В программе предусмотрены два варианта задания сетевого адреса: сетевой адрес СПК и сервера «Народного мониторинга». Выбор сетевого адреса производится активизацией ТОЛЬКО ОДНОЙ СТРОКИ: 10 или 12. Вторая строка ОБЯЗАТЕЛЬНО ДОЛЖНА БЫТЬ ЗАКОММЕНТИРОВАНА.
В режиме проверки (активна стр. 10 #define UDP_LN и закомментирована стр. 12 //#define UDP_NM), с параметрами СПК (IP адрес СПК и UDP порт) (стр. 38..40 программы) отправляемое сообщение можно посмотреть в программе TCP/IP Builder. Оно должно совпадать с приведенным на рисунке. Естественно, окончания названий — «8E3B1A» должны отличаться и соответствовать MAC адресу Вашего модуля ESP8266? т.к. они уникальны.
Если сообщение не приходит, то необходимо проверить:
- правильность задания параметров сетевого подключения (стр. 26..32 программы);
- правильность задания сетевого адреса СПК (стр. 38..40 программы);
- правильность задания сетевого адреса СПК (Local IP и Port) в программе TCP/IP Builder;
- правильность задания типа протокола UDP в программе TCP/IP Builder;
- активацию создания соединения (Create Socket) в программе TCP/IP Builder.
Нарушение формата сообщения сделает невозможным его обработку на сервере «Народного мониторинга». Необходимо будет найти ошибку формата и исправить её.
Получение сообщения от метеостанции программой TCP/IP Builder с приведённым форматом подтверждает правильность работы метеостанции и делает возможным переключение программы на отправку сообщения на сервер «Народного мониторинга».
Переключение отправки сообщения на сервер «Народного мониторинга».
Для переключения адреса получателя сообщений с СПК на сервер «Народного мониторинга» необходимо изменить две строки:
- стр. 10 — закомментировать;
- стр. 12 — раскомментировать.
Должно выглядеть так:
// Закомментировать для «Народного мониторинга»
// #define UDP_LN
// Закомментировать для локальной сети
#define UDP_NM
После внесения изменения в программу её необходимо загрузить в ESP8266.
После перезагрузки ESP8266 сообщения начнут отправляться на сервер «Народного мониторинга», где их можно увидеть во вкладке «Данные, полученные от прибора», предварительно зарегистрировав метеостанцию на сервере «Народного мониторинга».
Размещение метеостанции.
Метеостанцию следует защитить от попадания природной влаги (дождя, даже при сильном ветре) и размещать в хорошо продуваемом ветром месте, укрытым от попадания прямых солнечных лучей. Например, как показано на фото.
В данном проекте метеостанция помещена в электротехническую коробку со снятой с нижней стороны заглушкой и закреплена на стропиле крыши с северной стороны для уменьшения разогрева солнечным светом. Дополнительная тепловая изоляция от крыши обеспечивается тепловым экраном в виде теплоизолятора фольгово-полимерного типа, проложенного между черепицей и стропилом, и накрывающего метеостанцию, обеспечивая ей дополнительную гидроизоляцию.
Электрическое питание метеостанции подаётся от зарядного устройства, преобразующего напряжение электрической сети 220 В, в напряжение питания 5 В. Блок розеток включен через Wi-Fi розетку (на фотографии не видно), что очень удобно, в случаях необходимости дистанционной перезагрузки метеостанции при сбоях в работе.
Датчик BME280 выдвинут из коробки для свободного обдува окружающим воздухом и исключения нагрева микроконтроллером.
Микроконтроллер ESP8266 подключается к Wi-Fi роутеру, установленному в доме. Уровня сигнала оказывается достаточно для уверенного соединения.
Местоположение датчика и его данные можно посмотреть по ссылке: https://narodmon.ru/6918.
Регистрация датчика на сервере «Народного мониторинга».
Производится согласно действующей инструкции сайта «Народного мониторинга»
(«Народный мониторинг — Справка — Как добавить свой датчик»).
Итоги.
Данный проект является одним из самых простейших реализаций с использованием указанных комплектующих. Это является его достоинством.
Список недостатков гораздо более длинен.
К сожалению, не всегда удобно иметь возможность подключения только к одной сети Wi-Fi.
На рабочем месте я использую отдельную Wi-Fi сеть с уникальным именем. Это удобно для проверки и отработки проектов. При переносе прибора к месту установки, там может действовать другая Wi-Fi сеть и бывает трудно разобраться в причинах неработоспособности без обновления прошивки с новым именем Wi-Fi сети. В «рабочих прошивках» я реализую процедуру поиска и попытки подключения к Wi-Fi сети в месте установки прибора и, при невозможности подключения к ней в течении 30 секунд, процедуру подключения к Wi-Fi сети, действующей на рабочем месте.
Реализована, но не используется процедура определения IP адреса сервера «Народного мониторинга». Может случится ситуация, когда IP адрес изменится, и пакеты буду посылаться по старому адресу в никуда. Такая ситуация крайне маловероятна, но законы Мерфи никто не отменял. Желательно определять IP адрес сервера «Народного мониторинга» при каждом включении метеостанции (перед каждой отправкой сообщения). Я столкнулся с такой ситуацией, что при работоспособной локальной сети определение IP адреса службой DNS не выполнялось, что приводило к нарушениям периодичности отправки пакетов серверу «Народного мониторинга» и подозрениям на отказ аппаратной части или программного сбоя.
Использование протокола UDP достаточно доступно. Однако, его недостатком является возможность потери пакетов в сети, что будет также нарушать периодичность обновления данных на сервере «Народного мониторинга». Хотя у этого протокола есть одно преимущество — он способен отправлять пакеты в локальной сети сразу всем пользователям, независимо от уникального IP адреса каждого клиента сети, т.н. широковещание. Это свойство я использую для извещения локальных метеоинформаторов (ESP8266 + дисплей), которые можно размещать в любом месте и отображать на них, кроме текущих значений метеопараметров, время и другую информацию, например, время, дата и т.д.
Алгоритм действия метеостанции не предусматривает использование режимов энергосбережения. Это не критично для сетевого питания, однако исключает возможность автономного размещения метеостанции с питанием от аккумулятора/батареи.
Есть и другие недостатки.
Устранение этих недостатков фрагментарно будет рассмотрено в других публикациях…