Error con código NTP y ETH

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!

Probaste algo asi?

#include <NTPClient.h>
// change next line to use with another board/shield
#include <WiFi.h>
//#include <WiFi.h> // for WiFi shield
//#include <WiFi101.h> // for WiFi 101 shield or MKR1000
#include <WiFiUdp.h>

const char *ssid     = "<SSID>";
const char *password = "<PASSWORD>";

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);

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

  WiFi.begin(ssid, password);

  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }

  timeClient.begin();
}

void loop() {
  timeClient.update();

  Serial.println(timeClient.getFormattedTime());

  delay(1000);
}

Te estas conectado por Ethernet?
Si, según lo que vi tiene un conector RJ45.

Observá la simpleza con la que se consulta el tiempo del servidor NTP comparado con el código que vos tenés.

Lo pongo en otro post

#include <ETH.h>
#include <NTPClient.h>
#include <WiFiUdp.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];

// Inicializar WiFiUDP y NTPClient
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, ntpServer, gmtOffset_sec, 60000);

// Función para enviar datos a un esclavo I2C
void enviarMensajeEsclavo(int direccionEsclavo, uint8_t hora, uint8_t minutos, uint8_t segundos, uint8_t dia, uint8_t mes, uint8_t ano) {
  Wire.beginTransmission(direccionEsclavo);
  Wire.write(hora);
  Wire.write(minutos);
  Wire.write(segundos);
  Wire.write(dia);
  Wire.write(mes);
  Wire.write(ano);
  Wire.endTransmission();
}


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
  timeClient.begin();
  timeClient.update();
}

void loop() {
  // Actualizar tiempo NTP
  timeClient.update();
  
  // Extraer hora, minutos y segundos
  unsigned long epochTime = timeClient.getEpochTime();
  struct tm *ptm = gmtime((time_t *)&epochTime);

  horaActEnv = ptm->tm_hour;
  minutosActEnv = ptm->tm_min;
  segundosActEnv = ptm->tm_sec;

  // Enviar datos a cada esclavo
  enviarMensajeEsclavo(DIRECCION_ESCLAVO_8, horaActEnv, minutosActEnv, segundosActEnv, diaActEnv, mesActEnv, anoActEnv);
  enviarMensajeEsclavo(DIRECCION_ESCLAVO_9, horaActEnv, minutosActEnv, segundosActEnv, diaActEnv, mesActEnv, anoActEnv);
  enviarMensajeEsclavo(DIRECCION_ESCLAVO_10, horaActEnv, minutosActEnv, segundosActEnv, diaActEnv, mesActEnv, anoActEnv);
  enviarMensajeEsclavo(DIRECCION_ESCLAVO_11, horaActEnv, minutosActEnv, segundosActEnv, diaActEnv, mesActEnv, anoActEnv);

  // Evitar rebotes
  delay(1000);
}

A ver como se comporta?