ESP8266 Web and MQTT Framework

preview_player
Показать описание
Базовые класы для быстрого создания скетчей с поддержкой Web-страниц, параметрами в EEPROM, обновлением по "воздуху", поддержкой SPIFFS, взаимодействием с MQTT брокером для платформы ESP8266.
При загрузке без сохраненных параметров (первом запуске) модуль переходит в режим автономной точки доступа с именем ESP8266 и паролем Pa$$w0rd. Подключитесь с телефона или планшета к нему и зайдите на его главную страницу в веб-браузере, чтобы изменить и сохранить параметры подключения к вашей WiFi-инфраструктуре.

Рекомендации по теме
Комментарии
Автор

Вот спасибо. Делаю инкубатор и там думаю использовать этот датчик. И тут такая находка, Ваш ролик. Еще раз СПАСИБО.

kwbvpez
Автор

Thanks Alex. Your examples are very helpful. I do not understand Russian, but I do understand your projects.

peut
Автор

Отличное видео. Спасибо за разъяснения и исходники, интересно покопаться )

doprdele
Автор

Спасибо за видео. Вопрос, датчик SHT10 подключится аналогично как и BMP, с соответствующим добавлением библиотеки ?

kwbvpez
Автор

Доброй ночи! Лайк за видео, очень подробно объясняете. Хотел Вам задать пару вопросов. В первой версии ESP_Relay Вы используете один ino файл и для передачи вэб-страницы используете String message = F("....); и используете конкатенацию строк для вывода переменных, используемых на странице. В более поздних версиях кода Вы уже используете несколько файлов с классами. Для чего было необходимо введение классов?
В некоторых примерах мне встречалось использование префикса R - необработанные строковые литералы для передачи вэб-страницы. Почемы Вы не использовали данный префикс? А используете для вывода страницы префикс F. А для вывода скрипта уже используете строковые константы в флеш памяти и префикс FPSTR. Получилось немного сумбурно, но понравилась Ваша реализация вэб-интерфейса и хотелось бы разобраться в самом коде, а не просто использовать обертку.
ЗЫ: еще вопрос вдогонку, почему не используете для хранения html, js, css SPIFFS?

wfbnchl
Автор

Еще вопрос. Поставить библиотеку SHT1x с датчиком в Ваш скетч не получиться??? придется весь код переделывать? В библиотеке BME 280 сразу прописывается подключение датчика по I2C, а в библиотеке SHT1x такого нет((( нужно будет в скетче обозначать пины подключения? или есть более легкий путь?

kwbvpez
Автор

Попробовал адаптировать код под датчик Si7021 с Adafruit_Si7021.h( да простит автор за вольное усечения кода-в планах только Si7021) .В сериале только первая "мусорная"строка, uptime(0), Heap(0), данные с датчика (0).Если будет время пробежать по коду, буду благодарен за любое замечание..

#include <Wire.h>
#include <Adafruit_Si7021.h>
#include "ESPWebMQTT.h"

const char* const jsonTemperature PROGMEM = "temperature";
const char* const jsonHumidity PROGMEM = "humidity";

class ESPBaro : public ESPWebMQTTBase {
public:
ESPBaro();
protected:
void setupExtra();
void loopExtra();
void handleRootPage();
String jsonData();
private:
Adafruit_Si7021* bm;
float temperature;
float humidity;
};

/*
* ESPWebBaro class implementation
*/
ESPBaro::ESPBaro() : ESPWebMQTTBase() {
bm = new Adafruit_Si7021();
}

void ESPBaro::setupExtra() {
ESPWebMQTTBase::setupExtra();
bm->begin();
}

void ESPBaro::loopExtra() {
const uint32_t timeout = 1000; // 1 sec.
static uint32_t nextTime;

ESPWebMQTTBase::loopExtra();
if (millis() >= nextTime) {
temperature = bm->readTemperature();
humidity = bm->readHumidity();

if (pubSubClient->connected()) {
String path, topic;

if (_mqttClient != strEmpty) {
path += charSlash;
path += _mqttClient;
}
path += charSlash;
topic = path + FPSTR(jsonTemperature);
mqttPublish(topic, String(temperature));
topic = path + FPSTR(jsonHumidity);
mqttPublish(topic, String(humidity));
}
nextTime = millis() + timeout;
}
}

void ESPBaro::handleRootPage() {
String script = F("var temp, press, humid;\n\
function refreshData() {\n\
var request = new XMLHttpRequest();\n\
request.open('GET', '");
script += FPSTR(pathData);
script += F("', true);\n\
request.onreadystatechange = function() {\n\
if (request.readyState == 4) {\n\
var data =
document.getElementById('");
script += FPSTR(jsonFreeHeap);
script += F("').innerHTML = data.");
script += FPSTR(jsonFreeHeap);
script += F(";\n\
document.getElementById('");
script += FPSTR(jsonUptime);
script += F("').innerHTML = data.");
script += FPSTR(jsonUptime);
script += F(";\n\
document.getElementById('");
script += FPSTR(jsonTemperature);
script += F("').innerHTML = data.");
script += FPSTR(jsonTemperature);
script += F(";\n");
script +=
script += FPSTR(jsonHumidity);
script += F("').innerHTML = data.");
script += FPSTR(jsonHumidity);
script += F(";\n");

script +=
script +=

script += F("}\n\
}\n\
request.send(null);\n\
setTimeout(refreshData, 1000);\n\
}\n\
function onBodyLoad() {\n\
temp = createGraph(document.getElementById(\"temp\"), \"Temperature (C)\", 400, 200, 0, 50, false, \"cyan\");\n");
script += F("humid = createGraph(document.getElementById(\"humid\"), \"Humidity (%)\", 400, 200, 0, 100, false, \"gold\");\n");

script += F("refreshData();\n\
}\n");

String page =
page += ESPWebBase::webPageScript(F("graphs.js"), true);
page +=
page +=
page += F("<h3>ESP8266</h3>\n\
<p>\n\
Heap free size: <span id=\"");
page += FPSTR(jsonFreeHeap);
page += F("\">0</span> bytes<br/>\n\
Uptime: <span id=\"");
page += FPSTR(jsonUptime);
page += F("\">0</span> seconds<br/>\n\
Temperature: <span id=\"");
page += FPSTR(jsonTemperature);
page += F("\">0</span> C<br/>\n");

page += F("Humidity: <span id=\"");
page += FPSTR(jsonHumidity);
page += F("\">0</span> %<br/>\n");

page += F("</p>\n\
<div id=\"temp\"></div>\n");

page += F("<div id=\"humid\"></div>\n");

page += F("<p>\n");
page += navigator();
page += ESPWebBase::webPageEnd();

httpServer->send(200, FPSTR(textHtml), page);
}

String ESPBaro::jsonData() {
String result = ESPWebMQTTBase::jsonData();
result += F(", \"");
result += FPSTR(jsonTemperature);
result += F("\":");
result += String(temperature);
result += F(", \"");

result += F(", \"");
result += FPSTR(jsonHumidity);
result += F("\":");
result += String(humidity);

return result;
}

ESPBaro* app = new ESPBaro();

void setup() {
Serial.begin(115200);
Serial.println();

app->setup();
}

void loop() {
app->loop();
}

kabikin
Автор

Маленький совет, если что-то хотите показать, то пожалуйста в камеру. А так видно интересное

chrisn.
Автор

Здравствуй, подскажи если не сложно как и где в скетче прописать по умолчанию свою точку доступа, к которой конектится устройство?

VDen
Автор

Здравствуйте
Я использую ваш проект Умного реле в связке с Cloudmqtt.com
Есть такая проблемка - при изменении состояния реле через Web интерфейс или ИК пультом и последующем открытии мобильного MQTT клиента (MQTT Dash), последний невидит изменившегося состояния реле! (получается что MQTT клиент не читает топики которые были опубликованны в его отсутствие)
Можно ли какнибудь это побороть?

SibMan
Автор

Алекс, добрый день!
Если не трудно. подскажите как это можно сделать?
Недавно в коментах к одному из ваших роликов всплыла тема SSDP. Показалось интересным добавить данную возможность к вашим наработкам. Пытался добавить код в ваш класс ESPWeb Но, увы, пока мозгов не хватает :)
в доках на библиотеку вроде все просто. нужно:
...
HTTP.on("/description.xml", HTTP_GET, [](){
SSDP.schema(HTTP.client());
});
HTTP.begin();

Serial.printf("Starting SSDP...\n");

SSDP.setHTTPPort(80);
SSDP.setName("Philips hue clone");

SSDP.setURL("index.html");
SSDP.setModelName("Philips hue bridge 2012");

SSDP.setManufacturer("Royal Philips Electronics");
SSDP.begin();

проблема возникла с реализацией вот этого момента:
HTTP.on("/description.xml", HTTP_GET, [](){
SSDP.schema(HTTP.client());
});


что пытался сделать:
1. добавил библиотеку
#include <ESP8266SSDP.h>
2. в ESPWebBase::setupHttpServer() добавил строки
)).c_str(), HTTP_GET, std::bind(&ESPWebBase::handleSSDP, this));


SSDP.setHTTPPort(80);
SSDP.setName("ESPWEBSERVER");

SSDP.setURL("/");



SSDP.begin();
}
3. добавил в ESPWebBase.h
const char* const SSDPData PROGMEM = "/description.xml";
4. добавил функцию handleSSDP
void ESPWebBase::handleSSDP() {

}

при обращении по http://<IP address>/description.xml браузер честно отображает содержимое всех полей SSDP, но в сетевом окружении ничего не появляется...
я, как правильный Олень, понимаю, что проблема в неверной реализации конструкции
SSDP.schema(HTTP.client());
но как ее сделать верной - не догоняю. увы.

не подскажете?

stanislavbogdanovich
Автор

Alex привет. Помоги прикрутить датчик SHT к ESP 8266, слежу за твоим каналом ты в этой теме как рыба в воде, и наверное для тебя это будет сущий пустяк. Или хотя бы подскажи где найти информацию.

kwbvpez
Автор

Alex в чем может быть проблема пытаюсь проверить твой код, без исправлений, хотел потом поменять на датчик sht10, выдает ошибку C:\Program Files fatal error: functional: No such file or directory

#include <functional>

kwbvpez
Автор

Почему-то после ребута у меня пин всегда переходит в HIGH, независимо от выбранного варианта в настройках.

krendelyk
Автор

помогите разобраться с этой библиотекой pubsubclient - не подключается если параметры восстановлены из eeprom (правильно восстановлены!!), если статично прописать в скетче, то все отлично подключается.
В общем ни как у меня не выходит и с разными библиатеками pubsubclient пробовал.

kreptonyou