Boa tarde, estou apanhando bastante para usar o delay em uma parte do meu código, quero acionar um led por 5 segundos ao apertar um botão do webserver, mas não estou conseguindo ,só falta isso para eu poder usar a plaquinha no meu alimentador de peixes.

A ideia da pagina é bem simples acionar em horario definidos no código através do botão "auto", e acionar de forma manual em  intervalo definido através do botão "ligar", por apenas alguns segundos ou minutos o meu arraçoador. Para estes casos normalmente eu sempre uso delay, mas o esp não reconhece o tempo neste trecho do código em especifico

linha 223 pastebin (original)

else if (req.indexOf(F("rele_on")) != -1) {
status_gpio = 1;
stateRelay = true; // liga led

}

minha ideia seria fazer  do jeito abaixo, mas quando aperto o botão com este código ele faz duas coisas, ou trava a pagina por alguns segundos (superior ao tempo esperado e pisca o led uma vez, ou entra em WDT e trava a placa, 

else if (req.indexOf(F("rele_on")) != -1) {
          status_gpio = 1;// coloca  botão da pagina em ON
          stateRelay = true; // liga led

         delay (5000); // aguarda 5 segundos

         status_gpio = 0; // retorna botão da pagina para  OFF

         stateRelay = False; // desliga led

}

abaixo um print da pagina se eu deixo o botão Ligar sem o delay não tem problema algum

abaixo o código completo

https://pastebin.com/JmRY1a64

Exibições: 101

Responder esta

Respostas a este tópico

consegui resolver o problema do delay de forma alternativa, aparentemente segundo o Ivan Grokhotkov o esp não possui uma ordem de execução dos delays igual os atmegas isso acaba gerando conflito nas ações, caso ocorra algum conflito o esp aciona o WDT.

Usando uma dica do Marcelo Rovai no blog dele sobre o ArdufarmBot2ele utilizou o a biblioteca simpleTimer, custei um pouco entender o funcionamento, mas no meu caso onde eu queria realizar uma espera deveria acionar o seguinte comando.

 timer.setTimeout(5000L, void_qualquer_sem_os_parentenses);

ex:

void manual() {
stateRelay = true;
status_gpio = 1;
if (stateRelay == true) {
stateRelay = false;
status_gpio = 0;
}
}

Void XXX(){

  } else if (req.indexOf(F("rele_on")) != -1) {

     timer.setTimeout((5000L), manual); // aciona depois de 5 segundos
  }

}

assim resolvi o problema

 

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2017   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço