Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Русский
  3. аппаратные средства
  4. Железо
  5. Панель управления на ESP8266 и Nextion

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.3k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    775

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.0k

Панель управления на ESP8266 и Nextion

Geplant Angeheftet Gesperrt Verschoben Железо
3 Beiträge 2 Kommentatoren 3.9k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • F Offline
    F Offline
    fred17
    schrieb am zuletzt editiert von
    #1

    Решил сделать панель управления умным домом на 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="&quot;text/html;" charset="utf-8&quot;">

    <title>ESP8266 Settings</title>

    ";
    str += "\

    ! <form method="&quot;POST&quot;" action="&quot;ok&quot;">
    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]

    1 Antwort Letzte Antwort
    0
    • P Offline
      P Offline
      Pooh
      schrieb am zuletzt editiert von
      #2

      Не хватает проекта для самого nextion…

      Тоже хотел заюзать такой дисплейчик, но резистивный тачскрин (ёмкостной только у 7" расширенной модели) и цена... остановился пока на старом планшете

      а вот почему Вы не использовали родную библиотеку? она конечно прожорливая, но вполне надежная и удобная

      https://play.google.com/store/apps/details?id=com.roy.royclub - код: UMI201155
      https://play.google.com/store/apps/details?id=com.blockchainvault - код приглашения: Freepooh
      https://play.google.com/store/apps/details?id=games.bee.app - код приглашения: freepooh
      https://www.timestope.com/freepooh - witness code: freepooh

      1 Antwort Letzte Antwort
      0
      • F Offline
        F Offline
        fred17
        schrieb am zuletzt editiert von
        #3

        Добавил пример проект для nextion.

        Большие экраны это хорошо, но не критично :), данный экран считаю справляется со своей задачей, все комплектующие с рамкой обошлись примерно в 2000р. Если поставить блок ac-dc с 220 на 5v то его можно воткнуть вместо выключателя.

        Не использовал родную библиотеку для Nextion?

        1 Antwort Letzte Antwort
        0
        Antworten
        • In einem neuen Thema antworten
        Anmelden zum Antworten
        • Älteste zuerst
        • Neuste zuerst
        • Meiste Stimmen


        Support us

        ioBroker
        Community Adapters
        Donate

        880

        Online

        32.6k

        Benutzer

        82.0k

        Themen

        1.3m

        Beiträge
        Community
        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
        ioBroker Community 2014-2025
        logo
        • Anmelden

        • Du hast noch kein Konto? Registrieren

        • Anmelden oder registrieren, um zu suchen
        • Erster Beitrag
          Letzter Beitrag
        0
        • Home
        • Aktuell
        • Tags
        • Ungelesen 0
        • Kategorien
        • Unreplied
        • Beliebt
        • GitHub
        • Docu
        • Hilfe