Go Down

Topic: Cliente - Servidor / comando preso no loop não consigo resolver com Esp 01 (Read 257 times) previous topic - next topic

Vinicius1



 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;
}

mtnviewguy

Acho que você já deve ter resolvido o problema. Caso não tenha, uma solução simplista seria mover o código que connecta ao servidor para dentro do loop principal, dentro do "if (botao())", e executar o código que desconecta do servidor (que vc não colou na mensagem) dentro do "else" (do mesmo "if"). Acrescente um delay para nao ficar chamando a rotina de desconexão com muita frequencia...

o ES-01 é sensacional. Estou brincando com eles fazem uns 10 dias e não resisti: comprei o ES-12E, que tem bem mais I/O disponíveis pra usar.

abraços,

ruy

Vinicius1

    Obrigado pelo retorno amigo mas é justamente o codigo de desconectar do servidor assim que o botão for solto é que não tenho fica preso no loop enviando o comando de ligar quando apertado 1x e quando apertado novamente de desligar , isso está tudo ok , o que eu queria era enviar esses comandos só naquele momento e logo em seguida até com algum delay se for o caso ele desconectar do servidor para não da conflito com o  cliente(2) que é o meu app.

    Em resumo envia o comando de ligar e depois de algum delay desconecta do servidor e vice versa.

   A logica de desconecta que não consigo mesmo usando o http.end();

tecdiego

Tenta esse código aqui:
Code: [Select]

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

boolean estadoLed = false;
boolean lerBotao = true;
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(){

  while(digitalRead(D2)== true){
    
    if (lerBotao == true){
      
      if(estadoLed ==true){
         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);
      }
      http.end();
      estadoLed = !estadoLed;
      lerBotao = false;
    }
    
  }

  lerBotao = true;

}



Go Up