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.