3 вход (вкл/выкл/выкл с задержкой) для управления 1device с использованием ESP8266 в качестве веб-сервера

Я хочу управлять одним устройством тремя способами : включать / выключать / выключать с задержкой. Для этого я использую веб-сервер ESP8266 + приложение для телефона Android. Проблема в том, что выключить с задержкой не получится. Он работает с delay (), но я не хочу использовать delay (), так как он останавливает другие функции. Я был бы вам очень признателен, если бы вы мне помогли. вот мой код :

#include <ESP8266WiFi.h>       
const int device1 = 14;
unsigned long previousMillis = 0;
const long interval = 5000;
const char* ssid     = "****";         
const char* password = "****";     
#include <Arduino.h>
WiFiServer server(80);
String data = "";

void setup() {
 pinMode(device1, OUTPUT);
Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
WiFi.begin(ssid, password);
IPAddress ip(*,*,*,*);   
IPAddress gateway(*,*,*,*);   
IPAddress subnet(*,*,*,*);   
WiFi.config(ip, gateway, subnet);
 while (WiFi.status() != WL_CONNECTED) {
   delay(500);
   Serial.print(".");
 }
 Serial.println("");
 Serial.println("WiFi connected");
 
 server.begin();

 Serial.println(WiFi.localIP());
 }

void loop() {
    unsigned long currentMillis = millis();

  WiFiClient client = server.available();
 if (!client) {
   return;
 }
 
 while(!client.available()){
 }
 
 String req = client.readStringUntil('\r');
 client.flush();
 if (req.indexOf("/on") != -1)
   { digitalWrite(device1, HIGH);}
 if (req.indexOf("/off") != -1)
   { digitalWrite(device1, LOW);}

 if (req.indexOf("/delay") != -1)
 {
  unsigned long currentMillis = millis();
  unsigned long previousMillis = millis();
if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

   
    digitalWrite(device1, LOW);

}
}

, 👍0

Обсуждение

выделите декодирование команды и результирующее действие .... прием /on " должен установить флаг ... прием сигналов "выкл." и " задержка должен снять флаг и установить время выключения ... управление устройством осуществляется после завершения операторов "if", @jsotola


1 ответ


0

У вас есть различные логические проблемы:

Вы блокируете, пока в WiFiClient не будут доступны байты. Все останавливается. Поэтому, если вы отправите команду "/задержка", она получит и проанализирует эту команду, включит устройство, а затем снова заблокирует на неопределенный срок, пока вы не отправите другую команду. Как только вы отправите другую команду, она проверит интервал ОДИН РАЗ, а затем снова закроется. Вам нужно переписать цикл, чтобы проверить байты, прочитать их, если они найдены, и выполнить другую работу (например, проверить свой временной интервал), если байты недоступны.

Далее, ваш код времени-это беспорядок. Вы только когда-либо устанавливали текущие и предыдущие миллиметры одновременно, поэтому они никогда не будут отличаться. И вы всегда проверяете время только один раз, когда впервые обнаруживаете команду "/задержка".

Вместо этого переработайте свою логику. Установите значение previousMillis только при первом обнаружении команды задержки, а затем сравните значение previousMillis только с текущим значением, если значение previousMillis не равно 0:

if (req.indexOf("/delay") != -1)
{
    previousMillis = millis();
}

if (previousMillis != 0 && millis() - previousMillis >= interval) {
    digitalWrite(device1, LOW);
    previousMillis = 0;
}

(Также обратите внимание, что вы объявляли вторую независимую переменную previousMillis внутри вашего оператора if, которая существует только внутри фигурных скобок для этого оператора if. Не делай этого. Используйте существующую глобальную переменную, которую вы определили, как я показываю в своем отредактированном коде.)

,

Хорошая мысль. Исправлено., @Duncan C

это не работает. я в замешательстве.не мог бы кто-нибудь написать весь скетч правильно для меня, пожалуйста, @hamidreza hosseine