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
Tags:
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 ArdufarmBot2, ele 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
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por