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?