Notificar estado conexión a través de un LED con ESP8266

Buenas a todos.

Estaba haciendo unas pruebas en casa con ESP8266. Quiero montar una especie de servidor WiFi en casa que simplemente hará de "traductor" WiFi -> Serial: Yo emitiré una trama que el servidor recibirá y reproducirá tal cual en un bus 485. En otras palabras, va a ser una especie de conversor de medios.

Hasta ahí todo bien, no hace falta profundizar en eso.

Mi pregunta es más sencilla. ¿Cómo puedo indicar mediante un LED que todo está correcto? Es decir, que hay red detectada, que el servidor está a la espera de una conexión, etc. Digamos un AND lógico de todas las condiciones necesarias para el funcionamiento.

No quiero distinguir entre más de dos estados, sólo saber si puedo conectar un cliente al socket o no.

Actualmente he implementado el siguiente código:

#include <ESP8266WiFi.h>

#define PORT 5000
//Pin 2: GPIO2
#define PIN_LED 2
//Definir en función de tamaño límite de las tramas
#define DATA_LENGTH 20

const char* ssid = "*********";
const char* password = "*********";
const IPAddress ip(192,168,1,112);
const IPAddress gateway(192,168,1,1);
const IPAddress subnet(255,255,255,0);

// Crea una instancia del servidor
// especificando el puerto a la escucha
WiFiServer server(PORT);

void setup() {
  pinMode(PIN_LED,OUTPUT);
  digitalWrite(PIN_LED,LOW);

  Serial.begin(115200);
  
  delay(1500);
  
  // Conecta a la red WiFi
  WiFi.config(ip, gateway, subnet);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED){
    delay(10);
  }
  
  // Lanza el servidor
  server.begin();

  // El servidor está ahora conectado
  digitalWrite(PIN_LED,HIGH);

  Serial.println("Sale de setup");
}

void loop() {
  // Comprueba si se ha conectado un cliente
  WiFiClient client = server.available();
  if (!client) {
    //Serial.println("Entra en el return!");
    return;
  }

  //Enciende el LED si está conectado a la red. ESTE ES EL BLOQUE EN CUESTIÓN
  if(WiFi.status() == WL_CONNECTED){
    digitalWrite(PIN_LED, HIGH);
  }
  else{
    digitalWrite(PIN_LED, LOW);
  }

  Serial.println("Esperando cliente");
  
  // Espera a que el cliente envíe información
  while(!client.available()){
    delay(1);
    Serial.println("Bucle");
  }
  
  // Lee la primera línea del request
  char client_data[DATA_LENGTH];
  memset(client_data,0,DATA_LENGTH);
  client.readBytesUntil('\r',client_data,DATA_LENGTH);
  client.flush();
  
  // Responde al request
  client.print(client_data);
  delay(1);

  Serial.print("Escribe: ");
  Serial.println(client_data);
  
  client.flush();

  delay(1);

  // El cliente se desconectará cuando vuelva de
  // la función y el objeto "cliente" se destruirá
}

Pero el LED una vez conecta tras el setup no vuelve a apagarse si desconecto el router, por ejemplo. O por lo menos no da la sensación... (Ahora voy a probar a meter un Serial.print y os digo).

Mi duda es si conocéis la forma correcta de implementar el funcionamiento del LED que especifico.

Muchas gracias de antemano!

Empieza con esto

#include <SPI.h>
#include <ESP8266WiFi.h>

#define PORT 5000
//Pin 2: GPIO2
#define PIN_LED 2
//Definir en función de tamaño límite de las tramas
#define DATA_LENGTH 20

const char* ssid = "*********";
const char* password = "*********";
int keyIndex = 0;                                        // your network key Index number
int status = WL_IDLE_STATUS;                     // the Wifi radio's status

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    // don't continue:
    while (true);
  }

  // attempt to connect to Wifi network:
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WEP network, SSID: ");
    Serial.println(ssid);
   
    // Conecta a la red WiFi
    WiFi.config(ip, gateway, subnet);
    status = WiFi.begin(ssid, password, key);

    // wait 10 seconds for connection:
    delay(10000);
  }

  // once you are connected :
  Serial.print("You're connected to the network");
}

void loop() {
  // check the network status connection once every 10 seconds:
  delay(10000);
 Serial.println(WiFi.status());
}

Tal vez tenga algun error porque adapte rapidamente un ejemplo con tus datos.
El tema es que demoran 10 segundos para ver cambios. Presta atención a eso.

Moderador: No repitas lo que se lee arriba

10 segundos? Es demasiado tiempo. No es un sistema crítico pero aún así me parece excesivo... Ahora mismo ando con el móvil, mañana le echaré un vistazo a ver si soluciona el problema y te comento.

No se, es lo que dice el demo. Analiza mejor el tema a ver si puedes ver cambios antes.

EDITO: ahora recuerdo un simple truco que use y me funcionó perfectamente.
Simplemente hacia un ping y según la respuesta informaba. Eso era muy rápido.

surbyte:
No se, es lo que dice el demo. Analiza mejor el tema a ver si puedes ver cambios antes.

EDITO: ahora recuerdo un simple truco que use y me funcionó perfectamente.
Simplemente hacia un ping y según la respuesta informaba. Eso era muy rápido.

Solucionado, no ha sido necesario hacer ping al final.

No había caído en la cuenta del return que había antes. La gran mayoría de los casos el dispositivo está cayendo en ese return al no haber nada preparado, con lo cual se sale de la función loop() y vuelve a entrar en ella. Pero vuelve a caer en el return con lo cual nunca llega al código de después.

La única forma de llegar al resto del código es que haya algo de información del cliente disponible. Y para ello es seguro que tiene que haber red (al menos justo en ese momento). Es por ello que el LED no llega a apagarse ni cuando pasa el return.

Vamos, que el LED no se está apagando EN NINGÚN MOMENTO (ni siquiera algunos imperceptibles microsegundos).

Era esa tontería nada más. Pongo el código corregido para aquellos a quienes les pueda servir (¡larga vida al open source!):

#include <ESP8266WiFi.h>

#define PORT 5000
//Pin 2: GPIO2
#define PIN_LED 2
//Definir en función de tamaño límite de las tramas
#define DATA_LENGTH 20

const char* ssid = "*********";
const char* password = "*********";
const IPAddress ip(192,168,1,112);
const IPAddress gateway(192,168,1,1);
const IPAddress subnet(255,255,255,0);

// Crea una instancia del servidor
// especificando el puerto a la escucha
WiFiServer server(PORT);

void setup() {
  pinMode(PIN_LED,OUTPUT);
  digitalWrite(PIN_LED,LOW);

  Serial.begin(115200);
  
  delay(1500);
  
  // Conecta a la red WiFi
  WiFi.config(ip, gateway, subnet);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED){
    delay(10);
  }
  
  // Lanza el servidor
  server.begin();

  // El servidor está ahora conectado
  digitalWrite(PIN_LED,HIGH);

  Serial.println("Sale de setup");
}

void loop() {

  //Enciende el LED si está conectado a la red. ESTE ES EL BLOQUE EN CUESTIÓN
  if(WiFi.status() == WL_CONNECTED){
    digitalWrite(PIN_LED, HIGH);
  }
  else{
    digitalWrite(PIN_LED, LOW);
  }

  // Comprueba si se ha conectado un cliente
  WiFiClient client = server.available();
  if (!client) {
    //Serial.println("Entra en el return!");
    return;
  }

  Serial.println("Esperando cliente");
  
  // Espera a que el cliente envíe información
  while(!client.available()){
    delay(1);
    Serial.println("Bucle");
  }
  
  // Lee la primera línea del request
  char client_data[DATA_LENGTH];
  memset(client_data,0,DATA_LENGTH);
  client.readBytesUntil('\r',client_data,DATA_LENGTH);
  client.flush();
  
  // Responde al request
  client.print(client_data);
  delay(1);

  Serial.print("Escribe: ");
  Serial.println(client_data);
  
  client.flush();

  delay(1);

  // El cliente se desconectará cuando vuelva de
  // la función y el objeto "cliente" se destruirá
}

Mi única pregunta ya es si esa condición que yo analizo (es decir, WiFi.status() == WL_CONNECTED) se corresponde con lo que yo espero indicar con el LED, que es que todo esté perfectamente disponible para poder enviar una trama con un cliente a ese socket sin problema alguno. Básicamente saber si es una buena condición o es engañosa...