Модуль Wi-Fi

Блок управления вентиляционной (воздушной) заслонкой ЗУ тип - 04 с WiFi интерфейсом, для ручного и автоматического управления

 

Данный блок изменяет положения шторки в зависимости от команд полученных по сети WiFi. Для управления заслонкой может быть использован

любой броузер или специализированная программа. В основе блока управления лежит WiFi модуль esp8266. Данный блок управления

поставляется полностью готовым к работе, но допускается перепрограммирование модудя esp8266. Схема блока управления приведена на рис.1.

Демо программа выполнеа в среде разработки Arduino IDE.

 

Питание блока управления заслонкой осуществляется  от источника постоянного тока 12 Вольт.

Ток потребления во время работы привода менее 100 mA.

Ток потребления в режиме обмена информацией менее 300 мА.

Ток потребления в режиме ожидания неболее 60 mA.

В качестве источника питания может быть использован либой стабилизированный блок питания.

 

 

Рис.1. Принципиальная схема

Принципиальная схема вентиляционной заслонки с модулем WiFi (esp8266)

 

Управление

 

При первом включении блок управления подстраивается под привод заслонки. Если разъем Х1 подключен через переходник

к компьютеру, то в любой терминальной программе можно видеть отладочный текст. Скорость обмена 115200 бод.

 

The adjustment of the actuator

 

Determination of the minimum sensor damper

Umin = 151

 

Determination of the maximum sensor damper

Umax = 866

Umin = 151

Step = 102

Configuring access point...done

AP IP address: 192.168.4.1

HTTP server started

 

После завершения настройки привода создается откытая WiFi сеть с именем ESPap.

Подключившись к этой сети необходимо открыть страницу с адресом http://192.168.4.1

(Щелкните по ссылке или введите адрес вручную)

 

Ввод адреса заслонки

 

Введите имя и пароль своей сети. В поле Host введите имя настраиваемого блока управления, например dempfer_1.

В дальнейшем при обращении к блоку управления можно будет использовать это имя вместо IP адреса.

Сохраните настройки. Страница изменится (см. рисунок ниже).

 

Подключение вентиляционной заслонки к WiFi

 

 

Нажмите кнопку RESTART или кратковременно отключите блок управления от питания.  одключите свою WiFi  

В терминальной программе можно видеть отладочный текст.

 

The actuator is configured

Umin = 154

Step = 102

 

SSID: WirelessNet   Password: 19611961

Host: dempfer_1

WiFi started is fail...............

 

 Подключите свою WiFi  сеть

 

The actuator is configured

Umin = 154

Step = 102

 

SSID: WirelessNet   Password: 19611961

Host: dempfer_1

AP IP address: 192.168.100.8

HTTP server ok! Open http://dempfer_1.local in your browser

TCP server started

the position of the damper: 7

 

Чтобы открыть страницу воспользуйтесь IP адресом или используйте имя хоста, добавив к нему имя псевдо домена local

http://dempfer_1.local (Щелкните по ссылке или введите адрес вручную)

 

Страница управления положением заслонки.

 

Управление заслонкой через интернет

 

Щелчок по соответствующей кнопке устанавливает заслонку в выбранное положение. После завершения работы достигнутое положение

отображается на странице синей подсветкой.

 

 

Кнопка НАСТРОЙКА позволяет изменить настройки сети и привода.

Ниже приведен текст программы для Arduino IDE:

 

#include <dummy.h>

#include <Esp.h>.

/*

 *  Это демонстрационная программа управления вентиляционной заслонкой по сети WiFi.

 *  на основе модуля ESP8266

 */

 

#include <ESP8266WiFi.h>

#include <ESP8266mDNS.h>

#include <WiFiClient.h>

#include <ESP8266WebServer.h>

#include <EEPROM.h>

 

String str = "";

boolean conf = false;

 

const int analogInPin = A0;

 

int i;

int val = 1;

int sensorValue;

int sensorValue_min = 0;

int sensorValue_max = 2000;

int State_Driv;

int Step_Driv = 100;

byte value;

byte stat;

 

const char* host = "esp8266";

 

String ssid_ap;

String pass_ap;

String host_ap;

bool   PowerOn  = false;

 

String html_header_0 = "<html>\

     <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\

     <head>\

       <title>ESP8266 Settings</title>\

       <style>\

 .      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\

       </style>\

       </head>";

String html_header_1 = "<html>\

            <head>\

              <meta charset=\"utf-8\" />\

              <title>Управление заслонкой</title>\

              <style>\

               .b1{ background: navy; color: white; font-size: 9pt;}\ 

              </style>\

            </head>";      

// Create an instance of the server

// specify the port to listen on as an argument

 

ESP8266WebServer server(80);

 

/* Откройте страницу http://192.168.4.1 в вашем броузере

 * соединение в режиме тока доступа.

 */

 

void handleRoot() {

  String str = "";

  str += html_header_0;

  str += "<body>\

            <form method=\"POST\" action=\"ok\">\

              <input name=\"ssid\"> WIFI Net</br>\

              <input name=\"pswd\"> Password</br></br>\

              <input name=\"host\"> Host</br></br>\

              <input type=SUBMIT value=\"Save settings\">\

            </form>\

         </body>\

         </html>";

  server.send ( 200, "text/html", str );

  Serial.println("Page 2: handleRoot");

}

 

void ssid_write_EEPROM(){

    unsigned char* buf = new unsigned char[64];

    EEPROM.begin(200);

    EEPROM.write(161,ssid_ap.length());

    EEPROM.write(162,pass_ap.length());

    EEPROM.write(163,host_ap.length());

    ssid_ap.getBytes(buf, ssid_ap.length() + 1);

    for(i = 0; i < ssid_ap.length(); i++)

    EEPROM.write(i, buf[i]);

    pass_ap.getBytes(buf, pass_ap.length() + 1);

    for(i = 0; i < pass_ap.length(); i++)

    EEPROM.write(i + 32, buf[i]);

    host_ap.getBytes(buf, host_ap.length() + 1);

    for(i = 0; i < host_ap.length(); i++)

    EEPROM.write(i + 96, buf[i]);   

    value = Step_Driv; EEPROM.write(180, value);

    value = sensorValue_min; EEPROM.write(190, value); 

    EEPROM.commit(); 

}

 

void handleOk(){

  String str = "";

  str += html_header_0;

  str += "<body>";

  Serial.println("Page 2: handleOk");

  ssid_ap = server.arg(0);

  pass_ap = server.arg(1);

  host_ap = server.arg(2);

 

  if(server.args() == 1){

    str = server.arg(0);

    if(str == "RESTART"){

      EEPROM.end();

      Serial.println("Page 2: RESTART");

      delay(100);

      pinMode(16, OUTPUT);    //

      digitalWrite(16, 0);

    }

  }

 

  if(ssid_ap != ""){

    ssid_write_EEPROM();

    str += "Configuration saved in FLASH</br>\Changes applied after reboot</p></br></br>\<a href=\>Return</a> to settings page</br>";

    str += "<h1> </h1>\n";

    str += "<form action='' method='GET' >";

    str += "<input type='submit' name='bsubmit' value='RESTART' />";

    str += "</form>";

  }

  else {

    str += "No WIFI Net</br>\ <a href=\>Return</a> to settings page</br>";

  }

  str += "</body></html>";

  server.send ( 200, "text/html", str );

  Serial.println("Page 2: Configuration saved in FLASH");

Exit_Sub:;

}

 

void server_send(){

 

int Slid_Value = analogRead(analogInPin);

    Slid_Value = Slid_Value - sensorValue_min / 2;

    Slid_Value = Slid_Value / Step_Driv;

String S1 = "the position of the damper: ";

       S1 += Slid_Value;

       Serial.println(S1);   

String s = html_header_1;

       s += "<body><form action='' method='GET' <input type='text' name='login'>";   

       s += "<input type='submit' name='bsubmit' value='НАСТРОЙКА' />";

       s += "<h1> </h1>\n";  

       if(Slid_Value == 0){

         s += "<input type='submit' class='b1' name='bsubmit' value='ЗАКРЫТО ПОЛНОСТЬЮ' />";

       }

       else{

         s += "<input type='submit' name='bsubmit' value='ЗАКРЫТЬ' />";

       }

       s += "<h1> </h1>\n";

       if(Slid_Value == 1){

         s += "<input type='submit' class='b1' name='bsubmit' value='ОТКРЫТО НА 10 ГРАДУСОВ' />";

       }

       else{

         s += "<input type='submit' name='bsubmit' value='10' />";

       } 

       s += "<h1> </h1>\n";   

       if(Slid_Value == 2){

         s += "<input type='submit' class='b1' name='bsubmit' value='ОТКРЫТО НА 20 ГРАДУСОВ' />";

       }

       else{

         s += "<input type='submit' name='bsubmit' value='20' />";

       }

       s += "<h1> </h1>\n";

       if(Slid_Value == 3){

         s += "<input type='submit' class='b1' name='bsubmit' value='ОТКРЫТО НА 30 ГРАДУСОВ' />";

       }

       else{

         s += "<input type='submit' name='bsubmit' value='30' />";

       } 

       s += "<h1> </h1>\n";

       if(Slid_Value == 4){

         s += "<input type='submit' class='b1' name='bsubmit' value='ОТКРЫТО НА 40 ГРАДУСОВ' />";

       }

       else{

         s += "<input type='submit' name='bsubmit' value='40' />";

       }

       s += "<h1> </h1>\n";

       if(Slid_Value == 5){

         s += "<input type='submit' class='b1' name='bsubmit' value='ОТКРЫТО НА 50 ГРАДУСОВ' />";

       }

       else{

         s += "<input type='submit' name='bsubmit' value='50' />";

       }

       s += "<h1> </h1>\n";

       if(Slid_Value == 6){

         s += "<input type='submit' class='b1' name='bsubmit' value='ОТКРЫТО НА 60 ГРАДУСОВ' />";

       }

       else{

         s += "<input type='submit' name='bsubmit' value='60' />";

       }   

       s += "<h1> </h1>\n";                          

       if(Slid_Value > 6){

         s += "<input type='submit' class='b1' name='bsubmit' value='ОТКРЫТО ПОЛНОСТЬЮ' />";

       }

       else{

         s += "<input type='submit' name='bsubmit' value='ОТКРЫТЬ' />";

       }

       s += "</form></body></html>\n";

 

   server.send ( 200, "text/html", s ); 

}

 

 

void Move_Slid(int limit_){

  String S1;

  int val_m;

  int State_Driv;

  int Slid_Value = analogRead(analogInPin);

  S1 = "Move_Slid: The current value - ";

  S1 += Slid_Value;

  Serial.println(S1); 

  limit_ = Step_Driv * limit_ + sensorValue_min;

  S1 = "Move_Slid: The calculated value - ";

  S1 += limit_;

  Serial.println(S1);

    if(Slid_Value > limit_){

      val_m = Slid_Value - limit_;

      if(val_m < 10){ goto Exit_Sub; }

      Serial.println("Closing");

      digitalWrite(12, 0);

      digitalWrite(14, 1); delay(250);

Move_0:  

      Slid_Value = analogRead(analogInPin);

      if(Slid_Value > limit_){

        val_m = Slid_Value - limit_;

        if(val_m < 10){ goto Exit_Sub; }     

      }

      else{

        goto Exit_Sub;  

      }

      delay(30);

      State_Driv = digitalRead(13);

      if(State_Driv == 0){ goto Move_0; }      

    }

    else{

      val_m = limit_ - Slid_Value;

      if(val_m < 10){ goto Exit_Sub; }

      Serial.println("Opening");

      digitalWrite(12, 1); digitalWrite(14, 0); delay(250);

Move_1:  

      Slid_Value = analogRead(analogInPin);

      if(Slid_Value < limit_){

        val_m = limit_ - Slid_Value;

        if(val_m < 10){ goto Exit_Sub; }     

      }

      else{

        goto Exit_Sub;  

      }     

      delay(30);

      State_Driv = digitalRead(13);

      if(State_Driv == 0){ goto Move_1; }      

    }

Exit_Sub:

    digitalWrite(12, 1); digitalWrite(14, 1); delay(200);

    S1 = "Move_Slid: The achieved value - ";

    S1 += Slid_Value;

    Serial.println(S1);

    digitalWrite(12, 0); digitalWrite(14, 0);  

}

 

void acturator_set(){

adj_:

    Serial.println("The adjustment of the actuator");  // Настройка привода

    Serial.println();

    Serial.println("Determination of the minimum sensor damper");

    digitalWrite(12, 0); digitalWrite(14, 1); delay(300);

Set_0:  

    delay(1);

    State_Driv = digitalRead(13);

    if(State_Driv == 0){ goto Set_0; }

    sensorValue_min = analogRead(analogInPin);

    str = "Umin = ";

    str += sensorValue_min;

    Serial.println(str);

    Serial.println();

    Serial.println("Determination of the maximum sensor damper");

    digitalWrite(12, 1); digitalWrite(14, 0); delay(300);

Set_1:  

    delay(1);

    State_Driv = digitalRead(13);

    if(State_Driv == 0){ goto Set_1; }

    sensorValue_max = analogRead(analogInPin);

    str = "Umax = ";

    str += sensorValue_max;

    Serial.println(str);

    if(sensorValue_max < sensorValue_min){

      Serial.println("Error of the actuator");

      while(1);

    }

    val = sensorValue_max - sensorValue_min;

    Step_Driv = val / 7;

    str = "Umin = ";

    str += sensorValue_min;

    Serial.println(str);

    str = "Step = ";

    str += Step_Driv;

    Serial.println(str);  

}

 

void MOVE_handleRoot() {

  String ss;

  int arguments;

  Serial.println("MOVE");

  if(server.args() == 1){ ss = server.arg(0); }

  if(server.args() == 4){ ss = server.arg(3); }

  Serial.println();

  if(ss == "НАСТРОЙКА"){

    ss = html_header_1;

    ss += "<body><form action='' method='GET' <input type='text' name='login'>";   

    ss += "<input type='submit' name='bsubmit' value='НАСТРОИТЬ ПРИВОД' />";

    ss += "<h1> </h1>\n";

    ss += "<input type='submit' name='bsubmit' value='НАСТРОИТЬ СЕТЬ' />";

    ss += "<h1> </h1>\n";   

    ss += "<input type='submit' name='bsubmit' value='НАЗАД' />"; 

    ss += "</form></body></html>\n";

    server.send ( 200, "text/html", ss );        

    goto Exit_Sub;

  }

  if(ss == "НАСТРОИТЬ ПРИВОД"){

    acturator_set(); // Настройка привода  

  }

  if(ss == "НАСТРОИТЬ СЕТЬ"){

    ss = "";

    ss += html_header_1;

    ss += "<body><form action='' method='GET' <input type='text' name='login'>\

             <input name=\"host\"> Host Net</br>\   

             <input name=\"ssid\"> WIFI Net</br>\

             <input name=\"pswd\"> Password</br></br>\

             <input type='submit' name='bsubmit' value='ПРИМЕНИТЬ' />\

             <input type='submit' name='bsubmit' value='НАЗАД' />\

             </form>\

           </body>\

         </html>";

     server.send ( 200, "text/html", ss );

     Serial.println("Page 2: Network setup");

     goto Exit_Sub;

  }

  if(ss == "ПРИМЕНИТЬ"){

     Serial.println("Page 2: New network settings");

     host_ap = server.arg(0);

     ssid_ap = server.arg(1);

     pass_ap = server.arg(2);   

     Serial.println(ssid_ap);

     Serial.println(pass_ap);

     Serial.println(host_ap);

     ssid_write_EEPROM();

     pinMode(16, OUTPUT);    // Рестарт

     digitalWrite(16, 0);

  } 

  if(ss == "ЗАКРЫТЬ"){   

    digitalWrite(12, 0); digitalWrite(14, 1); delay(300);   

Next_0:  

    State_Driv = digitalRead(13);

    if(State_Driv == 0){ goto Next_0; }

    digitalWrite(12, 1); digitalWrite(14, 1); delay(200);

    digitalWrite(12, 0); digitalWrite(14, 0); 

    Serial.println("CLOSED");

  }

  if(ss == "ОТКРЫТЬ"){ 

    digitalWrite(12, 1); digitalWrite(14, 0); delay(300); 

Next_1: delay(30);

    State_Driv = digitalRead(13);

    if(State_Driv == 0){ goto Next_1; }

    digitalWrite(12, 1); digitalWrite(14, 1); delay(200);

    digitalWrite(12, 0); digitalWrite(14, 0);

    Serial.println("OPEN FULL");

  }

  if (ss == "10"){ Move_Slid(1); Serial.println("OPEN 10"); } 

  if (ss == "20"){ Move_Slid(2); Serial.println("OPEN 20"); }   

  if (ss == "30"){ Move_Slid(3); Serial.println("OPEN 30"); }

  if (ss == "40"){ Move_Slid(4); Serial.println("OPEN 40"); }

  if (ss == "50"){ Move_Slid(5); Serial.println("OPEN 50"); }

  if (ss == "60"){ Move_Slid(6); Serial.println("OPEN 60"); }  

      

  sensorValue = analogRead(analogInPin);

  Serial.println(sensorValue); 

  server_send();  

Exit_Sub:;

}

 

void onNotFound_send(){

  Serial.println("onNotFound_send");

  server_send();

}

 

void setup() {

  // Настройка последовательного порта

  byte len_ssid, len_pass, len_host;

  Serial.begin(115200);

  Serial.println();

  delay(10);

 

  // Установка выводов контроллера

  pinMode(16, INPUT);     //

  pinMode(4, OUTPUT);     // Управление питанием моторредуктора                         

  pinMode(12, OUTPUT);    // Управление направлением движения

  pinMode(14, OUTPUT);

  pinMode(13, INPUT);     // Датчик тока

  pinMode(10, INPUT);     // Настройка привода

 

  val = digitalRead(10);

  Serial.println(); Serial.println();

  if(val == 0){  

adj_: acturator_set(); // Настройка привода

 

 // Режим SoftAP

    const char *ssid_ap = "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");  

    handleRoot();

    do{

      server.handleClient();

    }while(1);

  }

  else{

    EEPROM.begin(200);

    Serial.println("The actuator is configured"); 

    value = EEPROM.read(180); Step_Driv = value;

    value = EEPROM.read(190); sensorValue_min = value;

    str = "Umin = ";

    str += sensorValue_min;

    Serial.println(str);

    str = "Step = ";

    str += Step_Driv;

    Serial.println(str);   

    // Connect to WiFi network

    Serial.println();

    len_ssid = EEPROM.read(161);

    len_pass = EEPROM.read(162);

    len_host = EEPROM.read(163);

    if(len_pass > 64) len_pass = 0;

    pinMode(0, INPUT_PULLUP);

    if((len_ssid < 33) && (len_ssid != 0)){

      // Режим STATION

     

      unsigned char* buf_ssid = new unsigned char[32];

      unsigned char* buf_pass = new unsigned char[64];

      unsigned char* buf_host = 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';

      for(byte i = 0; i < len_host; i++) buf_host[i] = char(EEPROM.read(i + 96));

      const char *host_  = (const char*)buf_host;

      buf_host[len_host] = '\x0';     

      Serial.print("SSID: ");

      Serial.print(ssid);

      Serial.print("   ");

      Serial.print("Password: ");

      Serial.println(pass);

      if((len_host < 65) && (len_host != 0)){

        host = host_; 

      }

      Serial.print("Host: ");

      Serial.println(host);

    

      WiFi.mode(WIFI_STA);

      WiFi.begin(ssid, pass);

     

      if(WiFi.waitForConnectResult() == WL_CONNECTED){

Next_1: MDNS.begin(host, WiFi.localIP());

        server.on ( "/", HTTP_ANY, MOVE_handleRoot );

        server.onNotFound ( onNotFound_send );

        server.begin();   

        IPAddress myIP = WiFi.localIP();

        Serial.print("AP IP address: ");

        Serial.println(myIP);

        Serial.printf( "HTTP server ok! Open  http :// %s.local in your browser\n", host);

      }

      else {

        Serial.print("WiFi started is fail");

        for(i = 0; i < 20; i++){

          if((digitalRead(10) == LOW)){

             pinMode(16, OUTPUT);    // Рестарт

             digitalWrite(16, 0);

          }

          if(WiFi.status() == WL_CONNECTED){ goto Next_1; }

          Serial.print(".");

          delay(500);

        }

        pinMode(16, OUTPUT);    // Рестарт

        digitalWrite(16, 0);

      }

     

      server.begin();                     // Старт TCP (HTTP) сервера

      Serial.println("TCP server started");

     

      MDNS.addService("http", "tcp", 80);  // Подключаем сервис MDNS-SD

      server_send();

    }

    else{ // Режим SoftAP

      goto adj_;

    }   

  }

Exit_Sub:; 

}

 

 

void loop() {

  server.handleClient();

 // Перевод модуля в режим конфигурации путем замыкания GPIO10 на массу

  if((digitalRead(10) == LOW)){

    EEPROM.begin(120);

    EEPROM.write(96,255);

    EEPROM.commit();

    conf = true;

    Serial.println("Please reboot module for coniguration");

    pinMode(16, OUTPUT);    //

    digitalWrite(16, 0);

  }

}