Buenas!
He realizado un código para una placa LilyGo T-ETH-Lite ESP32S3 en el cual le doy una IP estática para que posteriormente se conecte en un servidor NTP privado, una vez establecida esta conexión, recoge la hora para enviarla a través del protocolo I2C a cuatro ESP32S3.
El problema es que hace una semana el código funcionaba, leía la hora del servidor NTP y la enviaba a los esclavos y ahora, me sale un fallo en el monitor serie, el cual no sé que es y del que no he encontrado información en internet.
Os dejo mi código:
// INCLUIR LIBRERÍAS NECESARIAS
#include <ETH.h>
#include <NTPClient.h>
#include <Wire.h>
// DATOS DIRECCIÓN IP
IPAddress ip(10, 82, 103, 216); // IP
IPAddress gateway(10, 82, 103, 209); // Puerta de enlace
IPAddress subnet(255, 255, 255, 240); // Máscara de subred
// DATOS SERVIDOR NTP
const char* ntpServer = "172.24.147.139";
const long gmtOffset_sec = 3600;
const int daylightOffset_sec = 3600;
// DIRECCIONES I2C
const int I2C_SDA = 19;
const int I2C_SCL = 20;
#define DIRECCION_ESCLAVO_8 8
#define DIRECCION_ESCLAVO_9 9
#define DIRECCION_ESCLAVO_10 10
#define DIRECCION_ESCLAVO_11 11
// DECLARAR VARIABLES, I2C
uint32_t i = 0;
// VARIABLES FECHA Y HORA
char horaAct[3];
uint8_t horaActEnv;
char minutosAct[3];
uint8_t minutosActEnv;
char segundosAct[3];
uint8_t segundosActEnv;
char diaAct[3];
uint8_t diaActEnv;
char mesAct[3];
uint8_t mesActEnv;
char anoAct[5];
uint8_t anoActEnv;
bool cambioHorario = true;
char diaActLet[4];
char diaActSem[2];
void setup() {
// INCIALIZAR MONITOR SERIE
Serial.begin(115200);
Serial.setDebugOutput(true);
// INICIALIZAR I2C
Wire.begin(I2C_SDA, I2C_SCL);
// INICIALIZAR ETHERNET
ETH.begin();
ETH.config(IPAddress(ip), IPAddress(gateway), IPAddress(subnet));
// INICIALIZAR CLIENTE NTP
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
}
void loop() {
// COMPROBAR SERVIDOR NTP
if ( !ETH.begin() ){
horaActEnv = -5;
}
// MOSTRAR HORA
printLocalTime();
// ENVIAR MENSAJE A ESCLAVO 8
Wire.beginTransmission(DIRECCION_ESCLAVO_8);
Wire.write(horaActEnv);
Wire.write(minutosActEnv);
Wire.write(segundosActEnv);
Wire.write(diaActEnv);
Wire.write(mesActEnv);
Wire.write(anoActEnv);
Wire.endTransmission();
// ENVIAR MENSAJE A ESCLAVO 9
Wire.beginTransmission(DIRECCION_ESCLAVO_9);
Wire.write(horaActEnv);
Wire.write(minutosActEnv);
Wire.write(segundosActEnv);
Wire.write(diaActEnv);
Wire.write(mesActEnv);
Wire.write(anoActEnv);
Wire.endTransmission();
// ENVIAR MENSAJE A ESCLAVO 10
Wire.beginTransmission(DIRECCION_ESCLAVO_10);
Wire.write(horaActEnv);
Wire.write(minutosActEnv);
Wire.write(segundosActEnv);
Wire.write(diaActEnv);
Wire.write(mesActEnv);
Wire.write(anoActEnv);
Wire.endTransmission();
// ENVIAR MENSAJE A ESCLAVO 11
Wire.beginTransmission(DIRECCION_ESCLAVO_11);
Wire.write(horaActEnv);
Wire.write(minutosActEnv);
Wire.write(segundosActEnv);
Wire.write(diaActEnv);
Wire.write(mesActEnv);
Wire.write(anoActEnv);
Wire.endTransmission();
// EVITAR REBOTES
delay(1000);
}
void printLocalTime(){
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
if ( ((mesAct[1] - 48) == 1) && ((mesAct[0] - 48) == 0) && ((diaActSem[0] - 48) == 7) && ((horaAct[1] - 48) == 2) && ( ((diaAct[1] - 48) == 3) || ( ((diaAct[1] - 48) == 2) && ( ((diaAct[0] - 48) == 6) || ((diaAct[0] - 48) == 7) || ((diaAct[0] - 48) == 8) || ((diaAct[0] - 48) == 9) ) ) ) ){
cambioHorario = true;
}
if ( ((mesAct[1] - 48) == 0) && ((mesAct[0] - 48) == 3) && ((diaActSem[0] - 48) == 7) && ((horaAct[1] - 48) == 2) && ( ((diaAct[1] - 48) == 3) || ( ((diaAct[1] - 48) == 2) && ( ((diaAct[0] - 48) == 6) || ((diaAct[0] - 48) == 7) || ((diaAct[0] - 48) == 8) || ((diaAct[0] - 48) == 9) ) ) ) ){
cambioHorario = false;
}
Serial.println(&timeinfo);
strftime(horaAct,3, "%H", &timeinfo);
if (cambioHorario = true){
if ( (horaAct[0] == 2) && (horaAct[1] == 0) ){
horaActEnv = ( (horaAct[0] - 49) * 10 ) + ( (horaAct[1]* 1) - 49);
}else{
horaActEnv = ( (horaAct[0] - 48) * 10 ) + ( (horaAct[1]* 1) - 49);
}
}else{
horaActEnv = ( (horaAct[0] - 48) * 10 ) + ( (horaAct[1]* 1) - 48);
}
Serial.print("Hora actual: ");
Serial.println(horaActEnv);
strftime(minutosAct,3, "%M", &timeinfo);
minutosActEnv = ( (minutosAct[0] - 48) * 10 ) + ( (minutosAct[1]* 1) - 48);
Serial.print("Minutos actuales: ");
Serial.println(minutosActEnv);
strftime(segundosAct,3, "%S", &timeinfo);
segundosActEnv = ( (segundosAct[0] - 48) * 10 ) + ( (segundosAct[1]* 1) - 48);
Serial.print("Segundos actuales: ");
Serial.println(segundosActEnv);
strftime(diaActLet, 4, "%a", &timeinfo);
Serial.print("Día semana: ");
Serial.println(diaActLet);
strftime(diaActSem, 3, "%u", &timeinfo);
Serial.print("Día de la semana: ");
Serial.println(diaActSem[0]);
strftime(diaAct,3, "%d", &timeinfo);
diaActEnv = ( (diaAct[0] - 48) * 10 ) + ( (diaAct[1]* 1) - 48);
Serial.print("Dia actual: ");
Serial.println(diaActEnv);
strftime(mesAct,3, "%m", &timeinfo);
mesActEnv = ( (mesAct[0] - 48) * 10 ) + ( (mesAct[1]* 1) - 48);
Serial.print("Mes actual: ");
Serial.println(mesActEnv);
strftime(anoAct,5, "%Y", &timeinfo);
anoActEnv = ((anoAct[2] - 48 ) * 10) + ( (anoAct[3] - 48 ) * 1);
Serial.print("Año actual: ");
Serial.print("20");
Serial.println(anoActEnv);
Serial.println("---------------------");
}
Y aquí dejo el mensaje que sale en el monitor serie:
Rebooting...
���ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0xc (RTC_SW_CPU_RST),boot:0x2b (SPI_FAST_FLASH_BOOT)
Saved PC:0x4037962e
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce2820,len:0x10f0
load:0x403c8700,len:0x4
load:0x403c8704,len:0xbec
load:0x403cb700,len:0x2fcc
entry 0x403c88ac
assert failed: sntp_setoperatingmode /IDF/components/lwip/lwip/src/apps/sntp/sntp.c:728 (Required to lock TCPIP core functionality!)
Backtrace: 0x403766ce:0x3fca3740 0x4037c569:0x3fca3760 0x40382d9d:0x3fca3780 0x4201a4e4:0x3fca38b0 0x42009242:0x3fca38d0 0x42003b14:0x3fca3940 0x4200a2d6:0x3fca3a20 0x4037d09a:0x3fca3a40
ELF file SHA256: 3f01dafe2
Gracias de antemano!