Código en ESP-01 funciona a veces sí a veces no

Hola, tengo un sketch para el ESP8266-01 que se conecta a mi red wifi y me permite encender y apagar un relé, el problema que tengo es que a veces conecta correctamente y otras no conecta y hay que estar a apagar y encender hasta que por fín conecta... he probado con distintas tarjetas ESP-01 y ESP-01S, imagino que sea un problema del código ya que lo pongo en distintas monturas que vienen con el relé integrado, por lo que uso varios relés y varias tarjetas ESP y siempre me sucede lo mismo, el código es este:

/* 


#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <WebSocketsServer.h>
#include <Hash.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

#define USE_SERIAL Serial

//static const char ssid[] = "ESP-01"; //Quitado
//static const char password[] = "XXXXXXX"; //quitado

MDNSResponder mdns;

static void writeLED(bool);

ESP8266WiFiMulti WiFiMulti;

ESP8266WebServer server(80);
WebSocketsServer webSocket = WebSocketsServer(81);

// parametros WiFi
const char* ssid = "Reigadas";  // Aquí poner el nombre de vuestra red WIFI
const char* password = "XXXXX";  // Aquí poner la contraseña de vuestra red 

IPAddress ip(192, 168, 0, 70);  // Aquí poned la IP que queréis que tenga la tarjeta wifi ESP8266-01
IPAddress gateway(192, 168, 0, 1);  // Aquí poned la IP de vuestro router "la puerta de enlace"
IPAddress subnet(255, 255, 255, 0); // Aquí poned vuestra máscara de subred, suele ser la que ya está puesta 

static const char PROGMEM INDEX_HTML[] = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0, maximum-scale = 1.0, user-scalable=0 charset="UTF-8"">
<title>L&#225mpara Almu</title>
<style>
"body { background-color: #808080; font-family: Arial, Helvetica, Sans-Serif; Color: #000000; }"
</style>
<script>
var websock;
function start() {
  websock = new WebSocket('ws://' + window.location.hostname + ':81/');
  websock.onopen = function(evt) { console.log('websock open'); };
  websock.onclose = function(evt) { console.log('websock close'); };
  websock.onerror = function(evt) { console.log(evt); };
  websock.onmessage = function(evt) {
    console.log(evt);
    var e = document.getElementById('ledstatus');
    if (evt.data === 'ledon') {
      e.style.color = 'red';
    }
    else if (evt.data === 'ledoff') {
      e.style.color = 'black';
    }
    else {
      console.log('unknown event');
    }
  };
}
function buttonclick(e) {
  websock.send(e.id);
}
</script>
</head>
<body onload="javascript:start();">
<h1>Encender y Apagar</h1>
<div id="ledstatus"><b>L&#225mpara</b></div>
<button id="ledon"  type="button" onclick="buttonclick(this);">Encender</button> 
<button id="ledoff" type="button" onclick="buttonclick(this);">Apagar</button>
</body>
</html>
)rawliteral";

// GPIO#0 is for Adafruit ESP8266 HUZZAH board. Your board LED might be on 13.
const int LEDPIN = 0;
// Current LED status
bool LEDStatus;

// Commands sent through Web Socket
const char LEDON[] = "ledon";
const char LEDOFF[] = "ledoff";

void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length)
{
  USE_SERIAL.printf("webSocketEvent(%d, %d, ...)\r\n", num, type);
  switch (type) {
  case WStype_DISCONNECTED:
    USE_SERIAL.printf("[%u] Disconnected!\r\n", num);
    break;
  case WStype_CONNECTED:
  {
               IPAddress ip2 = webSocket.remoteIP(num);
               USE_SERIAL.printf("[%u] Connected from %d.%d.%d.%d url: %s\r\n", num, ip2[0], ip2[1], ip2[2], ip2[3], payload);
               // Send the current LED status
               if (LEDStatus) {
                 webSocket.sendTXT(num, LEDON, strlen(LEDON));
               }
               else {
                 webSocket.sendTXT(num, LEDOFF, strlen(LEDOFF));
               }
  }
    break;
  case WStype_TEXT:
    USE_SERIAL.printf("[%u] get Text: %s\r\n", num, payload);

    if (strcmp(LEDON, (const char *)payload) == 0) {
      writeLED(true);
    }
    else if (strcmp(LEDOFF, (const char *)payload) == 0) {
      writeLED(false);
    }
    else {
      USE_SERIAL.println("Unknown command");
    }
    // send data to all connected clients
    webSocket.broadcastTXT(payload, length);
    break;
  case WStype_BIN:
    USE_SERIAL.printf("[%u] get binary length: %u\r\n", num, length);
    hexdump(payload, length);

    // echo data back to browser
    webSocket.sendBIN(num, payload, length);
    break;
  default:
    USE_SERIAL.printf("Invalid WStype [%d]\r\n", type);
    break;
  }
}

void handleRoot()
{
  server.send_P(200, "text/html", INDEX_HTML);
}

void handleNotFound()
{
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i<server.args(); i++){
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}

static void writeLED(bool LEDon)
{
  LEDStatus = LEDon;
  // Note inverted logic for Adafruit HUZZAH board
  if (LEDon) {
    digitalWrite(LEDPIN, 0);
  }
  else {
    digitalWrite(LEDPIN, 1);
  }
}

void setup()
{
  pinMode(LEDPIN, OUTPUT);
  writeLED(false);

  USE_SERIAL.begin(115200);

  //Serial.setDebugOutput(true);

  USE_SERIAL.println();
  USE_SERIAL.println();
  USE_SERIAL.println();

  for (uint8_t t = 4; t > 0; t--) {
    USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\r\n", t);
    USE_SERIAL.flush();
    delay(1000);
  }

// conectarse a wifi
WiFi.mode(WIFI_STA); //puesto
WiFi.begin(ssid, password);//puesto
WiFi.config(ip, gateway, subnet);//puesto
while (WiFi.status() != WL_CONNECTED) {//puesto
delay(500);//puesto
Serial.print(".");//puesto
}//puesto
Serial.println("");//puesto
Serial.println("WiFi conectado");//puesto

//  WiFi.softAP(ssid, password); //quitado
//  IPAddress myIP = WiFi.softAPIP(); //quitado

  USE_SERIAL.print("AP IP address: ");
  USE_SERIAL.println(ip);

  USE_SERIAL.println("");
  USE_SERIAL.print("Connected to ");
  USE_SERIAL.println(ssid);
  USE_SERIAL.print("IP address: ");
  USE_SERIAL.println(WiFi.localIP());

  if (mdns.begin("luzsala3", WiFi.localIP())) {
    USE_SERIAL.println("MDNS responder started");
    mdns.addService("http", "tcp", 80);
    mdns.addService("ws", "tcp", 81);
  }
  else {
    USE_SERIAL.println("MDNS.begin failed");
  }
  USE_SERIAL.print("Connect to http://luzsala3.local or http://");
  USE_SERIAL.println(WiFi.localIP());

  server.on("/", handleRoot);
  server.onNotFound(handleNotFound);

  server.begin();

  webSocket.begin();
  webSocket.onEvent(webSocketEvent);
}

void loop()
{
  webSocket.loop();
  server.handleClient();
}

Y si funciona bien aparece esto:

Y si no conecta se queda así... "saliendo puntos .....":

El caso es que si lo configuro como AP "WiFi.softAP" en vez de cómo cliente "WiFi.mode(WIFI_STA)", me funciona siempre a la primera pero a la perfección, pero en otro rango de ip´s a la que usa mi red wifi, por lo que hay que estar a conectar a la red wifi que me crea el ESP y así poder usar el relé, prefiero que se conecte a mi wifi.

¿¿Alguien sabe porqué como AP me funciona correctamente y como cliente me funciona a veces sí y a veces no??

GRACIAS

Pero no es el mismo problema que tenias abierto en Hardware?

Porque tantas librerías?

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <WebSocketsServer.h>
#include <Hash.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

Hola de nuevo! no que va, el problema que tenía con estos dispositivos no logré solucionarlo y lo he dejado por perdido, no obstante ayer me llegó otro nuevo de china y me venía con un scketch para cargar al ESP, lo que pasa es que ese sketch está diseñado para que sea modo AP "WiFi.softAP", y lo pruebo según está y funciona muy bien, pero tengo que conectarme a la red del ESP, cuando lo que yo quiero, es que el ESP se conecte a mi red "para no tener que desconectarme de mi red wifi para conectarme a la del ESP para abrir o cerrar el relé", por lo que estoy intentando modificar el sketch que venía con el propio ESP, por lo que no te sé decír porqué hay tantas librerías...

El sketch original es este:

/* 
 1.PC connect the wifi : tunc5555   
              password :123456789
 2.Browser open: http://192.168.4.1/
  
 3.click the on or off button
  */


#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <WebSocketsServer.h>
#include <Hash.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

#define USE_SERIAL Serial

static const char ssid[] = "tunc5555";
static const char password[] = "123456789"; 

MDNSResponder mdns;

static void writeLED(bool);

ESP8266WiFiMulti WiFiMulti;

ESP8266WebServer server(80);
WebSocketsServer webSocket = WebSocketsServer(81);


static const char PROGMEM INDEX_HTML[] = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0, maximum-scale = 1.0, user-scalable=0">
<title>Lámpara Almu</title>
<style>
"body { background-color: #808080; font-family: Arial, Helvetica, Sans-Serif; Color: #000000; }"
</style>
<script>
var websock;
function start() {
  websock = new WebSocket('ws://' + window.location.hostname + ':81/');
  websock.onopen = function(evt) { console.log('websock open'); };
  websock.onclose = function(evt) { console.log('websock close'); };
  websock.onerror = function(evt) { console.log(evt); };
  websock.onmessage = function(evt) {
    console.log(evt);
    var e = document.getElementById('ledstatus');
    if (evt.data === 'ledon') {
      e.style.color = 'red';
    }
    else if (evt.data === 'ledoff') {
      e.style.color = 'black';
    }
    else {
      console.log('unknown event');
    }
  };
}
function buttonclick(e) {
  websock.send(e.id);
}
</script>
</head>
<body onload="javascript:start();">
<h1>Encender y Apagar</h1>
<div id="ledstatus"><b>Lámpara</b></div>
<button id="ledon"  type="button" onclick="buttonclick(this);">Encender</button> 
<button id="ledoff" type="button" onclick="buttonclick(this);">Apagar</button>
</body>
</html>
)rawliteral";

// GPIO#0 is for Adafruit ESP8266 HUZZAH board. Your board LED might be on 13.
const int LEDPIN = 0;
// Current LED status
bool LEDStatus;

// Commands sent through Web Socket
const char LEDON[] = "ledon";
const char LEDOFF[] = "ledoff";

void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length)
{
  USE_SERIAL.printf("webSocketEvent(%d, %d, ...)\r\n", num, type);
  switch (type) {
  case WStype_DISCONNECTED:
    USE_SERIAL.printf("[%u] Disconnected!\r\n", num);
    break;
  case WStype_CONNECTED:
  {
               IPAddress ip = webSocket.remoteIP(num);
               USE_SERIAL.printf("[%u] Connected from %d.%d.%d.%d url: %s\r\n", num, ip[0], ip[1], ip[2], ip[3], payload);
               // Send the current LED status
               if (LEDStatus) {
                 webSocket.sendTXT(num, LEDON, strlen(LEDON));
               }
               else {
                 webSocket.sendTXT(num, LEDOFF, strlen(LEDOFF));
               }
  }
    break;
  case WStype_TEXT:
    USE_SERIAL.printf("[%u] get Text: %s\r\n", num, payload);

    if (strcmp(LEDON, (const char *)payload) == 0) {
      writeLED(true);
    }
    else if (strcmp(LEDOFF, (const char *)payload) == 0) {
      writeLED(false);
    }
    else {
      USE_SERIAL.println("Unknown command");
    }
    // send data to all connected clients
    webSocket.broadcastTXT(payload, length);
    break;
  case WStype_BIN:
    USE_SERIAL.printf("[%u] get binary length: %u\r\n", num, length);
    hexdump(payload, length);

    // echo data back to browser
    webSocket.sendBIN(num, payload, length);
    break;
  default:
    USE_SERIAL.printf("Invalid WStype [%d]\r\n", type);
    break;
  }
}

void handleRoot()
{
  server.send_P(200, "text/html", INDEX_HTML);
}

void handleNotFound()
{
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i<server.args(); i++){
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}

static void writeLED(bool LEDon)
{
  LEDStatus = LEDon;
  // Note inverted logic for Adafruit HUZZAH board
  if (LEDon) {
    digitalWrite(LEDPIN, 0);
  }
  else {
    digitalWrite(LEDPIN, 1);
  }
}

void setup()
{
  pinMode(LEDPIN, OUTPUT);
  writeLED(false);

  USE_SERIAL.begin(115200);

  //Serial.setDebugOutput(true);

  USE_SERIAL.println();
  USE_SERIAL.println();
  USE_SERIAL.println();

  for (uint8_t t = 4; t > 0; t--) {
    USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\r\n", t);
    USE_SERIAL.flush();
    delay(1000);
  }


  WiFi.softAP(ssid, password); 
  IPAddress myIP = WiFi.softAPIP(); 

  USE_SERIAL.print("AP IP address: ");
  USE_SERIAL.println(myIP);

  USE_SERIAL.println("");
  USE_SERIAL.print("Connected to ");
  USE_SERIAL.println(ssid);
  USE_SERIAL.print("IP address: ");
  USE_SERIAL.println(WiFi.localIP());

  if (mdns.begin("lámparasala", WiFi.localIP())) {
    USE_SERIAL.println("MDNS responder started");
    mdns.addService("http", "tcp", 80);
    mdns.addService("ws", "tcp", 81);
  }
  else {
    USE_SERIAL.println("MDNS.begin failed");
  }
  USE_SERIAL.print("Connect to http://lámparasala.local or http://");
  USE_SERIAL.println(WiFi.localIP());

  server.on("/", handleRoot);
  server.onNotFound(handleNotFound);

  server.begin();

  webSocket.begin();
  webSocket.onEvent(webSocketEvent);
}

void loop()
{
  webSocket.loop();
  server.handleClient();
}

Pero como decía está puesto como AP, cuando yo lo quiero como cliente. Por lo que intento cambiarlo a WiFi.mode(WIFI_STA) y a veces conecta al wifi y funciona... otras no, como puse en las capturas de pantalla... mientras que como AP me funcionaba siempre.

A parte me surgen un par de dudas...cuando cargo el sketch que viene de serie, siempre me asigna la IP 192.168.4.1 al ESP, y no sé dónde está establecido eso.

También me pasa que yo suelo entrar desde el exterior con un dominio que tengo en noip.com, y ahora también puedo entrar "cuando conecta" pero los botones de encender y apagar no hacen nada de nada... mientras que si conecto desde el wifi de mi casa "cuando conecta" funciona perfectamente.

Resumiendo... son tres dudas.

1º porqué a veces conecta al wifi de mi casa con la ip que está establecida en el código y funciona a la perfección y otras no conecta nunca "como puse en las capturas de pantalla"????

2º Porqué cuando está en modo AP me asigna siempre la ip 192.168.4.1 y no veo por ningún lado del código que tenga que ser esa ip concreta???

3º Porqué los botones de encender y apagar pierden funcionalidad cuando entro a través de un dominio del exterior y cuando estoy conectado al wifi de mi casa funcionan bien??? con respecto a esta duda imagino que sea por algo de la librería ESP8266mDNS.h pero al no tenerla tratada no sé cómo solucionar que también tengan funcionalidad los botones desde el exterior a mi LAN

¿Alguna idea para esas tres dudas???

Gracias.

3º Porqué los botones de encender y apagar pierden funcionalidad cuando entro a través de un dominio del exterior y cuando estoy conectado al wifi de mi casa funcionan bien??? con respecto a esta duda imagino que sea por algo de la librería ESP8266mDNS.h pero al no tenerla tratada no sé cómo solucionar que también tengan funcionalidad los botones desde el exterior a mi LAN

Los botones no pierden funcionalidad, lo que ocurre es que tienes que hacer un port forward en tu router para que al intentar ingresar desde afuera de tu LAN tengas comunicación.

En muy fácil Luego te indico cómo!!

2º Porqué cuando está en modo AP me asigna siempre la ip 192.168.4.1 y no veo por ningún lado del código que tenga que ser esa ip concreta???

Cuando esta en modo AP o Access Point esta actuando como una WIFI autosuficiente que tienes ese dirección y claro que no muestra lo demás porque no esta programada para hacerlo.

1º porqué a veces conecta al wifi de mi casa con la ip que está establecida en el código y funciona a la perfección y otras no conecta nunca "como puse en las capturas de pantalla"????

Bueno, esto es lo que no se responder: por qué se conecta unas veces y por qué otras no.
Mi explicación es que veo demasiadas librerías que pueden estar compitiendo por los mismos recursos y conspirar negativamente en algunos circunstancias.
Lo que quieres hacer se hace de manera mas simple con menos librerías, como en el hilo anterior.

Buenos días! te respondo a lo que me respondes.

surbyte:
Los botones no pierden funcionalidad, lo que ocurre es que tienes que hacer un port forward en tu router para que al intentar ingresar desde afuera de tu LAN tengas comunicación.

En muy fácil Luego te indico cómo!!

El port forward sirve para el redireccionamiento de puertos o NAT, eso está hecho y funcionando, ya que a la WEB del ESP accedo perfectamente desde el exterior usando por ejemplo 4G desde mi teléfono móvil, por lo que el port forward está hecho de manera correcta, lo que me sucede, es que una vez cargada la web del ESP que me permite abrir o cerrar el relé, tiene dos botones "Encender y Apagar" y esos botones al pulsarles no hacen nada... no enciende ni apaga el relé. Pero cuando lo hago desde dentro de mi red wifi "LAN" con una ip de clase C "192.168.0.100" entonces sí que entro a la web del ESP y también funcionan a la perfección los botones de "Encender y Apagar" y me abre y me cierra el relé perfectamente. Por lo que deduzco que es un problema del código ya que desde casa funciona, y desde el exterior no funcionan "LOS BOTONES" el resto si.

surbyte:
Cuando esta en modo AP o Access Point esta actuando como una WIFI autosuficiente que tienes ese dirección y claro que no muestra lo demás porque no esta programada para hacerlo.

Si esto también lo tenía claro, pero si quiero tener más de un dispositivo me va a asignar la misma IP a todos,y va a crear conflicto, la duda es... ¿¿dónde puedo yo cambiar la IP que me asigna al configurarlo como AP?????

surbyte:
Bueno, esto es lo que no se responder: por qué se conecta unas veces y por qué otras no.
Mi explicación es que veo demasiadas librerías que pueden estar compitiendo por los mismos recursos y conspirar negativamente en algunos circunstancias.
Lo que quieres hacer se hace de manera mas simple con menos librerías, como en el hilo anterior.

Este código que he usado con tantas librerías venía con el ESP-01 que he comprado, y si lo dejo como AP funciona perfectamente "que es como viene de serie", el problema viene cuando lo he cambiado para conectarse a mi red wifi "WiFi_STA", por lo que creo que hay algo mal en el código una vez que lo he modificado, que hace que a veces conecte de manera correcta a mi wifi y otras nunca conecte. Creo que puede ser un fallo de alguna librería a la hora de salir a internet me cree conflicto con alguna DNS pero no estoy seguro y ando enredando en ello....

GRACIAS

Empecemos desde 0 porque me sorprende que tengas tantos problemas con los ESP.

Tu quieres hacer esto

tengo un sketch para el ESP8266-01 que se conecta a mi red wifi y me permite encender y apagar un relé, el

Y donde debe funcionar en tu RED LAN, entonces para que quieres que sea AP? o deseas arrancar como AP elegir la red que mas te guste y luego continuar con la LAN elegida?

Y entonces prender/apagar un led sea dentro o fuera de la LAN.

Que hay de todo esto cierto y que hay falso?

Hola, NO quiero que sea AP, sólo digo, que cuando viene recien comprado de la tienda viene configurado por defecto como AP y funciona muy bien... pero yo no quiero que sea AP. Por lo que lo he cambiado y ahora resulta que conecta a veces sí a veces no.

No sé si me estaré explicando correctamente.

Creo que hay algún conflicto con tanta librería y es lo que me gustaría solucionar, pero me resulta extraño que cuando estuvo configurado como AP funcionó muy bien, y ahora que está como CLIENTE conecte a veces sí, a veces no.

GRACIAS

Una vez mas postearé lo que creo es suficiente para tu caso

/*
 *  This sketch demonstrates how to set up a simple HTTP-like server.
 *  The server will set a GPIO pin depending on the request
 *    http://server_ip/gpio/0 will set the GPIO2 low,
 *    http://server_ip/gpio/1 will set the GPIO2 high
 *  server_ip is the IP address of the ESP8266 module, will be 
 *  printed to Serial when the module is connected.
 */

#include <ESP8266WiFi.h>

const char* ssid      = "ssid";
const char* password  = "password";

// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);

  // prepare GPIO2
  pinMode(2, OUTPUT);
  digitalWrite(2, 0);
  
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  
  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
  
  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();
  
  // Match the request
  int val;
  if (req.indexOf("/gpio/0") != -1)
    val = 0;
  else if (req.indexOf("/gpio/1") != -1)
    val = 1;
  else {
    Serial.println("invalid request");
    client.stop();
    return;
  }

  // Set GPIO2 according to the request
  digitalWrite(2, val);
  
  client.flush();

  // Prepare the response
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now ";
  s += (val)?"high":"low";
  s += "</html>\n";

  // Send the response to the client
  client.print(s);
  delay(1);
  Serial.println("Client disonnected");

  // The client will actually be disconnected 
  // when the function returns and 'client' object is detroyed
}

Este código tiene un led en el pin GPIO2

This sketch demonstrates how to set up a simple HTTP-like server.
The server will set a GPIO pin depending on the request
http://server_ip/gpio/0 will set the GPIO2 low,
http://server_ip/gpio/1 will set the GPIO2 high
server_ip is the IP address of the ESP8266 module, will be

http://server_ip/gpio/0 pone en LOW GPIO2
http://server_ip/gpio/1 pone en HIGH GPIO2