NEWS
Панель управления на ESP8266 и Nextion
-
Решил сделать панель управления умным домом на ESP8266 и монитор Nextion 3.5"
Что для этого нужно:
1)Блок питания с 24-12В на 5В
2)ESP8266
3)Sensor temp HTU21D
4)Nextion 3.5"
5)Распечатка крышки на 3d принтере
ESP модуль принимает данные с Nexton и датчика температуры, данные отправляет на сервер по MQTT, пока сделал управление температурой, т.к. управлять в комнате больше нечем.
Но можно настроить экран на любые функции, например управление светом, тогда выключатели в комнате не нужны будут.
Ссылка на STL файлы крышки + фото + описание комплектующих с ссылками на них:
https://www.thingiverse.com/thing:2603232
Все это управляется по MQTT
Выкладываю пример код как есть на данный момент для ESP8266, его нужно доделывать, но и так работает уже больше месяца, пока без каких либо проблем :) :
! ```
`#include <nextion.h>
#include <esp8266wifi.h>
#include <wificlient.h>
#include <esp8266webserver.h>
#include <esp8266mdns.h>
#include <esp8266httpupdateserver.h>
#include <eeprom.h>
#include <mqtt.h>
#include <wire.h>
#include "Adafruit_HTU21DF.h"
! void SendData(String& topic, String& data);
void myPublishedCb();
void myDisconnectedCb();
void myConnectedCb();
! // ------------------------------Определяем псевдонимы топиков------------------------------------------------------------------
#define CLIENT_ID "kitchen"
#define TEMPOUT "/kitchen/temp_out" //температура снаружи
#define TEMPEND "/kitchen/temp_end" //выставленная температура
#define TIME "/kitchen/time" //время
// #define PIR D1 // gpio 5
! Adafruit_HTU21DF htu = Adafruit_HTU21DF();
! //----переменные для сервера MQTT---------------
const uint32_t& port = 1883;
const char* ip_adr = "..."; //Введите IP сервера MQTT
! //--------переменные для Nextion---------------
String incStr = ""; // Это будет приемник информации от Nextion
bool serialReadFlag = false; //Флаг проверки сообщения пришедшего от Nextion
! //-------------настройки WEB Server
String webPage = "";
String str = "";
boolean conf = false;// char pir = 0; //Для датчика движения
String iphost = "";
int count = 0;! IPAddress ip(,,,); //Статический IP адресс
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
MQTT myMqtt(CLIENT_ID, ip_adr, port);
MDNSResponder mdns;
ESP8266WebServer server(80);
ESP8266HTTPUpdateServer httpUpdater;
! //-----------------------------------------------------------------------------------------------------------------------
void setup(void) {
! byte len_ssid, len_pass;delay(1000);
Serial.begin(115200);
Serial.println();EEPROM.begin(98);
! len_ssid = EEPROM.read(96);
len_pass = EEPROM.read(97);
if(len_pass > 64) len_pass = 0;
! pinMode(0, INPUT_PULLUP);
if((len_ssid < 33) && (len_ssid != 0)){
// --------------------------------------------------------------Режим STATION-------------------------------------------------------------------------
WiFi.mode( WIFI_STA);
unsigned char* buf_ssid = new unsigned char[32];
unsigned char* buf_pass = new unsigned char[64];
for(byte i = 0; i < len_ssid; i++) buf_ssid[i] = char(EEPROM.read(i));
buf_ssid[len_ssid] = '\x0';
const char ssid = (const char)buf_ssid;
for(byte i = 0; i < len_pass; i++) buf_pass[i] = char(EEPROM.read(i + 32));
const char pass = (const char)buf_pass;
buf_pass[len_pass] = '\x0';
!
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, pass);
WiFi.config(ip, gateway, subnet);while (WiFi.status() != WL_CONNECTED) {
delay(1000);
// count++;
// if(count<15){
Serial.print(WiFi.status());}
// else{
// EEPROM.write(96,255);
// EEPROM.commit();
// EEPROM.end();
// conf = true;
// }
// }! Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());if (mdns.begin("esp8266", WiFi.localIP())) {
Serial.println("MDNS responder started");
// "Запущен MDNSresponder"
}
// pinMode(PIR, INPUT);server.on("/", {
webPage="";
webPage += "";
webPage +="";
webPage +="";
webPage +="! Температура: "+ String(htu.readTemperature()) +"
! "; //-----------------------------------------------------ТЕМПЕРАТУРА
webPage +="
! Влажность: "+ String(htu.readHumidity()) +"
! "; //-----------------------------------------------------ТЕМПЕРАТУРА
server.send(200, "text/html; charset=utf-8", webPage);
});
server.on("/setting", {
webPage="
! <form method="POST" action="/saveether" enctype="multipart/form-data">";
webPage +="<label for="ip">IP адрес:</label>
! ";
webPage +="<label for="gateway">gateway:</label>
! ";
webPage +="<label for="subnet">subnet:</label>
! ";
webPage +="";
webPage +="</form>
! ";
webPage +="";
server.send(200, "text/html; charset=utf-8", webPage);
});
server.on("/settingmqtt", {
webPage="
! <form method="POST" action="/savemqtt" enctype="multipart/form-data">";
webPage +="<label for="ip">IP адрес сервера MQTT:</label>
! ";
webPage +="<label for="gateway">Порт сервера MQTT:</label>
! ";
webPage +="";
webPage +="</form>
! ";
webPage +="";
server.send(200, "text/html; charset=utf-8", webPage);
});
server.on("/savemqtt", saveMqtt);
server.on("/saveether", saveEther);Serial.println("Connecting to MQTT server");
! // ---------------------------------- Настройки возврата MQTT----------------------------------------------------------------------
myMqtt.onConnected(myConnectedCb);
myMqtt.onDisconnected(myDisconnectedCb);
myMqtt.onPublished(myPublishedCb);
myMqtt.onData(SendData);Serial.println("connect mqtt...");
myMqtt.connect();! Serial.println("subscribe to topic...");
myMqtt.subscribe(TEMPOUT);
myMqtt.subscribe(TEMPEND);
myMqtt.subscribe(TIME);
! delay(10);//--------------------------------------HTTP server подключение------------------------------------------------------------------------
httpUpdater.setup(&server);
server.begin();
Serial.println("HTTP server started");! MDNS.addService("http", "tcp", 80);
Serial.printf("HTTPUpdateServer ready! Open http://%s.local/update in your browser\n", "8266");
! //-------------------------------------------------Проверка датчика температуры-----------------------------------------------------------
Serial.println("21D-F test");
if (!htu.begin()) {
Serial.println("Couldn't find sensor!");
while (1);
}
}else // ---------------------------------------------------------Режим SoftAP-------------------------------------------- { const char *ssid_ap = "ESPap"; iphost = "ESPap"; WiFi.mode(WIFI_AP); Serial.print("Configuring access point..."); /* You can remove the password parameter if you want the AP to be open. */ WiFi.softAP(ssid_ap); delay(2000); Serial.println("done"); IPAddress myIP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(myIP); server.on("/", handleRoot); server.on("/ok", handleOk); server.begin(); Serial.println("HTTP server started"); }}
//-------------------------------------------------------Основная функция----------------------------------------------------------------------
void loop() {
server.handleClient();! // Перевод модуля в режим конфигурации путем замыкания GPIO0 на массу
if((digitalRead(0) == LOW) && !conf){
EEPROM.write(96,255);
EEPROM.commit();
EEPROM.end();
conf = true;
Serial.println("Please reboot module for coniguration");
}
! //-------------------------------------------------------------------------------------------------
if(iphost != "ESPap"){
if (Serial.available()) {
delay(50);
uint8_t inn = Serial.read(); // читаем один байт
if(serialReadFlag) { // Если установлен флаг приема - действуем
if(inn == 59){ // ASCII : ";" // Находим конец передачи ";"
if(incStr.length() > 0) { // Проверяем длину сообщения и отправляем в "переработку"
AnalyseString(incStr); // В этой функции будем парсить сообщение
}
serialReadFlag = false; // Сбрасываем флаг приема
}
else { // А это нормальный прием
incStr += (char)inn; // Создаем String от Nextion
}
}
else { // А здесь отлавливается начало передачи от Nextion
if(inn == 35) { // ASCII : "#"
serialReadFlag = true; // После # начинаем чтение при следующем заходе
incStr = ""; // Но до этого очистим стринг приема
}
}
}
else{
//getStateParam(digitalRead(PIR),"motionSensor"); //Отправка данных датчика движения в топик
getStateParam(String(htu.readTemperature()),"Temperature");
getStateParam(String(htu.readHumidity()),"Humidity");
SendDataNextioin("temp_in", String(htu.readTemperature()));
SendDataNextioin("hum_in", String(htu.readHumidity()));
delay(1000);
}
}}
! //-------------------------------------------------------Метод отправки топика MQTT на сервер-----------------------------------------------------------------------------
void getStateParam(String value,String topicval){
String topic("/");
topic += CLIENT_ID;
topic += "/"+topicval;
// Публикуем
boolean result = myMqtt.publish(topic, value);
delay(1000);
}
//-------------------------------------------------------------------Nextion----------------------------------------------------------------------------------------------
void AnalyseString(String incStr) { // Отправка данных
if (incStr == "btnup") { //При смене значения температура вверх
getStateParam("1","btnup");
}
if (incStr == "btndown") { //При смене значения температура вниз
getStateParam("1","btndown");
}
if (incStr == "gettempend") { //При смене значения температура вниз
getStateParam("1","gettempend");
}
}
//-----------------------------------------------Метод формирует данные для отпраки на монитор Nextion--------------------------------------------------------------------------
//--отправка от датчика температуры--------------
void SendDataNextioin(String dev, String data)
{
if(dev=="hum_in"){
String hum = """ + data + "%"";
Serial.print(dev+".txt");
Serial.print("=");
Serial.print(hum);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
}
else if(dev=="temp_in"){
String temp_in = """ + data + "C"";
Serial.print(dev+".txt");
Serial.print("=");
Serial.print(temp_in);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
}
}
//--отправка с сервера--------------
void SendData(String& dev, String& data)
{
String per ="";
for(int i=9;i<dev.length();i++) {per/+="dev[i];}" if(per="="hum_in"){" string/hum="" "/data/"%"";/serial.print(per+".txt");/serial.print("=");
Serial.print(hum);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
}
else if(per==" time"){/time="" """;/""/"c"";/connected/to/mqtt/server");/}/void/mydisconnectedcb()/{/serial.println("disconnected./try/reconnect...");/delay(500);/mymqtt.connect();/mypublishedcb()/serial.println("published.");/--------------------------------------------Функции/настройки/wifi------------------------------------------------------------------/handleroot()/str/;/content-type"/content=""text/html;" charset="utf-8"">
<title>ESP8266 Settings</title>
";
str += "\! <form method=""POST"" action=""ok"">
WIFI Net
Password
!
</form>
!
";
server.send ( 200, "text/html", str );
}void handleOk(){
String ssid_ap;
String pass_ap;
unsigned char* buf = new unsigned char[64];String str = "";
str += "
<title>ESP8266 Settings</title>
";
str += "";EEPROM.begin(98);
ssid_ap = server.arg(0);
pass_ap = server.arg(1);if(ssid_ap != ""){
EEPROM.write(96,ssid_ap.length());
EEPROM.write(97,pass_ap.length());
ssid_ap.getBytes(buf, ssid_ap.length() + 1);
for(byte i = 0; i < ssid_ap.length(); i++)
EEPROM.write(i, buf[i]);
pass_ap.getBytes(buf, pass_ap.length() + 1);
for(byte i = 0; i < pass_ap.length(); i++)
EEPROM.write(i + 32, buf[i]);
EEPROM.commit();
EEPROM.end();str +="Configuration saved in FLASH
Changes applied after reboot!
Return to settings page
";
}
else {
str += "No WIFI Net
Return to settings page
";
}
str += "";
server.send ( 200, "text/html", str );
}
//--------------------------------------------Сохранение настроек MQTT--------------------------------------------------------------
void saveMqtt(){char ip_serv;
uint32_t port;
unsigned char* buf = new unsigned char[64];String str = "";
str += "
<title>ESP8266 Settings mqtt</title>
";
str += "";// EEPROM.begin(98);
str += "";server.send ( 200, "text/html", str );
}
//--------------------------------------------Сохранение настроек Ethernet--------------------------------------------------------------
void saveEther(){String ip_adr;
String subnet;
String gateway;
unsigned char* buf = new unsigned char[64];String str = "";
str += "
<title>ESP8266 Settings ethernet</title>
";
str += "";
str += "";
server.send ( 200, "text/html", str );
}
//----------------------------------------------------------------------------------------------------------------------------------</dev.length();i++)></wire.h></mqtt.h></eeprom.h></esp8266httpupdateserver.h></esp8266mdns.h></esp8266webserver.h></wificlient.h></esp8266wifi.h></nextion.h>`! Пример проекта для Nextion
! https://drive.google.com/open?id=1_Y7V- ... jgWCZdzip1
! Видео пример работы:
! https://youtu.be/fr3qQaji5Vk[/i][/i][/i][/i][/i] -
Не хватает проекта для самого nextion…
Тоже хотел заюзать такой дисплейчик, но резистивный тачскрин (ёмкостной только у 7" расширенной модели) и цена... остановился пока на старом планшете
а вот почему Вы не использовали родную библиотеку? она конечно прожорливая, но вполне надежная и удобная
-
Добавил пример проект для nextion.
Большие экраны это хорошо, но не критично :), данный экран считаю справляется со своей задачей, все комплектующие с рамкой обошлись примерно в 2000р. Если поставить блок ac-dc с 220 на 5v то его можно воткнуть вместо выключателя.
Не использовал родную библиотеку для Nextion?
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden