ESP8266 и Arduino IDE. Часть 10d: IoT-монитор. Финальный проект
Эта статья завершает серию из 10 частей по разработке на ESP8266 с Arduino IDE, представляя полноценную систему мониторинга температуры/влажности с LCD-дисплеем и веб-интерфейсом.
Решаемые проблемы
Проект решает несколько задач:
Жёстко закодированные 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);
}
}
Состояния LCD при подключении
Управление 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 через таймерный механизм
Веб-интерфейс
Структура скетча
Организация из трёх вкладок:
ESP8266-10D_sketch01.ino– основная логикаSCM.h– Simple Connection Managerwebpage.h– HTML-интерфейс
Корпус проекта
Полный скетч доступен для скачивания: ESP8266-10D_sketch_001_Final.zip
Навигация по серии
Эта статья завершает серию из 10 частей – от базовой настройки ESP8266 через WebSocket до финального интегрированного проекта.