ESP8266 и Arduino IDE. Часть 10d: IoT-монитор. Финальный проект

Эта статья завершает серию из 10 частей по разработке на ESP8266 с Arduino IDE, представляя полноценную систему мониторинга температуры/влажности с LCD-дисплеем и веб-интерфейсом.

IoT-монитор -- вид спереди (Цельсий)

IoT-монитор -- вид спереди (Фаренгейт)

Решаемые проблемы

Проект решает несколько задач:

  • Жёстко закодированные IP-адреса, препятствующие гибкости сети

  • Сложность обнаружения IP-адреса устройства в локальной сети

  • Задержки инициализации WebSocket, вызывающие пропуск обновлений данных

  • Управление учётными данными сети


Схема и сборка

Принципиальная схема

Макетная плата

Монтажная плата

Монтажная плата -- другой вид

Монтажная плата -- готовая

Простой менеджер подключений (SCM)

Пользовательское решение, заменяющее WiFi Manager. SCM обеспечивает:

  • Управление учётными данными сети без зависимости от библиотек

  • Лёгкое переключение сетей через аппаратный переключатель

  • Отображение деталей подключения на LCD

  • Надёжную обработку подключений

if ( digitalRead( pinSWITCH2) == LOW ) { WiFi.disconnect(); }

if (WiFi.SSID() != "" ) {
    WiFi.mode(WIFI_AP_STA);
    WiFi.begin();
    byte count = 0;
    while ( (WiFi.status()!=WL_CONNECTED ) && ( count< 20) ) {
        if (DEBUG) { Serial.print(F(".")); }
        count++;
        delay(500);
    }
}

Код SCM

Состояния LCD при подключении

Подключение к сети

Подключено

Ошибка подключения

Нет сохранённых данных

Режим SCM

Сети не найдены

Подключение не удалось

Подключено к сети

IoT-монитор активен

Данные сети

Управление WebSocket

Подключения WebSocket требуют подтверждения инициализации перед передачей данных:

Socket.onopen = function() {
    console.log('WS open');
    Socket.send('#');
}

ESP8266 ожидает этот сигнал перед обновлением веб-страницы:

if (payload[0] == '#') {
    if (DEBUG) { Serial.println(F("websocket started\n")); }
    webSocketIsOpen = true;
    updateSensors(webSocketIsOpen);
}

Переключение шкалы температуры

boolean const CELSIUS = false;
boolean const FAHRENHEIT = true;

switchPinState = digitalRead(pinSWITCH);
if (switchPinState==FAHRENHEIT) {whichTemp = FAHRENHEIT;}
else {whichTemp = CELSIUS;}
if (whichTemp != oldTemp) {
    oldTemp = whichTemp;
    updateSensors(webSocketIsOpen);
}

Обработка запросов веб-страницы

if (client) {
    String REQUEST = client.readStringUntil('\r');
    int URI_START = REQUEST.indexOf(" ");
    int URI_END = REQUEST.indexOf(" ", URI_START+1 );

    if (URI_START != -1 && URI_END != -1) {
        String URI = REQUEST.substring(URI_START+1, URI_END);
        URI.toLowerCase();

        if ( URI == "/" ) {
            client.flush();
            client.print( HTTP_HEADER );
            client.print( HTML_1 );
            webSocketIsOpen = false;
        }
    }
}

Отображение информации о сети

boolean btnSwitchState = digitalRead( pinSWITCH2);
if ( btnSwitchState == LOW ) {
    if (btnSwitchPrevState != LOW) {
        displayInfo_StartTime = millis();
        displayInfo_Active = true;
        btnSwitchPrevState = LOW;
        lcd.clear();
        if ( WiFi.status()== WL_CONNECTED ) {
            lcd.setCursor(0, 0);
            lcd.print(LCD_Title);
            lcd.setCursor(0, 2);
            lcd.print( WiFi.SSID() );
            lcd.setCursor(0, 3);
            lcd.print(WiFi.localIP());
        }
    }
}
Информация о сети на LCD

Функции кнопок

  • При запуске: очистка сохранённых учётных данных для смены сети

  • В рабочем режиме: отображение информации о сети на LCD через таймерный механизм


Веб-интерфейс

Веб-интерфейс IoT-монитора

Структура скетча

Организация из трёх вкладок:

  • ESP8266-10D_sketch01.ino – основная логика

  • SCM.h – Simple Connection Manager

  • webpage.h – HTML-интерфейс

Arduino IDE с тремя вкладками

Корпус проекта

Корпус вид 1

Корпус вид 2

Корпус вид 3

Корпус вид 4

Проект в корпусе

Полный скетч доступен для скачивания: ESP8266-10D_sketch_001_Final.zip


Навигация по серии

Эта статья завершает серию из 10 частей – от базовой настройки ESP8266 через WebSocket до финального интегрированного проекта.