No me deja compilar para ESP8266 cuando antes sí podía con ese mismo código

Hola, tengo un código para programar los ESP8266 que funciona a las mil mavarillas... me vale para encender y apagar luces de casa desde cualquier navegador que esté en la misma red wifi. El problema es que ese código le tenía hace un año guardado, y ahora quiero volver a compilarlo e instalarlo en un ESP8266-01S y no me deja compilar, decir que el IDE le borré hace tiempo y le he vuelto a instalar de nuevo, he añadido la tarjeta ESP8266 desde el link http://arduino.esp8266.com/stable/package_esp8266com_index.json y he seleccionado la placa Generic ESP8266 Module, abro el código y le doy a compilar y siempre me da errores...depende desde que ordenador lo haga me da un error u otro, pero lo he probado en dos Windows y en un MAC y nada... me da error de librerías que instalo y reinstalo y nada... el código es el siguiente:

/* 
 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[] = "ESP-01"; //Quitado
//static const char password[] = "XXXXXX"; //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 = "XXXXXX";  // 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 antes me daba un error en otros ordenadores de la librería "ESP8266WiFi.h", pero ahora me da el error la librería WebSocketsServer, por lo que pienso que quizás es un error de la nueva versión del IDE ??????

el error que me aparece ahora es el siguiente:

Alguna idea porqué no me deja compilar un código que antes compilaba a la perfección???? a alguien le deja compilarlo correctamente??? porque si es así, si es posible que me envíe su IDE por favor para poder compilar.

GRACIAS!!

No recuerdo bien en que post se discutió algo parecido, pero la solución fue ir a board manager e instalar un núcleo mas antiguo.

Si. yo lo recuerdo porque lo resolví inicialmente (con las librerías) y luego el interesado lo hizo en toda su dimención.

Tienes que ir al Board Manager y como dice PeterKanTropus buscar la versión que tienes instalada para el ESP8266 e instalara hacia atras.
Ve probando hasta que tu código vuelva a funcionar.

Hola de nuevo! ya no sé si mover este post a hardware o dejarlo por aquí.... el caso, he probado a bajar la versión de ESP8266, he ido bajando y probando y conseguí compilar, pero no subir el sketch a ningún ESP8266, he probado con un arduino y una fuente de alimentación de 3.3V externa ya que el ESP8266 consume más de 50 miliamperes en su arranque y puede dar problemas sin la fuente,también con un arduino sin su chip "le extraigo con mucho cuidado con un destornillador plano" también con un FTDI, tambié con un programador UART a USB y siempre obtengo el mismo error:

warning: espcomm_sync failed
error: espcomm_open failed
error: espcomm_upload_mem failed
error: espcomm_upload_mem failed

Veo que no comunica el ESP con el arduino, ni con el FTDI, ni con el programador de UART a USB que venden en las tiendas de internet, y siempre el mismo error.... he probado con 3 ESP8266-01 distintos que tengo, obteniendo siempre el mismo error, he mirado el pinout hasta confirmar que lo estoy conectando correctamente mil veces.... y he probado tanto desde un mac como desde un pc, seleccionando el puerto correspondiente en cada caso. Hace un año cuando les configuré por primera vez me costó mucho comunicar con el ESP y luego formatee y no guardé datos de cómo lo hice y ahora me veo en la misma situación. Pero estoy pensando que quizás es por la versión que he bajado de la placa ESP, y quizás alguno de ustedes tiene un IDE de arduino donde sepa que puede subir scketch a los ESP correctamente, quizás sería tan amable de pasármelo.

Alguien puede cargar este scketch a un ESP8266?????? :

 /* 
 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[] = "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 = "XXXXXX";  // 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();
}

GRACIAS!!!!!!!

Bueno, después de mucho buscar observo que hay un post en el que a una persona le pasa lo mismo que a mi, y dice que bajando la versión a la 2.5.0 le funciona correctamente:

Pero a mi no me aparece esa versión en la lista de versiones de la placa:

Alguien sabría decirme cómo instalar la versión 2.5.0 del ESP8266?? o que me envíe por favor el IDE con esa placa instalada!! pleaseeee!!

GRACIAS

Al final pude instalar la versión 2.5.0 pero me sigue dando problemas... Estoy retrocediendo para ir a lo más básico y también tengo problemas, estoy intentando conectar el ESP8266 a un Arduino uno y sin cargar ningún sketch entro al monitor serie y voy cambiando la velocidad en baudios a ver si consigo establecer comunicación y consigo el AT Ready tan esperado. Y nunca lo consigo, siempre me muestra signos raros, pero cuando le pongo en 115000 baudios me aparece una cuenta que pone :

Wait boot 1
Wait boot 2
Wait boot 3
Wait boot 4
.................................................

Y luego los puntos de manera ilimitada. Pensé que quizás sería un problema del boot del esp 8266 pero lo he probado con tres distintos y nada, siempre la misma cuenta hacia adelante del 1 al 4 y los puntos suspensivos infinitos....

Estoy pensando que podría ser por el sistema operativo?? Ahora tengo Windows 10 y cuando configuré los ESP8266 hace un año yo tenía windows 7 y los configuré sin problema. Será por el sistema operativo?? Alguna idea sino de qué puede ser???

Gracias

No le heches la culpa a todo porque no la tiene.

Las librerías se actualizan, los core de ESP8266 tambien.
No es solo el core, sino tambien volver a librerías anteriores.

Lo mejor es que reescribas tu código adecuandolo a como funciona ahora. No puede ser tan complicado.
Usas las mismas librerías de antes version nueva con el core nuevo.
Empieza con un ejemplo y lo vas adaptando al tuyo.
Y sale funcionando.
Para la proxima, anota versiones de todo y dejalo en tu sketch para recordarlo. Guarda copia de seguridad.