• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь ESP8266 кратковременное включение реле с WEB страницы

dimdima13

New member
Хочу сделать управление воротами. Для этого необходимо с WEB страницы нажать на кнопку открыть
кратковременно включится реле, которое своими контактами замкнет кнопку (ОТКРЫТЬ) на пускателе.
И соответственно три таких реле с управлением с WEB (ОТКРЫТЬ), (СТОП), (ЗАКРЫТЬ)

Вот приблизительный скетч только там все включения фиксируемые, подскажите что переделать
чтоб реле включалось на секунду а потом само отключалось.
Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

// GPIO, куда подключено реле
int rele1 = 12;
int rele2 = 15;
bool PowerRele1  = false;
bool PowerRele2  = false;


ESP8266WebServer server(80);
long int chipId;
const char *ssid = "Test";
//void webPage() {
//char webPage[700];
// snprintf(webPage,700,"<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/><title>Test</title></head><body><center><h1><br/>ESP8266 ID: %d<br/><br/></center></body></html>",chipId);
// server.send(200,"text/html",webPage);
//}
void setup (void) {
  delay(1000);
  Serial.begin(115200);
  chipId = ESP.getChipId();
  Serial.println();
  Serial.print("ChipId: ");
  Serial.println(chipId);
   pinMode(rele1 , OUTPUT);
  digitalWrite(rele1 , PowerRele1);
  pinMode(rele2 , OUTPUT);
  digitalWrite(rele2 , PowerRele2);
  // сервер-клиент:
  IPAddress apIP(192,168,4,1);
  WiFi.mode(WIFI_AP_STA);       // WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(apIP,apIP,IPAddress(255,255,255,0));
  WiFi.softAP(ssid);
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(apIP);
  server.on("/", HTTP_handleRoot);
  server.begin();
  Serial.println("HTTP server started");
  Serial.println();
}
void loop (void) {
  server.handleClient();
delay(1); // не обязательно, Но желательно
}
void HTTP_handleRoot(void) {
  bool statrele1 = false;
  bool statrele2 = false;

// Реле 1
  if( server.hasArg("statrele1") ){
     if( strncmp(server.arg("statrele1").c_str(),"1",1) == 0 )
     statrele1 = true;
  }
  else {
     statrele1 = PowerRele1;
  }

// Реле 2
    if( server.hasArg("statrele2") ){
     if( strncmp(server.arg("statrele2").c_str(),"1",1) == 0 )
     statrele2 = true;
  }
  else {
     statrele2 = PowerRele2;
  }
 
// Формируем ШТМЛ страницу
  String out = "";

  out =
"<html>\
  <head>\
    <meta charset=\"utf-8\" />\
    <meta name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1.0 user-scalable=no'/>\
    <title>Управление Реле</title>\
    <style>\
      body {background-color:#cccccc; color:#fbfd00; text-shadow: 0px 2px 6px rgba(0,0,0,0.4); font-family: Sans-Serif, Arial, Helvetica; }\
    </style>\
  </head>\
  <body>\
  <center>\
<br>\
<h1>ВЫ НАХОДИТЕСЬ НА ТЕРРИТОРИИ </h1>\
";

// Для реле 1
  if( statrele1 ){
      out+="\
      <p><button>Кнопка</button></p>\
   </h1> <hr border-radius=10px width=200 size=50 align=centre color=red><h2><a href=\"/?statrele1=0\">Открыть</a></h2>\
    ";
  }
  else {
      out+="\
    </h1> <hr width=100 size=30 align=left color=green><h2><a href=\"/?statrele1=1\">ON</a></h2>\
    ";           
  }

  // Для реле 2
  if( statrele2 ){
      out+="\
    <hr width=100 size=30 align=left color=red><h2><a href=\"/?statrele2=0\">OFF</a></h2>\
    ";
  }
  else {
      out+="\
    <hr width=100 size=30 align=left color=green><h2><a href=\"/?statrele2=1\">ON</a></h2>\
    ";           
  }

   // Общее
   out+= "\
  </body>\
</html>";
   server.send ( 200, "text/html", out );

     
      // Для реле 1
   if( statrele1 != PowerRele1 ){
      PowerRele1 = statrele1;
      digitalWrite(rele1 , PowerRele1);
     
   }
         // Для реле 2
    if( statrele2 != PowerRele2 ){
      PowerRele2 = statrele2;
      digitalWrite(rele2 , PowerRele2);
     
   }
  
         // Скобку оставить!
}
 

Вложения

Ivan113

New member
Хочу сделать управление воротами. Для этого необходимо с WEB страницы нажать на кнопку открыть
кратковременно включится реле, которое своими контактами замкнет кнопку (ОТКРЫТЬ) на пускателе.
И соответственно три таких реле с управлением с WEB (ОТКРЫТЬ), (СТОП), (ЗАКРЫТЬ)

Вот приблизительный скетч только там все включения фиксируемые, подскажите что переделать
чтоб реле включалось на секунду а потом само отключалось.
Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

// GPIO, куда подключено реле
int rele1 = 12;
int rele2 = 15;
bool PowerRele1  = false;
bool PowerRele2  = false;


ESP8266WebServer server(80);
long int chipId;
const char *ssid = "Test";
//void webPage() {
//char webPage[700];
// snprintf(webPage,700,"<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/><title>Test</title></head><body><center><h1><br/>ESP8266 ID: %d<br/><br/></center></body></html>",chipId);
// server.send(200,"text/html",webPage);
//}
void setup (void) {
  delay(1000);
  Serial.begin(115200);
  chipId = ESP.getChipId();
  Serial.println();
  Serial.print("ChipId: ");
  Serial.println(chipId);
   pinMode(rele1 , OUTPUT);
  digitalWrite(rele1 , PowerRele1);
  pinMode(rele2 , OUTPUT);
  digitalWrite(rele2 , PowerRele2);
  // сервер-клиент:
  IPAddress apIP(192,168,4,1);
  WiFi.mode(WIFI_AP_STA);       // WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(apIP,apIP,IPAddress(255,255,255,0));
  WiFi.softAP(ssid);
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(apIP);
  server.on("/", HTTP_handleRoot);
  server.begin();
  Serial.println("HTTP server started");
  Serial.println();
}
void loop (void) {
  server.handleClient();
delay(1); // не обязательно, Но желательно
}
void HTTP_handleRoot(void) {
  bool statrele1 = false;
  bool statrele2 = false;

// Реле 1
  if( server.hasArg("statrele1") ){
     if( strncmp(server.arg("statrele1").c_str(),"1",1) == 0 )
     statrele1 = true;
  }
  else {
     statrele1 = PowerRele1;
  }

// Реле 2
    if( server.hasArg("statrele2") ){
     if( strncmp(server.arg("statrele2").c_str(),"1",1) == 0 )
     statrele2 = true;
  }
  else {
     statrele2 = PowerRele2;
  }
 
// Формируем ШТМЛ страницу
  String out = "";

  out =
"<html>\
  <head>\
    <meta charset=\"utf-8\" />\
    <meta name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1.0 user-scalable=no'/>\
    <title>Управление Реле</title>\
    <style>\
      body {background-color:#cccccc; color:#fbfd00; text-shadow: 0px 2px 6px rgba(0,0,0,0.4); font-family: Sans-Serif, Arial, Helvetica; }\
    </style>\
  </head>\
  <body>\
  <center>\
<br>\
<h1>ВЫ НАХОДИТЕСЬ НА ТЕРРИТОРИИ </h1>\
";

// Для реле 1
  if( statrele1 ){
      out+="\
      <p><button>Кнопка</button></p>\
   </h1> <hr border-radius=10px width=200 size=50 align=centre color=red><h2><a href=\"/?statrele1=0\">Открыть</a></h2>\
    ";
  }
  else {
      out+="\
    </h1> <hr width=100 size=30 align=left color=green><h2><a href=\"/?statrele1=1\">ON</a></h2>\
    ";          
  }

  // Для реле 2
  if( statrele2 ){
      out+="\
    <hr width=100 size=30 align=left color=red><h2><a href=\"/?statrele2=0\">OFF</a></h2>\
    ";
  }
  else {
      out+="\
    <hr width=100 size=30 align=left color=green><h2><a href=\"/?statrele2=1\">ON</a></h2>\
    ";          
  }

   // Общее
   out+= "\
  </body>\
</html>";
   server.send ( 200, "text/html", out );

    
      // Для реле 1
   if( statrele1 != PowerRele1 ){
      PowerRele1 = statrele1;
      digitalWrite(rele1 , PowerRele1);
    
   }
         // Для реле 2
    if( statrele2 != PowerRele2 ){
      PowerRele2 = statrele2;
      digitalWrite(rele2 , PowerRele2);
    
   }
 
         // Скобку оставить!
}
Ну проще всего (и не совсем правильно) после включения реле сделать delay и выключить. Более правильно делать задержку по таймеру. В дурине не силён, поэтому без конкретики.
 

Сергей_Ф

Moderator
Команда форума
@dimdima13 посмотрите в сторону ticker. С его помощью отмерьте нужный интервал времени, после которого выключите реле.
 

dimdima13

New member
С delay не получается, так как со страници пришла команда на включение. и эта команда висит ( statrele1=0,statrele1=1)
 

Ivan113

New member
Ну почему же нельзя?
Код:
digitalWrite(rele1 , 1);
Delay(1000ms);
digitalWrite(rele1 , 0);
Но и имеющийся код при этом избыточный, и можно его оптимизировать
 
Сверху Снизу