Модуль Wi-Fi
Блок управления вентиляционной (воздушной) заслонкой ЗУ тип - 04 с WiFi интерфейсом, для ручного и автоматического управления
Данный блок изменяет положения шторки в зависимости от команд полученных по сети WiFi. Для управления заслонкой может быть использован
любой броузер или специализированная программа. В основе блока управления лежит WiFi модуль esp8266. Данный блок управления
поставляется полностью готовым к работе, но допускается перепрограммирование модудя esp8266. Схема блока управления приведена на рис.1.
Демо программа выполнеа в среде разработки Arduino IDE.
Питание блока управления заслонкой осуществляется от источника постоянного тока 12 Вольт.
Ток потребления во время работы привода менее 100 mA.
Ток потребления в режиме обмена информацией менее 300 мА.
Ток потребления в режиме ожидания неболее 60 mA.
В качестве источника питания может быть использован либой стабилизированный блок питания.
Рис.1. Принципиальная схема
Управление
При первом включении блок управления подстраивается под привод заслонки. Если разъем Х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 адреса.
Сохраните настройки. Страница изменится (см. рисунок ниже).
Нажмите кнопку 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);
}
}