ESP8266WiFi me está matando...

Hola a todos:

He llegado a la conclusión que el mundo Arduino es un absoluto caos. He tardado pero ya sé que si hoy compilas un .ino, es muy probable que mañana ya no puedas. Las innumerables librerías para los mismos temas y las constantes actualizaciones destrozan a cualquier principiante o por lo menos a mí, así que, cuando compilo un programa incluyo una meticulosa descripción de qué librerías he usado, qué versión y en qué carpeta las almaceno.

No obstante, hasta llegar aquí, me he dejado algún diente en el camino. Se trata de que tengo varios ejemplos y un par de programillas basado en la librería ESP8266WiFi que, en algún momento la conseguí, en otro momento la debí borrar y ahora no consigo encontrar esta librería.

He probado con no menos de media docena de librerías para ESP8266 (ninguna con el nombre específico ESP8266WiFi) pero todas dan numerosos errores.

Por favor, ¿alguien tiene esta librería y/o el enlace?

Gracias y saludos,

Plantealo a la inversa. Qué estabas haciendo? Publica tu código.
Todo es sumamente dinámico. Todo se actualiza permanentemente, pero no al extremo de que las cosas desaparezcan.

Ahora no hiciste lo mas simple: Google ESP8266WIFI, acabo de hacerlo y las 3 primeras respuestas son de github, no comprendo tu consulta?

esp8266wifi library la primera
ESP8266WIFI la segunda y asi continúa.

Ademas tu IDE dispone de un gestor de librerías. Si pones ESP8266Wifi debería descargarla.
Mi IDE 1.6.11 tiene una incorporada.

Hola surbyte:

He dejado que mi hijo se “pegue” con el ESP8266 y no he contestado antes porque quería poner un ejemplo claro de mis desgracias con la enorme cantidad de diferentes librerías para una misma cosa. Ha de agradecerse el enorme esfuerzo de cientos de colaboradores en la creación desinteresada de librerías, así como los miles de colaboradores que, como tú, están siempre ahí, tanto para resolver dudas como para enseñar y poner ejemplos, sin embargo, existe un gran descontrol en el tema ejemplos.

Llevo toda la noche intentando hacer funcionar un DHT22. Al igual que con el ESP8266, hay múltiples ejemplos pero todos (o casi) no indican la librería utilizada, así pues, he cargado y borrado unas cuantas librerías, ninguna de ellas me permitían compilar 2 ó 3 ejemplos, al final, he optado por una pero que no tiene el formato de librería de Arduino-IDE (o sea, le falta el archivo “library.properties” y la carpeta “src”) pero que me ha funcionado poniendo los ficheros dht.h y dht.c en la misma carpeta del programa. Esto solo es práctico en el caso de una librería simple como la DHT pero prácticamente imposible con las librerías complejas.

Como ya dije en mi anterior mensaje, además de guardar las librerías utilizadas en una carpeta anexa al programa, en éste último documento meticulosamente los datos de cada una de las librerías, su nombre, el enlace y, siempre que es posible, el autor.

Por cierto, hasta ahora no se me ha ocurrido publicar código alguno porque mis problemas son de puro principiante y mis códigos son penosos. Actualmente estoy metido en el diseño de un Termostato Programable que está muy avanzado.

En fin, otra vez gracias por tu constante colaboración. De momento creo que ya estoy superando la etapa de principiante.

Estas en un punto en el que descrees de todo pero el punto pasa si no me equivoco por lo siguiente:

Las cosas deben probarse por separado siempre.
DHT22 todos los códigos funcionan.
Tomas una librería y usas SUS EJEMPLOS no otros ejemplos.

Pruebas tu sensor con la librería. TIENE QUE FUNCIONAR si o si. Si no lo hace, lo tienes mal conectado o no funciona.

Idem con el ESP8266.

Lo siento, surbyte, no hay manera, las librerías y aplicaciones del ESP8266 simplemente no funciona ni una. He seguido tu consejo de empezar probando en los ejemplos y es que ni siquiera los ejemplos funcionan. Los lamentos similares a los míos, por miles.

Solo quiero sincronizar la hora de un reloj con un servidor NTP, mediante un ESP8266 (01) y un Arduino. Hay cientos de ejemplos en Google y GitHub y ni uno funciona, todos, sin excepción, presentan los ya típicos y tópicos problemas con las innumerables librerías ESP8266, o no es la adecuada o, cuando lo parece pues falta un include queue.h o un simple include functional, sin extensión, en fin, un desastre.

Por favor, ¿alguien tiene algún simple ejemplo con las librerías pertinentes y que compile sin errores?

Nunca pensé que pasar de los robustos PICs a Arduino fuera tan traumático. Empiezo a considerar el tirar la toalla ... nunca me había pasado nada igual.

Y te preguntaste si tu ESP funciona?

Si no consigo compilar, "malamente" podré probar mis 3 ESP8266.

Lee tus privados por favor!!

Otra vez a vueltas con el ESP8266-01.
Llevo varias horas buscando un ejemplo simple para sincronizar un Arduino con un servidor NTP mediante el ESP8266-01. Inicialmente, lo único que pretendo es hacer funcionar un Arduino+ESP8266, más adelante ya me pelearé con el código.

Varios ejemplos sacados de las propias librerías de GitHub provoca varios errores fatales, siendo el más común:

fatal error: functional: No such file or directory

#include <functional>

                    ^

compilation terminated.

Después de unas cuantas horas más se me ha ocurrido compilar utilizando como tarjeta “Generic ESP8266 Module” y, salvo algún “Warning”, en general, todos los ejemplos se compilan hasta el final.

Y aquí empiezan mis dudas:

¿Quiere decir que todos los ejemplos (6 ó 7) que tengo son para modificar el firmware del ESP8266?.

Si lo anterior es correcto, yo, si no es indispensable, no quiero modificar el firmware del ESP8266, lo único que quiero es programar el Arduino.

¿Alguien puede ayudarme?, ¿alguien tiene un ejemplo simple funcional para Arduino+ESP8266 y NTP?.

Gracias por vuestra paciencia y atención,

ArduMyth:
El error que muestras en el último mensaje es de directorio. Por tanto es revisar si la tienes (y si además esta en la ruta correcta).
No entiendo la queja por mucha frustración que tengas. El compilador sólo hace que debe. El error es del usuario.

Incluso un novato como yo sabe interpretar que debe de haber un fichero llamado "functional", es más, lo hay, sin necesidad de buscarlo ya que el compilador lo encuentra cuando sustituyo cualquier tarjeta "Arduino" por la tarjeta "Generic ESP8266 Module", ergo, mi conclusión provisional es la que pongo en mi mensaje anterior y sobre la que pido confirmación.

Y decir que un lenguaje es un caos... La programación es pura lógica. No veo mayor orden. El problema es quien escribe el código no el código.

Yo no me he quejado de que el lenguaje de Arduino sea un caos, lo que si considero un caos es la cantidad de librerías para cada cosa, sin que, al parecer, exista control alguno, sin que los ejemplos se documenten apropiadamente, la sensación que tengo es que se escriben para gente "experta" y yo no lo soy. Tampoco culpo a nadie, los foros Arduino son libres y gratuito pero también lo son los dos últimos ejemplos de foros que he puesto. También me quejo del caótico forum, en Español y en Inglés, empezando porque es muy complicado encontrar información, ejemplos de foros casi perfectos (e igual a otros muchos foros) es: http://www.protonbasic.co.uk/forum.php
Sonsivri - Index o
Форум KAZUS.RU - Технический форум разработчиков электроники. Por último, en el foro Español de Arduino las respuestas que he recibido han sido muy semejantes a la tuya, aleccionándome sin ni siquiera haber leído lo que pregunto, por muy tonta y torpe que sea mi pregunta.

Los ejemplos los tienes en internet y bastantes... Pero si ninguna librería parece funcionarte vas a estar en lo mismo ¿No?

En efecto, no menos de media docena he probado, en ninguno he conseguido desentrañar si son específicos para ESP8266, aunque lo sospecho, como ya he dicho al inicio, o sea, si me obligan a modificar el firmware o no y como, estoy bastante liado con Arduino y no me encuentro en condiciones de entrar en los entresijos del ESP8266, pregunto:

¿Alguien tiene un ejemplo simple funcional para Arduino+ESP8266 y NTP? y añado, si es que esa combinación es posible sin tocar el ESP8266.

Muchas gracias por vuestro tiempo y atención y disculpas si parezco un pelmazo pero es la primera vez en décadas que me siento totalmente frustrado y a punto de tirar la toalla.

He cargado el ejemplo de esta libreria en un NodeMCU y funciona perfectamente.
Con los esp8266 (que ya no uso) he tenido dificultades y tuve que cargarles firm nuevo para que funcionasen con el IDE Arduino.
Ya solo uso NodeMCU por comodidad y tener el usb integrado.

Todavia no has postado ni un solo sketch de los que no te funcionan ni un enlace a ninguna libreria de las que estas usando,que es la unica manera que alguien lo pueda probar y decirte si el error es tuyo o no.Por cierto,supongo que es un error al escribirlo,pero si haces un include de una libreria ,deberia ser #include<functional.h>

Hasta ahora, no he puesto sketch alguno porque mi código funcionante es bastante penoso, funciona y, por el momento, eso es lo que busco. Ya llegará el momento de hacerlo eficiente.
Ahora pretendo utilizar un ESP8266 para obtener fecha y hora de un servidor NTP. Pongo un sketch modelo (de entre media docena) que en mi modestísima opinión, es para ser grabado en un ESP8266 (que yo quiero evitar, si es posible) aunque la única pista que tengo de que no sirve para mi propósito es el resultado que hay al final.

Ejemplo sin modificar de https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi

NTPClient.ino

/*

 Udp NTP Client

 Get the time from a Network Time Protocol (NTP) time server
 Demonstrates use of UDP sendPacket and ReceivePacket
 For more on NTP time servers and the messages needed to communicate with them,
 see http://en.wikipedia.org/wiki/Network_Time_Protocol

 created 4 Sep 2010
 by Michael Margolis
 modified 9 Apr 2012
 by Tom Igoe
 updated for the ESP8266 12 Apr 2015 
 by Ivan Grokhotkov

 This code is in the public domain.

 */

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

char ssid[] = "*************";  //  your network SSID (name)
char pass[] = "********";       // your network password


unsigned int localPort = 2390;      // local port to listen for UDP packets

/* Don't hardwire the IP address or we won't get the benefits of the pool.
 *  Lookup the IP address for the host name instead */
//IPAddress timeServer(129, 6, 15, 28); // time.nist.gov NTP server
IPAddress timeServerIP; // time.nist.gov NTP server address
const char* ntpServerName = "time.nist.gov";

const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message

byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

// A UDP instance to let us send and receive packets over UDP
WiFiUDP udp;

void setup()
{
  Serial.begin(115200);
  Serial.println();
  Serial.println();

  // We start by connecting to a WiFi network
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, pass);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  Serial.println("Starting UDP");
  udp.begin(localPort);
  Serial.print("Local port: ");
  Serial.println(udp.localPort());
}

void loop()
{
  //get a random server from the pool
  WiFi.hostByName(ntpServerName, timeServerIP); 

  sendNTPpacket(timeServerIP); // send an NTP packet to a time server
  // wait to see if a reply is available
  delay(1000);
  
  int cb = udp.parsePacket();
  if (!cb) {
    Serial.println("no packet yet");
  }
  else {
    Serial.print("packet received, length=");
    Serial.println(cb);
    // We've received a packet, read the data from it
    udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer

    //the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, esxtract the two words:

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord;
    Serial.print("Seconds since Jan 1 1900 = " );
    Serial.println(secsSince1900);

    // now convert NTP time into everyday time:
    Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears;
    // print Unix time:
    Serial.println(epoch);


    // print the hour, minute and second:
    Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
    Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
    Serial.print(':');
    if ( ((epoch % 3600) / 60) < 10 ) {
      // In the first 10 minutes of each hour, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
    Serial.print(':');
    if ( (epoch % 60) < 10 ) {
      // In the first 10 seconds of each minute, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.println(epoch % 60); // print the second
  }
  // wait ten seconds before asking for the time again
  delay(10000);
}

// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address)
{
  Serial.println("sending NTP packet...");
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;

  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  udp.beginPacket(address, 123); //NTP requests are to port 123
  udp.write(packetBuffer, NTP_PACKET_SIZE);
  udp.endPacket();
}

Tarjeta RESULTADO COMPILACIÓN
--------------------------------------------------
Arduino UNO Error #include
** " NANO Error #include **
Gen. ESP8266 Module OK

Gracias y saludos cordiales,

Jopapa:
He cargado el ejemplo de esta libreria en un NodeMCU y funciona perfectamente.
Con los esp8266 (que ya no uso) he tenido dificultades y tuve que cargarles firm nuevo para que funcionasen con el IDE Arduino.
Ya solo uso NodeMCU por comodidad y tener el usb integrado.

Gracias, Jopapa, pero pretendo utilizar los ESP8266 como simple puente entre un Nano y el servidor NTP. Tengo un nodeMCU con idea de utilizarlo en un proyecto más grande que el modesto termostato actual y que no estoy siendo capaz de llevar a término. Tomo nota de tu enlace.

A ver si entiendo.
Estas usando un ESP01 para que lleve la hora usando NTP y luego debe comunciarse via serie con el NANO?

Exacto y más. Tengo 3 proyectos Arduino "in mente", Termostato Programable, Centralita Calefacción, Control Automático Piscina. He empezado por el más fácil. Si consigo el Termostato el resto será coser y cantar, de hecho, los otros 2 llevan un UNO y un MEGA y ambos un GLCD DIP240B (240x180) y ambos bastante adelantados.

Ninguno de ellos necesita precisión en la fecha y hora. La sustitución de un RTC por un ESP01 me permitirá no preocuparme por fallos de red eléctrica, Day Timing Saving automático y control remoto mediante Android.

Hola, entiendo un poco tus frustraciones, creo que todos hemos pasado por ahí, y seguiremos pasando, jeje.

Como te comentan los compañeros una vez que has puesto el sketch que utilizas, supongo que ahora podrán orientarte mejor, pero te escribo porque he pasado por intentar utilizar un arduino conectado a un ESP8266 y fracasé estrepitosamente (aclaro que aunque estoy en este mundillo hace más de un año, estoy bastante verde, jaja).

Pero lo solucioné utilizando un Nodemcu, una aplicación de iOs o Android que se llama BLYNK que te permite con un sketch bastante simple programarlo con facilidad.

Lo mismo esto ya lo conocías y lo que quieres es seguir machacando en tul objetivo (lo que está muy bien, claro) o como me suele pasar, surbyte me pega un tironcito de orejas diciendo que con el Blynk no solucionas lo que persigues (aunque creo que sí).

Un saludo.

Ahora mismo estoy viendo la manera de reprogramar el ESP8266-ESP01 ya que, he llegado a la conclusión que, he de pasar por ahí para sincronizar el Arduino con un servidor NTP. Conozco BLYNK pero todavía no me he metido con él.

Por cierto, es de agradecer que gente como tú, sin lugar a dudas, muchísimo más joven que yo y, muy probablemente, muchísimo mejor preparado, confiese las enormes dificultades para avanzar en este mundillo. Al menos es un consuelo saber que no se trata de que los años me puedan, o eso quisiera creer.

Y de los tironcitos de orejas de surbyte, pues que las orejas ya me llegan a los hombros.

Muchas gracias por tu "empujón" y saludos cordiales,

Breixo:
Por cierto, es de agradecer que gente como tú, sin lugar a dudas, muchísimo más joven que yo y, muy probablemente, muchísimo mejor preparado, confiese las enormes dificultades para avanzar en este mundillo. Al menos es un consuelo saber que no se trata de que los años me puedan, o eso quisiera creer.

Pues no sabes tú la edad de quien te ha escrito, jejeje
Y de lo de mejor preparado, poco y a los tropezones...
Es lo que hay para muchos de nosotros, pero por eso hay gente sólida y con voluntad de ayudar desinteresadamente.

Ya que Breixo cree que todo se debe a experiencia te voy a relatar y no es off-topic mi experiencia con el ESP01.
Ha sido hasta ahora uno de mis peores y mas frustrante experiencias.
Yo creo que cometí todo tipo de errores. Y eso conjuntamente con algún posible fallo de fábrica asociado con una resistencia en serie con el LED motivó que con cada prueba solo sintiera olor a que algo se quemaba. Los electrónicos tenemos sobredesarrollado el sentido del olfato para estas cosas y ya sabemos cuando algo esta quemandose mas de la cuenta. Claro que siempre es tarde. Di vueltas y vueltas y mas vueltas. Había comprado 3 ESP01 y ninguno funcionaba. Lei el post de Jopapa, le pregunté si había algo raro. Me respondió que no. Que no había tenido problemas. Pues yo si. Finalmente los descarté… con mucho pesar no por el precio. Si no por mi frustración. Bueno compre 5 mas. Esta vez con un programador USB to TTL directo. El anterior no hubo caso y no se si lo dañe pero tmb me cansó.
La cuestión es que recibi el nuevo y otra vez no podía programarlos peroooooooooooo respondian a los comandos AT. Concluí que algo me faltaba. Y claro, inexperiencia de nuevo. Faltaba poner a GND el pin GPIO0 si mal recuerdo. El que debe ir a tierra durante el flasheo y a 5V en el momento del arranque luego lo usas como quieres.
En dispositivos de pocos pines, éstos tienen muchas funcionalidades. Había obviado lo mas simple.
Aún a pesar de tener el programador USB to TTL no puedo programarlo si no es por un switch que tengo entre GND y el pin GPIO0 que ahora verificaré si es ese.

s-l500.jpg

En resúmen. Todo esto llevó meses. Porque cuando algo no sale, lo dejo lo vuelvo a atacar en otro momento para tener lucidez y no repetir errores sistemáticos.
Entonces… sigue el consejo de Jopapa que fue el que yo instintivamente también seguí. Deje el ESP01 y trabajé con ESP12. Mejoré con mi conocimiento de ESP8266 y luego retomé con los nuevos ESP01. Sucedió que se dieron una serie de fallos como los ya enumerados.

Falla de hard :ESP01 malo, hubo una partida donde el fabricante equivocó la R led de 400R a 4R y eso al momento de ponerlo en marcha supongo que quemó todo… lo dejó ahi porque no soy forense electrónico.
Falla de procedimiento de flasheo. Tal vez hasta quemé el USB to TTL inicial.

Ya ves que no es fácil usar el ESP01 pero esa fue mi experiencia y resalto a muchos que lo han usado sin problemas.

Espero te sirva mi comentario y renueves tu FE… en el hermoso ESP01 que cuando le encuentras la vuelta (y la tiene) es una belleza.
Ya hasta lo uso con ADC pq lo tiene pero me sacó canas verdes soldar el pin para usarlo.
De hecho lo uso con 4 GPIOs 1ADC que es mas que los 2 GPIOs que vienen por defecto.