Problema con codigo sketch

Hola muy buenas a todos, llevo unos meses realizando mi proyecto final, y vi la idea en un canal de Youtube de un smartwatch.
Cuando lo intento replicar el código, me sale los siguientes errores, y no se solucionarlo solo, me gustaría que si alguien me puede decir que esta mal del código, ya que yo no lo veo.
Muchas gracias a todos, y lo siento soy un poco novel aun.

#include <ESP8266WiFi.h>
#include <WifiUDP.h>
#include <String.h>
#include <Wire.h>
#include <SSD1306.h>
#include <SSD1306Wire.h>
#include <NTPClient.h>
#include <Time.h>
#include <TimeLib.h>
#include <Timezone.h>

#define BLYNK_PRINT Serial
#include <BlynkSimpleEsp8266.h>

const int DataDisplayButton = 14;
int RelayButtonPin1 = 12;
int RelayButtonPin2 = 13;

int Relay1Pin = 2; //Pin de rele en el otro ESP8266
int Relay2Pin = 0; //Pin de rele en el otro ESP8266

String RlSt = String(Relay1State, HEX);

int Relay1ButtonState;             // Lectura actual del pin de entrada
int Relay2ButtonState;             // Lectura actual del pin de entrada

int lastButtonState1 = LOW;   // Lectura anterior del pin de entrada
int lastButtonState2 = LOW;   // Lectura anterior del pin de entrada

//las siguientes variables son largas sin signo porque el tiempo, medido en
// milisegundos, se convertirá rápidamente en un número mayor que el que se puede almacenar en un int.

unsigned long lastDebounceTime1 = 0;  // la última vez que se cambió el pin de salida
unsigned long lastDebounceTime2 = 0;  // la última vez que se cambió el pin de salida

unsigned long debounceDelay1 = 50;  // el tiempo de rebote; aumentar si la salida parpadea
unsigned long debounceDelay2 = 50;  // el tiempo de rebote; aumentar si la salida parpadea

char auth[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXX"; //Ingresar autentificación
// Define NTP properties
#define NTP_OFFSET   60 * 60      // En segundo
#define NTP_INTERVAL 60 * 1000    // En milisegundos
#define NTP_ADDRESS  "es.pool.ntp.org"  // Grupo que este más cerca

//Configurar cliente NTP 
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);

//Crear objeto en display
SSD1306  display(0x3C, 4, 5);  //0x3d para Adafruit 1.3" OLED, siendo 0x3C la dirección habitual del OLED

const char* ssid = "MOVISTAR_2E50";   // red
const char* password = "L37rpnbhrFa7dUfSGTiX";  // contraseña
String date;
String t;
String tempC;
const char * days[] = {"Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado"} ;
const char * months[] = {"Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dic"} ;
const char * ampm[] = {"AM", "PM"} ;

const char hostname[] = "openweathermap.org/";
const String url = "https://api.openweathermap.org/data/2.5/weather?id=3127461&appid=d13d300529de60133d2e3478b8da5758"; //put the link to Yahoo Weather API here
const int port = 80;

unsigned long timeout = 10000; //ms

WiFiClient client;

BlynkTimer timer;

WidgetBridge bridge1(V1);  // Conectar modulo de rele


BLYNK_CONNECTED() {
  // AuthToken del segundo hardware 
  bridge1.setAuthToken("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); // Ingrese el token de Auth del módulo de relé (Otro Módulo Esp8266);
}

void setup ()
{
  Serial.begin(115200); // La mayoría de las ESP-01 usan 115200 pero esto podría variar.
  timeClient.begin();   // Iniciar cliente NTP UDP

  Wire.pins(4, 5);  // Encender pantalla con GPIO 4 y 5 en ESP-01
  Wire.begin(4, 5); // 4=sda, 5=scl
  display.init();
  display.flipScreenVertically();

  Blynk.begin(auth, ssid, password, "blynk-cloud.com", 8080);
  // Conecta al WiFi
  pinMode(DataDisplayButton, INPUT);

  
  Serial.println("");
  display.drawString(0, 0, "Conectando al WiFi.");
  Serial.print(WiFi.localIP());
  Serial.println("");
  display.drawString(0, 24, "Hola!");
  display.display();
  delay(1000);
}
void loop()
{
  int buttonState = digitalRead(DataDisplayButton);
  if (buttonState == LOW) {
    Serial.print("Boton presionado");
    GetWeatherData();
    tellTime();
    delay(6000);
  }
  else {
    display.clear();
  }
  
  Blynk.run();
  timer.run();
  ControlRelays();
  
  display.display();
}

void ControlRelays(){
  // leer el estado del interruptor en una variable local:
  int reading1 = digitalRead(RelayButtonPin1);
  int reading2 = digitalRead(RelayButtonPin2);
   
  if(reading1 == LOW || reading2 == LOW){ // Estado de las luces
    display.drawRect(0, 20, 60, 40);
    display.drawRect(61, 20, 60, 40);
    display.setFont(ArialMT_Plain_10);
    display.drawString(17, 3, "Luces");
    display.drawString(84, 3, "A/C");        
    
    if(Relay1State == HIGH){
    display.setFont(ArialMT_Plain_16);
    display.drawString(18, 30, "ON");
    }
    else if(Relay1State == LOW){
    display.setFont(ArialMT_Plain_16);
    display.drawString(15, 30, "OFF");
    } 
    if(Relay2State == HIGH){
    display.setFont(ArialMT_Plain_16);
    display.drawString(78, 30, "ON");
    }
    else if(Relay2State == LOW){
    display.setFont(ArialMT_Plain_16);
    display.drawString(76, 30, "OFF");
    }   
    
}
   // verifica si acabas de presionar el botón
   // (es decir, la entrada pasó de BAJO a ALTO), y ha esperado lo suficiente
   // desde la última vez que se presionó para ignorar cualquier ruido:

   // Si el interruptor cambió, por ruido o por presionar:
   if (reading1 != lastButtonState1) {
    // reset the debouncing timer
    lastDebounceTime1 = millis();
  }
  if (reading2 != lastButtonState2) {
    // reset the debouncing timer
    lastDebounceTime2 = millis();
  }


  if ((millis() - lastDebounceTime1) > debounceDelay1) {
    // cualquiera que sea la lectura, ha estado ahí por más tiempo que el rebote
    // retraso, así que tómalo como el estado actual real:

   // si el estado del botón ha cambiado:
    if (reading1 != Relay1ButtonState) {
      Relay1ButtonState = reading1;

      // solo cambia el LED si el nuevo estado del botón es ALTO
      if (Relay1ButtonState == HIGH) {
        Relay1State = !Relay1State;
      }
    }
  }
  if ((millis() - lastDebounceTime2) > debounceDelay2) {
   // cualquiera que sea la lectura, ha estado ahí por más tiempo que el rebote
   // retraso, así que tómalo como el estado actual real:
    
    // if the button state has changed:
    if (reading2 != Relay2ButtonState) {
      Relay2ButtonState = reading2;

      
    // solo cambia el LED si el nuevo estado del botón es ALTO
      if (Relay2ButtonState == HIGH) {
        Relay2State = !Relay2State;
      }
    }
  }
  // establecer el led
  bridge1.digitalWrite(Relay1Pin, Relay1State);
  bridge1.digitalWrite(Relay2Pin, Relay2State);
    // guarda la lectura. La próxima vez que pase por el ciclo, será el estado del último botón:
  lastButtonState1 = reading1;
  lastButtonState2 = reading2;
}

void tellTime() {
  if (WiFi.status() == WL_CONNECTED) //Chequea la conexión WiFi
  {
    date = "";  // limpia las variables
    t = "";

    // actualice el cliente NTP y obtenga la marca de tiempo UTC de UNIX
    timeClient.update();
    unsigned long epochTime =  timeClient.getEpochTime();

    // convertir la marca de tiempo recibida en objeto time_t
    time_t local, utc;
    utc = epochTime;

    // Convierta la marca de tiempo UTC UNIX a la hora local
    TimeChangeRule usEDT = {"EDT", Second, Sun, Mar, 27, +120};  // Regla horario de verano
    TimeChangeRule usEST = {"EST", First, Sun, Oct, 30, +60};   // Regla horario de invierno
    local = usEastern.toLocal(utc);

    // Formatea variables de tiempo 
    date += days[weekday(local) - 1];
    date += ", ";
    date += months[month(local) - 1];
    date += " ";
    date += day(local);
    date += ", ";
    date += year(local);

    // format the time to 12-hour format with AM/PM and no seconds
    t += hourFormat12(local);
    t += ":";
    if (minute(local) < 10) // add a zero if minute is under 10
      t += "0";
    t += minute(local);
    t += " ";
    t += ampm[isPM(local)];

    // Mostrar fecha y hora
    Serial.println("");
    Serial.print("Fecha local: ");
    Serial.print(date);
    Serial.println("");
    Serial.print("Tiempo local: ");
    Serial.print(t);

    // Imprimir fecha y hora local
    display.clear();
    display.setTextAlignment(TEXT_ALIGN_CENTER);
    display.setFont(ArialMT_Plain_24);
    display.drawStringMaxWidth(64, 14, 128, t); // Imprimir la hora en la pantalla
    display.setFont(ArialMT_Plain_10);
    display.drawStringMaxWidth(64, 42, 128, date); // Imprimir la temperatura en la pantalla
    
    display.drawString(70, 0, "Temp:"); // Imprimir la temperatura de la función GetWeatherData() 
    display.drawString(100, 0, tempC);  // Aqui se puede cambiar a Farenheit
    display.drawString(113, 0, "C");
    display.display();
  }
  else // Reintento de conexión a WiFi si esta desconectado
  {
    display.clear();
    display.drawString(0, 18, "Conectando al WiFi...");
    display.display();
    WiFi.begin(ssid, password);
    display.drawString(0, 32, "Conectado.");
    display.display();
  }
}
  void GetWeatherData(){
  
  unsigned long timestamp;
  int temp;
  // Establecer conexión TCP
  Serial.print("Conectando... ");
  Serial.println(hostname);
  if ( !client.connect(hostname, port) ) {
    Serial.println("Conexion fallida");
  }

  // Enviar solicitud GET 
  String req = "GET " + url + " HTTP/1.1\r\n" + 
                "Host: " + hostname + "\r\n" +
                "Connection: close\r\n" +
                "\r\n";
  client.print(req);
  
  // Esperando respuesta del servidor
  delay(500);
  timestamp = millis();
  while ( !client.available() && (millis() < timestamp + timeout) ) {
    delay(1);
  }

  // Analizar temperatura
  if ( client.find("temp\":") ) {
    temp = client.parseInt();
    tempC = (temp - 32) * 5/9 ;
    Serial.print("Temperatura local: ");
    Serial.print(tempC);
    Serial.println("°C");
  }

  // Vaciar el bufer de recepción
  while ( client.available() ) {
    client.readStringUntil('\r');
  }

  // Cerrar conexión TCP
  client.stop();
  Serial.println();
  Serial.println("Conexion cerrada");
  }

Me sale los siguientes errores:

ATENCIÓN: la librería Timezone pretende ejecutarse sobre arquitectura(s) avr y puede ser incompatible con tu actual tarjeta la cual corre sobre arquitectura(s) esp8266.
esp8266_reloj_YO:22:22: error: 'Relay1State' was not declared in this scope
   22 | String RlSt = String(Relay1State, HEX);
      |                      ^~~~~~~~~~~
/Users/rodrigo/Desktop/ESP8266_SMARTWACH/esp8266_reloj_YO/esp8266_reloj_YO.ino: In function 'void ControlRelays()':
esp8266_reloj_YO:134:8: error: 'Relay1State' was not declared in this scope
  134 |     if(Relay1State == HIGH)
      |        ^~~~~~~~~~~
esp8266_reloj_YO:143:8: error: 'Relay2State' was not declared in this scope
  143 |     if(Relay2State == HIGH){
      |        ^~~~~~~~~~~
esp8266_reloj_YO:178:9: error: 'Relay1State' was not declared in this scope
  178 |         Relay1State = !Relay1State;
      |         ^~~~~~~~~~~
esp8266_reloj_YO:193:9: error: 'Relay2State' was not declared in this scope
  193 |         Relay2State = !Relay2State;
      |         ^~~~~~~~~~~
esp8266_reloj_YO:198:35: error: 'Relay1State' was not declared in this scope
  198 |   bridge1.digitalWrite(Relay1Pin, Relay1State);
      |                                   ^~~~~~~~~~~
esp8266_reloj_YO:199:35: error: 'Relay2State' was not declared in this scope
  199 |   bridge1.digitalWrite(Relay2Pin, Relay2State);
      |                                   ^~~~~~~~~~~
/Users/rodrigo/Desktop/ESP8266_SMARTWACH/esp8266_reloj_YO/esp8266_reloj_YO.ino: In function 'void tellTime()':
esp8266_reloj_YO:222:13: error: 'usEastern' was not declared in this scope
  222 |     local = usEastern.toLocal(utc);
      |             ^~~~~~~~~
exit status 1
'Relay1State' was not declared in this scope

Muchas gracias.

Hola

no puedes declarar esto estáticamente
Cadena RlSt = Cadena (Relé1Estado, HEX);
ya que esta es una llamada de función.

necesita declarar el String RlSt; y luego en la función setup() inicializarlo con
RlSt = String(Relay1State, HEX);

Muchas gracias! Me podriías ayudar a modificarlo?
Ando un poco perdido la verdad, llevo unos meses intentandolo corregir y no se..

para local = usEastern.toLocal(utc); no ha definido usEastern.

normalmente tendrías que hacer algo como
Timezone usEastern(usEDT, usEST);
pero esto necesita ser ajustado a su ne

probablemente algo como esto

#include <ESP8266WiFi.h>
#include <WifiUDP.h>
...
int Relay2Pin = 0; //Pin de rele en el otro ESP8266

String RlSt;
...

void setup ()
{
  RlSt = String(Relay1State, HEX); // <=== 
  Serial.begin(115200); // La mayoría de las ESP-01 usan 115200 pero esto podría variar.
  timeClient.begin();   // Iniciar cliente NTP UDP
...

Muchas gracias enserio por usar tu tiempo conmigo!

ATENCIÓN: la librería Timezone pretende ejecutarse sobre arquitectura(s) avr y puede ser incompatible con tu actual tarjeta la cual corre sobre arquitectura(s) esp8266.
/Users/rodrigo/Desktop/ESP8266_SMARTWACH/esp8266_reloj_YO/esp8266_reloj_YO.ino: In function 'void setup()':
esp8266_reloj_YO:81:16: error: 'Relay1State' was not declared in this scope
   81 |   RlSt= String(Relay1State, HEX);
      |                ^~~~~~~~~~~
/Users/rodrigo/Desktop/ESP8266_SMARTWACH/esp8266_reloj_YO/esp8266_reloj_YO.ino: In function 'void ControlRelays()':
esp8266_reloj_YO:135:8: error: 'Relay1State' was not declared in this scope
  135 |     if(Relay1State == HIGH){
      |        ^~~~~~~~~~~
esp8266_reloj_YO:143:8: error: 'Relay2State' was not declared in this scope
  143 |     if(Relay2State == HIGH){
      |        ^~~~~~~~~~~
esp8266_reloj_YO:178:9: error: 'Relay1State' was not declared in this scope
  178 |         Relay1State = !Relay1State;
      |         ^~~~~~~~~~~
esp8266_reloj_YO:193:9: error: 'Relay2State' was not declared in this scope
  193 |         Relay2State = !Relay2State;
      |         ^~~~~~~~~~~
esp8266_reloj_YO:198:35: error: 'Relay1State' was not declared in this scope
  198 |   bridge1.digitalWrite(Relay1Pin, Relay1State);
      |                                   ^~~~~~~~~~~
esp8266_reloj_YO:199:35: error: 'Relay2State' was not declared in this scope
  199 |   bridge1.digitalWrite(Relay2Pin, Relay2State);
      |                                   ^~~~~~~~~~~
/Users/rodrigo/Desktop/ESP8266_SMARTWACH/esp8266_reloj_YO/esp8266_reloj_YO.ino: In function 'void tellTime()':
esp8266_reloj_YO:222:13: error: 'usEastern' was not declared in this scope
  222 |     local = usEastern(usEDT, usEST)
      |             ^~~~~~~~~
exit status 1
'Relay1State' was not declared in this scope

Me sigue salendo asi...

lo modifique bien asi?

  // Convierta la marca de tiempo UTC UNIX a la hora local
    TimeChangeRule usEDT = {"EDT", Second, Sun, Mar, 27, +120};  // Regla horario de verano
    TimeChangeRule usEST = {"EST", First, Sun, Oct, 30, +60};   // Regla horario de invierno
    local = usEastern(usEDT, usEST)

Publica tu código completo. no se que cambiaste

#include <ESP8266WiFi.h>
#include <WifiUDP.h>
#include <String.h>
#include <Wire.h>
#include <SSD1306.h>
#include <SSD1306Wire.h>
#include <NTPClient.h>
#include <Time.h>
#include <TimeLib.h>
#include <Timezone.h>

#define BLYNK_PRINT Serial
#include <BlynkSimpleEsp8266.h>

const int DataDisplayButton = 14;
int RelayButtonPin1 = 12;
int RelayButtonPin2 = 13;

int Relay1Pin = 2; //Pin de rele en el otro ESP8266
int Relay2Pin = 0; //Pin de rele en el otro ESP8266

String RlSt;

int Relay1ButtonState;             // Lectura actual del pin de entrada
int Relay2ButtonState;             // Lectura actual del pin de entrada

int lastButtonState1 = LOW;   // Lectura anterior del pin de entrada
int lastButtonState2 = LOW;   // Lectura anterior del pin de entrada

//las siguientes variables son largas sin signo porque el tiempo, medido en
// milisegundos, se convertirá rápidamente en un número mayor que el que se puede almacenar en un int.

unsigned long lastDebounceTime1 = 0;  // la última vez que se cambió el pin de salida
unsigned long lastDebounceTime2 = 0;  // la última vez que se cambió el pin de salida

unsigned long debounceDelay1 = 50;  // el tiempo de rebote; aumentar si la salida parpadea
unsigned long debounceDelay2 = 50;  // el tiempo de rebote; aumentar si la salida parpadea

char auth[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXX"; //Ingresar autentificación
// Define NTP properties
#define NTP_OFFSET   60 * 60      // En segundo
#define NTP_INTERVAL 60 * 1000    // En milisegundos
#define NTP_ADDRESS  "es.pool.ntp.org"  // Grupo que este más cerca

//Configurar cliente NTP 
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);

//Crear objeto en display
SSD1306  display(0x3C, 4, 5);  //0x3d para Adafruit 1.3" OLED, siendo 0x3C la dirección habitual del OLED

const char* ssid = "MOVISTAR_2E50";   // red
const char* password = "L37rpnbhrFa7dUfSGTiX";  // contraseña
String date;
String t;
String tempC;
const char * days[] = {"Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado"} ;
const char * months[] = {"Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dic"} ;
const char * ampm[] = {"AM", "PM"} ;

const char hostname[] = "openweathermap.org/";
const String url = "https://api.openweathermap.org/data/2.5/weather?id=3127461&appid=d13d300529de60133d2e3478b8da5758"; //put the link to Yahoo Weather API here
const int port = 80;

unsigned long timeout = 10000; //ms

WiFiClient client;

BlynkTimer timer;

WidgetBridge bridge1(V1);  // Conectar modulo de rele


BLYNK_CONNECTED() {
  // AuthToken del segundo hardware 
  bridge1.setAuthToken("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); // Ingrese el token de Auth del módulo de relé (Otro Módulo Esp8266);
}

void setup ()
{
  RlSt= String(Relay1State, HEX);
  Serial.begin(115200); // La mayoría de las ESP-01 usan 115200 pero esto podría variar.
  timeClient.begin();   // Iniciar cliente NTP UDP

  Wire.pins(4, 5);  // Encender pantalla con GPIO 4 y 5 en ESP-01
  Wire.begin(4, 5); // 4=sda, 5=scl
  display.init();
  display.flipScreenVertically();

  Blynk.begin(auth, ssid, password, "blynk-cloud.com", 8080);
  // Conecta al WiFi
  pinMode(DataDisplayButton, INPUT);

  
  Serial.println("");
  display.drawString(0, 0, "Conectando al WiFi.");
  Serial.print(WiFi.localIP());
  Serial.println("");
  display.drawString(0, 24, "Hola!");
  display.display();
  delay(1000);
}
void loop()
{
  int buttonState = digitalRead(DataDisplayButton);
  if (buttonState == LOW) {
    Serial.print("Boton presionado");
    GetWeatherData();
    tellTime();
    delay(6000);
  }
  else {
    display.clear();
  }
  
  Blynk.run();
  timer.run();
  ControlRelays();
  
  display.display();
}

void ControlRelays(){
  // leer el estado del interruptor en una variable local:
  int reading1 = digitalRead(RelayButtonPin1);
  int reading2 = digitalRead(RelayButtonPin2);
   
  if(reading1 == LOW || reading2 == LOW){ // Estado de las luces
    display.drawRect(0, 20, 60, 40);
    display.drawRect(61, 20, 60, 40);
    display.setFont(ArialMT_Plain_10);
    display.drawString(17, 3, "Luces");
    display.drawString(84, 3, "A/C");        
    
    if(Relay1State == HIGH){
    display.setFont(ArialMT_Plain_16);
    display.drawString(18, 30, "ON");
    }
    else if(Relay1State == LOW){
    display.setFont(ArialMT_Plain_16);
    display.drawString(15, 30, "OFF");
    } 
    if(Relay2State == HIGH){
    display.setFont(ArialMT_Plain_16);
    display.drawString(78, 30, "ON");
    }
    else if(Relay2State == LOW){
    display.setFont(ArialMT_Plain_16);
    display.drawString(76, 30, "OFF");
    }   
    
}
   // verifica si acabas de presionar el botón
   // (es decir, la entrada pasó de BAJO a ALTO), y ha esperado lo suficiente
   // desde la última vez que se presionó para ignorar cualquier ruido:

   // Si el interruptor cambió, por ruido o por presionar:
   if (reading1 != lastButtonState1) {
    // reset the debouncing timer
    lastDebounceTime1 = millis();
  }
  if (reading2 != lastButtonState2) {
    // reset the debouncing timer
    lastDebounceTime2 = millis();
  }


  if ((millis() - lastDebounceTime1) > debounceDelay1) {
    // cualquiera que sea la lectura, ha estado ahí por más tiempo que el rebote
    // retraso, así que tómalo como el estado actual real:

   // si el estado del botón ha cambiado:
    if (reading1 != Relay1ButtonState) {
      Relay1ButtonState = reading1;

      // solo cambia el LED si el nuevo estado del botón es ALTO
      if (Relay1ButtonState == HIGH) {
        Relay1State = !Relay1State;
      }
    }
  }
  if ((millis() - lastDebounceTime2) > debounceDelay2) {
   // cualquiera que sea la lectura, ha estado ahí por más tiempo que el rebote
   // retraso, así que tómalo como el estado actual real:
    
    // if the button state has changed:
    if (reading2 != Relay2ButtonState) {
      Relay2ButtonState = reading2;

      
    // solo cambia el LED si el nuevo estado del botón es ALTO
      if (Relay2ButtonState == HIGH) {
        Relay2State = !Relay2State;
      }
    }
  }
  // establecer el led
  bridge1.digitalWrite(Relay1Pin, Relay1State);
  bridge1.digitalWrite(Relay2Pin, Relay2State);
    // guarda la lectura. La próxima vez que pase por el ciclo, será el estado del último botón:
  lastButtonState1 = reading1;
  lastButtonState2 = reading2;
}

void tellTime() {
  if (WiFi.status() == WL_CONNECTED) //Chequea la conexión WiFi
  {
    date = "";  // limpia las variables
    t = "";

    // actualice el cliente NTP y obtenga la marca de tiempo UTC de UNIX
    timeClient.update();
    unsigned long epochTime =  timeClient.getEpochTime();

    // convertir la marca de tiempo recibida en objeto time_t
    time_t local, utc;
    utc = epochTime;

    // Convierta la marca de tiempo UTC UNIX a la hora local
    TimeChangeRule usEDT = {"EDT", Second, Sun, Mar, 27, +120};  // Regla horario de verano
    TimeChangeRule usEST = {"EST", First, Sun, Oct, 30, +60};   // Regla horario de invierno
    local = usEastern(usEDT, usEST);

    // Formatea variables de tiempo 
    date += days[weekday(local) - 1];
    date += ", ";
    date += months[month(local) - 1];
    date += " ";
    date += day(local);
    date += ", ";
    date += year(local);

    // format the time to 12-hour format with AM/PM and no seconds
    t += hourFormat12(local);
    t += ":";
    if (minute(local) < 10) // add a zero if minute is under 10
      t += "0";
    t += minute(local);
    t += " ";
    t += ampm[isPM(local)];

    // Mostrar fecha y hora
    Serial.println("");
    Serial.print("Fecha local: ");
    Serial.print(date);
    Serial.println("");
    Serial.print("Tiempo local: ");
    Serial.print(t);

    // Imprimir fecha y hora local
    display.clear();
    display.setTextAlignment(TEXT_ALIGN_CENTER);
    display.setFont(ArialMT_Plain_24);
    display.drawStringMaxWidth(64, 14, 128, t); // Imprimir la hora en la pantalla
    display.setFont(ArialMT_Plain_10);
    display.drawStringMaxWidth(64, 42, 128, date); // Imprimir la temperatura en la pantalla
    
    display.drawString(70, 0, "Temp:"); // Imprimir la temperatura de la función GetWeatherData() 
    display.drawString(100, 0, tempC);  // Aqui se puede cambiar a Farenheit
    display.drawString(113, 0, "C");
    display.display();
  }
  else // Reintento de conexión a WiFi si esta desconectado
  {
    display.clear();
    display.drawString(0, 18, "Conectando al WiFi...");
    display.display();
    WiFi.begin(ssid, password);
    display.drawString(0, 32, "Conectado.");
    display.display();
  }
}
  void GetWeatherData(){
  
  unsigned long timestamp;
  int temp;
  // Establecer conexión TCP
  Serial.print("Conectando... ");
  Serial.println(hostname);
  if ( !client.connect(hostname, port) ) {
    Serial.println("Conexion fallida");
  }

  // Enviar solicitud GET 
  String req = "GET " + url + " HTTP/1.1\r\n" + 
                "Host: " + hostname + "\r\n" +
                "Connection: close\r\n" +
                "\r\n";
  client.print(req);
  
  // Esperando respuesta del servidor
  delay(500);
  timestamp = millis();
  while ( !client.available() && (millis() < timestamp + timeout) ) {
    delay(1);
  }

  // Analizar temperatura
  if ( client.find("temp\":") ) {
    temp = client.parseInt();
    tempC = (temp - 32) * 5/9 ;
    Serial.print("Temperatura local: ");
    Serial.print(tempC);
    Serial.println("°C");
  }

  // Vaciar el bufer de recepción
  while ( client.available() ) {
    client.readStringUntil('\r');
  }

  // Cerrar conexión TCP
  client.stop();
  Serial.println();
  Serial.println("Conexion cerrada");
  }

¿No debería ser Relay1ButtonState?

ups!!! si toda la razon poniendo:
" 81 | RlSt= String(Relay1ButtonState, HEX);"
se soluciona un error!!

Siento ser un poco torpe, muchas gracias enserio!

ATENCIÓN: la librería Timezone pretende ejecutarse sobre arquitectura(s) avr y puede ser incompatible con tu actual tarjeta la cual corre sobre arquitectura(s) esp8266.
/Users/rodrigo/Desktop/ESP8266_SMARTWACH/esp8266_reloj_YO/esp8266_reloj_YO.ino: In function 'void ControlRelays()':
esp8266_reloj_YO:135:8: error: 'Relay1State' was not declared in this scope
  135 |     if(Relay1State == HIGH){
      |        ^~~~~~~~~~~
esp8266_reloj_YO:143:8: error: 'Relay2State' was not declared in this scope
  143 |     if(Relay2State == HIGH){
      |        ^~~~~~~~~~~
esp8266_reloj_YO:178:9: error: 'Relay1State' was not declared in this scope
  178 |         Relay1State = !Relay1State;
      |         ^~~~~~~~~~~
esp8266_reloj_YO:193:9: error: 'Relay2State' was not declared in this scope
  193 |         Relay2State = !Relay2State;
      |         ^~~~~~~~~~~
esp8266_reloj_YO:198:35: error: 'Relay1State' was not declared in this scope
  198 |   bridge1.digitalWrite(Relay1Pin, Relay1State);
      |                                   ^~~~~~~~~~~
esp8266_reloj_YO:199:35: error: 'Relay2State' was not declared in this scope
  199 |   bridge1.digitalWrite(Relay2Pin, Relay2State);
      |                                   ^~~~~~~~~~~
/Users/rodrigo/Desktop/ESP8266_SMARTWACH/esp8266_reloj_YO/esp8266_reloj_YO.ino: In function 'void tellTime()':
esp8266_reloj_YO:222:13: error: 'usEastern' was not declared in this scope
  222 |     local = usEastern(usEDT, usEST);
      |             ^~~~~~~~~
exit status 1
'Relay1State' was not declared in this scope

:slight_smile:

uno resuelto.. solo sigue mirando los otros. el mensaje del compilador suele ser bastante información

Enserio no se como agradecertelo! Gracias a tus consejos y correcciones solo me queda este error:

ATENCIÓN: la librería Timezone pretende ejecutarse sobre arquitectura(s) avr y puede ser incompatible con tu actual tarjeta la cual corre sobre arquitectura(s) esp8266.
/Users/rodrigo/Desktop/ESP8266_SMARTWACH/esp8266_reloj_YO/esp8266_reloj_YO.ino: In function 'void tellTime()':
esp8266_reloj_YO:222:13: error: 'usEastern' was not declared in this scope
  222 |     local = usEastern(usEDT, usEST);
      |             ^~~~~~~~~
exit status 1
'usEastern' was not declared in this scope

cambiar esto

    // Convierta la marca de tiempo UTC UNIX a la hora local
    TimeChangeRule usEDT = {"EDT", Second, Sun, Mar, 27, +120};  // Regla horario de verano
    TimeChangeRule usEST = {"EST", First, Sun, Oct, 30, +60};   // Regla horario de invierno
    local = usEastern(usEDT, usEST);

en eso

    // Convierta la marca de tiempo UTC UNIX a la hora local
    TimeChangeRule usEDT = {"EDT", Second, Sun, Mar, 27, +120};  // Regla horario de verano
    TimeChangeRule usEST = {"EST", First, Sun, Oct, 30, +60};   // Regla horario de invierno
    Timezone usEastern(usEDT, usEST); // <=====
    local = usEastern(usEDT, usEST);

No entiendo este error..

ATENCIÓN: la librería Timezone pretende ejecutarse sobre arquitectura(s) avr y puede ser incompatible con tu actual tarjeta la cual corre sobre arquitectura(s) esp8266.
/Users/rodrigo/Desktop/ESP8266_SMARTWACH/esp8266_reloj_YO/esp8266_reloj_YO.ino: In function 'void tellTime()':
esp8266_reloj_YO:223:35: error: no match for call to '(Timezone) (TimeChangeRule&, TimeChangeRule&)'
  223 |     local = usEastern(usEDT, usEST);
      |                                   ^
exit status 1
no match for call to '(Timezone) (TimeChangeRule&, TimeChangeRule&)'

➜ No sé si la biblioteca que usas es compatible.

Yo la saque buscando información, todo el mundo la usa no se la verdad
¿Hay alguna forma de comprobarlo?

Esa librería no es para ESP8266, tienes que usar la librería Timezone_Generic.

Resolverlo era tan sencillo como buscar "timezone.h esp8266" en Google.

Saludos

1 Like

Hola gracias por intentar ayudarme :slight_smile:

#include <ESP8266WiFi.h>
#include <WifiUDP.h>
#include <String.h>
#include <Wire.h>
#include <SSD1306.h>
#include <SSD1306Wire.h>
#include <NTPClient.h>
#include <Time.h>
#include <TimeLib.h>
#include <Timezone_Generic.h>
    TimeChangeRule usEDT = {"EDT", Second, Sun, Mar, 27, +120};   // Regla horario de verano
    TimeChangeRule usEST = {"EST", First, Sun, Oct, 30, +60};   // Regla horario de invierno
    Timezone usEastern(usEDT, usEST); // <=====
    local = usEastern(usEDT, usEST);
/Users/rodrigo/Desktop/ESP8266_SMARTWACH/esp8266_reloj_YO/esp8266_reloj_YO.ino: In function 'void tellTime()':
esp8266_reloj_YO:223:35: error: no match for call to '(Timezone) (TimeChangeRule&, TimeChangeRule&)'
  223 |     local = usEastern(usEDT, usEST);
      |                                   ^
exit status 1
no match for call to '(Timezone) (TimeChangeRule&, TimeChangeRule&)'

Resolvi el problema, pero ahora tengo este :frowning: