Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Русский
    3. аппаратные средства
    4. Железо
    5. Панель управления на ESP8266 и Nextion

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

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

    This topic has been deleted. Only users with topic management privileges can see it.
    • F
      fred17 last edited by

      Решил сделать панель управления умным домом на 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 Reply Last reply Reply Quote 0
      • P
        Pooh last edited by

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

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

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

        1 Reply Last reply Reply Quote 0
        • F
          fred17 last edited by

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

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

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

          1 Reply Last reply Reply Quote 0
          • First post
            Last post

          Support us

          ioBroker
          Community Adapters
          Donate

          858
          Online

          31.9k
          Users

          80.1k
          Topics

          1.3m
          Posts

          2
          3
          3735
          Loading More Posts
          • Oldest to Newest
          • Newest to Oldest
          • Most Votes
          Reply
          • Reply as topic
          Log in to reply
          Community
          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
          The ioBroker Community 2014-2023
          logo