Cliente - Servidor / comando preso no loop não consigo resolver com Esp 01

   Pessoal por favor quem tiver uma dica peço que me ajude só falta resolver isso para o projeto ser finalizado.

   Consigo enviar um comando para o meu servidor usando protoco http , aperto o botão me conecto ao servidor enviando o comando de ligar um led por exemplo aperto novamente enviar para desligar , até ai tudo bem , o que eu queria era enviar o comando e sair do loop ou desconectar do do servidor para que o cliente2 (meu app) pudesse também enviar comandos para o mesmo endereço , como estou preso no loop fica dando conflito e o meu app não consegue ligar ou desligar o led por exemplo do servidor , funciona perfeitamente com o meu app mas tenho que colocar uma opção de botão para que também seja desligado sem precisar do app.

   Sei que tem projetos usando o MQTT com essas soluções já prontas , mas só que meu projeto é em http.

   Já tentei interrupção também mas não deu certo.

Segue o código do cliente, bem simples queria apenas uma outra solução para apertar o botão enviar o comando quando soltasse o botão desconectasse do servidor , o problema maior que não consigo desconectar do servidor e por isso da conflito com o cliente2 ao tentar enviar comando no mesmo endereço.

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#define D2 2

bool Botao();

const char* ssid = "D-Link_DIR-615";
const char* password = "******";

HTTPClient http;

void rptaSrv(int httpCode){     
if(httpCode == 200) {
String payload = http.getString();
Serial.println(payload);
} else {
Serial.print("[HTTP] GET... failed, no connection or no HTTP server\n");
}
http.end();
}

void setup() {
pinMode(D2,INPUT_PULLUP);
Serial.begin(115200);
delay(10);
Serial.print("Conectando a ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

Serial.println("WiFi conectada");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

void loop(){

if(Botao()) {

http.begin("192.168.0.99", 80, "/led1on=1"); //HTTP
int httpCode1 = http.GET();
rptaSrv(httpCode1);
} else {
http.begin("192.168.0.99", 80, "/led1off=0"); //HTTP
int httpCode1 = http.GET();
rptaSrv(httpCode1);
}
}

bool Botao() {
#define tempoDebounce 50 //(tempo para eliminar o efeito Bounce EM MILISEGUNDOS)

bool estadoBotao;
static bool estadoBotaoAnt;
static bool estadoRet = true;
static unsigned long delayBotao = 0;

if ( (millis() - delayBotao) > tempoDebounce ) {
estadoBotao = digitalRead(D2);
if ( estadoBotao && (estadoBotao != estadoBotaoAnt) ) {
estadoRet = !estadoRet;
delayBotao = millis();
}
estadoBotaoAnt = estadoBotao;
}

return estadoRet;
}

 

Exibições: 178

Responder esta

Respostas a este tópico

Ola Vinicios,

o problema é que seu código sempre executara o 'else' quando não estiver apertado.

é recomendado utilizar uma biblioteca que trate isto melhor, como esta, ou analisa-la e desenvolver a sua.

Oi Ricardo entendi sua dica , é um problema até mais ou menos "simples" mas vou testar , obg , se mais alguém tiver alguma outra solução agradeço.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço