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

Web сервер управления реле с таймером работы

DDD81

New member
Приветствую, возникла задача отслеживать время работы реле, может кто-то сталкивался с такой задачей или подскажите в каком направлении искать.
Есть web - сервер управления реле.
Хотелось бы его усовершенствовать:
1) добавить на веб страницу таймер с отсчетом времени
2) при нажатии кнопки on таймер запускается идет отсчет
3) в любой момент можно зайти и посмотреть сколько времени работает реле
4) нажимаем кнопку off таймер 0.
5) ограничить время работы например 25 мин
Нужен ли для этого шилд времени или можно обойтись программой?


12.gif
 

nikolz

Well-known member
Приветствую, возникла задача отслеживать время работы реле, может кто-то сталкивался с такой задачей или подскажите в каком направлении искать.
Есть web - сервер управления реле.
Хотелось бы его усовершенствовать:
1) добавить на веб страницу таймер с отсчетом времени
2) при нажатии кнопки on таймер запускается идет отсчет
3) в любой момент можно зайти и посмотреть сколько времени работает реле
4) нажимаем кнопку off таймер 0.
5) ограничить время работы например 25 мин
Нужен ли для этого шилд времени или можно обойтись программой?
Посмотреть вложение 7242
можно обойтись программой.
следовательно - пишите программу.
 

DDD81

New member
Код:
// подключаем библиотеку «ESP8266WiFi»:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ESP8266HTTPClient.h>

// вписываем здесь SSID и пароль для вашей WiFi-сети:
const char* ssid = "";
const char* password = "";
IPAddress ip(192,168,0,64);  //статический IP
IPAddress gateway(192,168,0,1);
IPAddress subnet(255,255,255,0);
IPAddress ip_dns1(8, 8, 8, 8);
IPAddress ip_dns2(8, 8, 4, 4);
// задаем контакт и начальное состояние для реле:
String relay1State = "Off";
int relay = 4;
char linebuf[80];
int charcount=0;

WiFiServer server(80);
ESP8266WiFiMulti WiFiMulti;
// блок setup() запускается только один раз – при загрузке:
void setup() {
  // инициализируем последовательный порт (для отладочных целей):
  Serial.begin(115200);
  delay(10);
  pinMode(relay, OUTPUT);
  digitalWrite(relay, LOW);                             // Инициализация реле
                       
   // подключаемся к WiFi-сети:
  Serial.println();
  Serial.print("Connecting to "); // "Подключаемся к "
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.config(ip,gateway,subnet,ip_dns1, ip_dns2);
  WiFi.begin(ssid, password); 

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected"); // "Подключение к WiFi выполнено"
  // запускаем веб-сервер:
  server.begin();
  Serial.println("Web server running. Waiting for the ESP IP...");
              // "Веб-сервер запущен. Ожидание IP-адреса ESP..."
       
  delay(10000);
  // печатаем IP-адрес ESP:
  Serial.println(WiFi.localIP());
 
// Здесь настройки ВАШЕГО WIFI
   while (WiFi.status() != WL_CONNECTED) {
    delay(500);
     Serial.print(".");}
     Serial.println(WiFi.localIP());
      // выводим мощность принимаемого сигнала:
  long rssi = WiFi.RSSI();
  Serial.print("RSSI:");
  Serial.println(rssi);
 
}
// Показываем веб-страницу с кнопкой «вкл/выкл» для реле:
void dashboardPage(WiFiClient &client) {
  client.println("<!DOCTYPE HTML><html><head>");
  client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head><body>");                                                          
  client.println("<h1>ESP 8266-WH-662 - <a href=\"/\">Refresh</a></h1>");
 
  // таймер
  client.println("</h3>Timer: </h3>");
// значение таймера
 
  // генерируем кнопку для управления реле:
  client.println("<h3>Relay: " + relay1State + "</h3>");
  // если реле выключено, показываем кнопку «вкл»:        
  if(relay1State == "Off"){
    client.println("<a href=\"/relay1on\"><button>ON</button></a>");
  }
  // если реле включено, показываем кнопку «выкл»:
  else if(relay1State == "On"){
    client.println("<a href=\"/relay1off\"><button>OFF</button></a>");                                                                  
  }
  client.println("</body></html>");
}
void loop()
{
// запускаем таймер

if(relay1State == "On"){                                           // для проверки
   Serial.print("TIMER Start");
   } else {
    Serial.print("TIMER OFF");

                                                              
  }



 
WiFiClient client = server.available();                // Получаем данные, посылаемые клиентом
 
if (client){
   Serial.println("new client");  //  "новый клиент"
    memset(linebuf,0,sizeof(linebuf));
    charcount=0;
    // HTTP-запрос заканчивается пустой строкой:
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
       char c = client.read();
     // считываем HTTP-запрос, символ за символом:
        linebuf[charcount]=c;
        if (charcount<sizeof(linebuf)-1) charcount++;
        // если вы дошли до конца строки (т.е. если получили
        // символ новой строки), это значит,
        // что HTTP-запрос завершен, и вы можете отправить ответ:
        if (c == '\n' && currentLineIsBlank) {
          dashboardPage(client);
          break;
        }
        if (c == '\n') {
          if (strstr(linebuf,"GET /relay1off") > 0){
            digitalWrite(relay, LOW);
            relay1State = "Off";
          }
          else if (strstr(linebuf,"GET /relay1on") > 0){
            digitalWrite(relay, HIGH);
            relay1State = "On";
          }
          // если получили символ новой строки...
          currentLineIsBlank = true;
          memset(linebuf,0,sizeof(linebuf));
          charcount=0;        
        }
        else if (c != '\r') {
          // если получили какой-то другой символ...
          currentLineIsBlank = false;
        }
      }
    }
    // даем веб-браузеру время на получение данных:
    delay(1);
    // закрываем соединение:
    client.stop();
    Serial.println("client disonnected");  //  "Клиент отключен"
}}
Взял за основу вот такой веб сервер. Посмотрел различные варианты библиотек с таймером.
Смотрел примеры с секундомером и прочими led дисплеями.
Не понимаю в каком направлении дальше копать?
Какую библиотеку или команду использовать оптимально для задания отсчета
времени при нажатии кнопки ON?
 

Вложения

  • 70.5 KB Просмотры: 35

view24

Member
Приветствую, возникла задача отслеживать время работы реле, может кто-то сталкивался с такой задачей или подскажите в каком направлении искать.
Есть web - сервер управления реле.
Хотелось бы его усовершенствовать:
1) добавить на веб страницу таймер с отсчетом времени
2) при нажатии кнопки on таймер запускается идет отсчет
3) в любой момент можно зайти и посмотреть сколько времени работает реле
4) нажимаем кнопку off таймер 0.
5) ограничить время работы например 25 мин
Нужен ли для этого шилд времени или можно обойтись программой?


Посмотреть вложение 7242
 

view24

Member
Таймер (реле) должен быть виден и управляться из интернета? Или только из локальной сети?
 

view24

Member
Приветствую, возникла задача отслеживать время работы реле, может кто-то сталкивался с такой задачей или подскажите в каком направлении искать.
Есть web - сервер управления реле.
Хотелось бы его усовершенствовать:
1) добавить на веб страницу таймер с отсчетом времени
2) при нажатии кнопки on таймер запускается идет отсчет
3) в любой момент можно зайти и посмотреть сколько времени работает реле
4) нажимаем кнопку off таймер 0.
5) ограничить время работы например 25 мин
Нужен ли для этого шилд времени или можно обойтись программой?


Посмотреть вложение 7242
 

view24

Member
Вот Вы пишите - Хотелось бы его (web server) усовершенствовать...
Но мне непонятно, что он делает. Напишите, ибо попытка загрузить скетч окончилась ошибкой компиляции.
 

DDD81

New member
Вот Вы пишите - Хотелось бы его (web server) усовершенствовать...
Но мне непонятно, что он делает. Напишите, ибо попытка загрузить скетч окончилась ошибкой компиляции.
Скетч работает, во всяком случае у меня грузится.
В начале темы вложение, там скрин работы.
Достаточно работы по сети.
Еще раз напомню суть "хотелки", интересует время работы реле.
 

DDD81

New member
примерно так:
включили реле : запомнили значение millis(); > ms= millis();
выключили реле: вычислили прошедший интервал > ms= millis()- ms;[/code]
[/QUOTE]
Спасибо за подсказку.
Получилось так. Обратил внимание, что показывает время работы и время остановки. Поэтому поставил еще
одну перемененную ms1.
Видимо не до конца разобрался, где-то наврал, так как время расходится с реальной работой.
Может значение переменной нужно обнулять?
В идеале хотелось привести время к часам и минутам, тем путем идем?

Код:
// подключаем библиотеку «ESP8266WiFi»:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ESP8266HTTPClient.h>
// вписываем здесь SSID и пароль для вашей WiFi-сети:
const char* ssid = "**";
const char* password = "**";
IPAddress ip(192,168,0,64);  //статический IP
IPAddress gateway(192,168,0,1);
IPAddress subnet(255,255,255,0);
IPAddress ip_dns1(8, 8, 8, 8);
IPAddress ip_dns2(8, 8, 4, 4);
// задаем контакт и начальное состояние для реле:
String relay1State = "Off";
int relay = 4;
char linebuf[80];
int charcount=0;
unsigned long ms;
unsigned long ms1;
WiFiServer server(80);
ESP8266WiFiMulti WiFiMulti;
// блок setup() запускается только один раз – при загрузке:
void setup() {
  // инициализируем последовательный порт (для отладочных целей):
  Serial.begin(115200);
  delay(10);
  pinMode(relay, OUTPUT);
  digitalWrite(relay, LOW);                             // Инициализация реле
                      
   // подключаемся к WiFi-сети:
  Serial.println();
  Serial.print("Connecting to "); // "Подключаемся к "
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.config(ip,gateway,subnet,ip_dns1, ip_dns2);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected"); // "Подключение к WiFi выполнено"
  // запускаем веб-сервер:
  server.begin();
  Serial.println("Web server running. Waiting for the ESP IP...");
              // "Веб-сервер запущен. Ожидание IP-адреса ESP..."
      
  delay(10000);
  // печатаем IP-адрес ESP:
  Serial.println(WiFi.localIP());
// Здесь настройки ВАШЕГО WIFI
   while (WiFi.status() != WL_CONNECTED) {
    delay(500);
     Serial.print(".");}
     Serial.println(WiFi.localIP());
      // выводим мощность принимаемого сигнала:
  long rssi = WiFi.RSSI();
  Serial.print("RSSI:");
  Serial.println(rssi);
}
// Показываем веб-страницу с кнопкой «вкл/выкл» для реле:
void dashboardPage(WiFiClient &client) {
  client.println("<!DOCTYPE HTML><html><head>");
  client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head><body>");                                                         
  client.println("<h1>ESP 8266-WH-662 - <a href=\"/\">Refresh</a></h1>");


  // таймер
  client.println("</h3>Timer ON: </h3>");
   client.println (ms1);
// значение таймера
  // генерируем кнопку для управления реле:
  client.println("<h3>Relay: " + relay1State + "</h3>");
  // если реле выключено, показываем кнопку «вкл»:       
  if(relay1State == "Off"){
    client.println("<a href=\"/relay1on\"><button>ON</button></a>");
  }
  // если реле включено, показываем кнопку «выкл»:
  else if(relay1State == "On"){
    client.println("<a href=\"/relay1off\"><button>OFF</button></a>");                                                                 
  }
  client.println("</body></html>");
}
void loop()
{
if(relay1State == "On"){millis() ;                         // для проверки on
   ms= millis();
   Serial.print(".");
   Serial.print (ms);
      } else {
    Serial.print("TIMER OFF");
      }
if(relay1State == "Off"){millis() ;                         // для проверки off
   ms1= millis()- ms;
   Serial.print("TIMER OFF");
         } else {
    Serial.print("TIMER On");
                                                            
  }
WiFiClient client = server.available();                // Получаем данные, посылаемые клиентом
if (client){
   Serial.println("new client");  //  "новый клиент"
    memset(linebuf,0,sizeof(linebuf));
    charcount=0;
    // HTTP-запрос заканчивается пустой строкой:
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
       char c = client.read();
     // считываем HTTP-запрос, символ за символом:
        linebuf[charcount]=c;
        if (charcount<sizeof(linebuf)-1) charcount++;
        // если вы дошли до конца строки (т.е. если получили
        // символ новой строки), это значит,
        // что HTTP-запрос завершен, и вы можете отправить ответ:
        if (c == '\n' && currentLineIsBlank) {
          dashboardPage(client);
          break;
        }
        if (c == '\n') {
          if (strstr(linebuf,"GET /relay1off") > 0){
            digitalWrite(relay, LOW);
            relay1State = "Off";
          }
          else if (strstr(linebuf,"GET /relay1on") > 0){
            digitalWrite(relay, HIGH);
            relay1State = "On";
          }
          // если получили символ новой строки...
          currentLineIsBlank = true;
          memset(linebuf,0,sizeof(linebuf));
          charcount=0;       
        }
        else if (c != '\r') {
          // если получили какой-то другой символ...
          currentLineIsBlank = false;
        }
      }
    }
    // даем веб-браузеру время на получение данных:
    delay(1);
    // закрываем соединение:
    client.stop();
    Serial.println("client disonnected");  //  "Клиент отключен"
}}
 
Сверху Снизу