Problema LCD - Dispensador de comida

Tengo un problema con mi LCD, solo aparecen cuadritos blancos pero no aparecen los datos que especifique en la programacion, ya ajuste el contraste y sigue sin aparecer. el circuito usa el liquid_menu, podría ser eso?

#include <virtuabotixRTC.h>
#include <LiquidCrystal_I2C.h>//libreria del modulo i2c del display
#include <LiquidMenu.h>//libreria del menu para el lcd
#include <Wire.h>
LiquidCrystal_I2C lcd (0x27, 16, 2);//inicializa la interfaz I2C del LCD 16x2

////////////////////////////////Cambiar hora según se desee /////////////////////////

//////////////////////////////// Horario 1 /////////////////////////
int h1_c1 = 7;   int m1_c1 = 10;   int s1_c1 = 0;
int h2_c1 = 7;   int m2_c1 = 45;  int s2_c1 = 0;

//////////////////////////////// Horario 2 /////////////////////////
int h1_c2 = 7;   int m1_c2 = 0;   int s1_c2 = 0;
int h2_c2 = 7;   int m2_c2 = 30;  int s2_c2 = 0;
int h3_c2 = 8;   int m3_c2 = 10;  int s3_c2 = 0;

//////////////////////////////// Cambiar hora según se desee /////////////////////////

//PINES DEL RTC
//CLK -> 4, DAT -> 3, RESET -> 2
virtuabotixRTC myRTC(4, 3, 2);

//PINES DEL ENCODER
#define outputA 5//SUBIR
#define outputB 6//BAJAR
#define sw 7//PRESIONAR

//DETECCION DE MOVIMIENTO DEL ENCODER
int aState;
int aLastState;

//PINES DE SALIDA
#define m1 8
#define m2 9
#define m3 10
#define m4 11
#define bomba 12

int raza_seleccionada = 0;//determinamos la raza seleccionada
int agua = 500;//tiempo que la bomba será encendida

int vueltas_motor_pequeno = 100;
int vueltas_motor_mediano = 200;
int vueltas_motor_grande = 300;

//pantalla 1
LiquidLine linea1(1, 0, (myRTC.hours, ":", myRTC.minutes, ":", myRTC.seconds));
LiquidLine linea2(1, 1, (myRTC.dayofmonth, " de ", myRTC.month, ", 2024"));
LiquidScreen pantalla1(linea1, linea2);

//pantalla 2
LiquidLine linea1_2(1, 0, "Escoge la raza");//en linea 1 aparece seleccionar opción
LiquidLine linea2_2(1, 1, "Pequeno");//en linea 1 aparece pequeño
LiquidLine linea3_2(1, 0, "Mediano");//en linea 1.1 o 3 aparece mediano
LiquidLine linea4_2(1, 1, "Grande");//en linea 2.1 o 4 aparece grande
LiquidScreen pantalla2(linea1_2, linea2_2, linea3_2, linea4_2);

//pantalla 3
LiquidLine linea1_3(1, 0, "Escoge Horario");
LiquidLine linea2_3(1, 1, "Atras");
LiquidScreen pantalla3(linea1_3, linea2_3);

//pantalla 4
LiquidLine linea1_4(1, 0, "Tres Tiempos");
LiquidLine linea2_4(1, 1, "Dos Tiempos");
LiquidScreen pantalla4(linea1_4, linea2_4);

LiquidMenu menu(lcd, pantalla1, pantalla2, pantalla3, pantalla4);

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

  myRTC.setDS1302Time(00, 00, 15, 1, 22, 07, 2024);//se pone la hora y fecha actual

  pinMode(m1, OUTPUT);
  pinMode(m2, OUTPUT);
  pinMode(m3, OUTPUT);
  pinMode(m4, OUTPUT);

  pinMode(sw, INPUT_PULLUP);

  //lcd.init();, encendemos el lcd
  lcd.init();
  lcd.backlight();
  Wire.begin();
  lcd.clear();
  menu.init();

  ////////////////////////////////////pantalla 1//////////////////////////////////////////
  linea1.set_focusPosition(Position::LEFT);
  linea2.set_focusPosition(Position::LEFT);

  linea1.attach_function(1, fn_pantalla_inicio);
  linea2.attach_function(1, fn_pantalla_inicio);

  menu.add_screen(pantalla1);

  ////////////////////////////////////pantalla 2//////////////////////////////////////////
  linea2_2.set_focusPosition(Position::LEFT);
  linea3_2.set_focusPosition(Position::LEFT);
  linea4_2.set_focusPosition(Position::LEFT);

  linea2_2.attach_function(1, fn_pequeno);//llamamos a la función con la opción de
  linea2_2.attach_function(1, fn_mediano);//cada una de las lineas
  linea3_2.attach_function(1, fn_grande);

  menu.add_screen(pantalla2);

  ////////////////////////////////////pantalla 3//////////////////////////////////////////
  linea1_3.set_focusPosition(Position::LEFT);
  linea2_3.set_focusPosition(Position::LEFT);

  linea1_3.attach_function(1, fn_hora);
  linea2_3.attach_function(1, fn_atras);

  menu.add_screen(pantalla3);

  ////////////////////////////////////pantalla 4//////////////////////////////////////////
  linea1_4.set_focusPosition(Position::LEFT);
  linea2_4.set_focusPosition(Position::LEFT);

  linea1_4.attach_function(1, fn_horario_1_1);
  linea2_4.attach_function(1, fn_horario_2_1);

  menu.add_screen(pantalla4);


  pantalla1.set_displayLineCount(2);
  pantalla2.set_displayLineCount(2);
  pantalla3.set_displayLineCount(2);
  pantalla4.set_displayLineCount(2);

  menu.set_focusedLine(0);

  menu.update();//se actualiza con el movimiento/rotacion del encoder

}
////////////////////////////////// Void loop() ///////////
void loop() {
  ////////////////////////////////// encoder ///////////
  //pregunta la opcion seleccionada
  selectOption();

  aState = digitalRead(outputA);
  if (aState != aLastState) {
    if (digitalRead(outputB) != aState) {
      menu.switch_focus(false);
    } else {
      menu.switch_focus(true);
    }
    menu.update();
    aLastState = aState;
  }
  ////////////////////////////////// RTC ///////////
  myRTC.updateTime();
}
//////////////////////////////// Fin del void loop(), inician las Funciones/////////////////////////


//Funciones:::::

void selectOption() {
  if (digitalRead(sw) == LOW) {
    menu.call_function(1);
    delay(500);
  }
}

void fn_pantalla_inicio() {
  menu.change_screen(2);
  menu.set_focusedLine(0);
}

void fn_pequeno() {
  menu.change_screen(3);
  menu.set_focusedLine(0);
  raza_seleccionada = 1;
}

void fn_mediano() {
  menu.change_screen(3);
  menu.set_focusedLine(0);
  raza_seleccionada = 2;
}


void fn_grande() {
  menu.change_screen(3);
  menu.set_focusedLine(0);
  raza_seleccionada = 3;
}

void fn_hora() {
  menu.change_screen(4);
  menu.set_focusedLine(0);
}

void fn_atras() {
  menu.change_screen(2);
  menu.set_focusedLine(0);
}

void fn_horario_1_1() {
  menu.change_screen(1);
  menu.set_focusedLine(0);
  horario_1();
}

void fn_horario_2_1() {
  menu.change_screen(1);
  menu.set_focusedLine(0);
  horario_2();
}

//////////////////// switch horario seleccionado  //////////////////////////////////
void fn_horario_1() {
  switch (raza_seleccionada) {
    case 1:
      fn_motores_pequeno();
      break;
    case 2:
      fn_motores_mediano();
      break;
    case 3:
      fn_motores_grande();
      break;
  }
}

void fn_horario_2() {
  switch (raza_seleccionada) {
    case 1:
      fn_motores_pequeno();
      break;
    case 2:
      fn_motores_mediano();
      break;
    case 3:
      fn_motores_grande();
      break;
  }
}

////////////////////////////////////establecer variables de horarios//////////////////////////////////////////
int hora;
int minuto;
int segundo;

///////////////////// Condicional del Horario 1  //////////////////////////////////
void horario_1() {

  if ((hora == h1_c1) && (minuto == m1_c1) && (segundo == s1_c1))  fn_horario_1();
  if ((hora == h2_c1) && (minuto == m2_c1) && (segundo == s2_c1))  fn_horario_1();
}
//////////////////// Condicional del Horario 2  //////////////////////////////////
void horario_2() {

  if ((hora == h1_c2) && (minuto == m1_c2) && (segundo == s1_c2))  fn_horario_2();
  if ((hora == h2_c2) && (minuto == m2_c2) && (segundo == s2_c2))  fn_horario_2();
  if ((hora == h3_c2) && (minuto == m3_c2) && (segundo == s3_c2))  fn_horario_2();
}

/////////////////////movimiento de motores  //////////////////////////////////
void fn_motores_pequeno() {
  for (int i = 0; i < vueltas_motor_pequeno; i++) {
    motor_stepper();
  }
  digitalWrite(bomba, HIGH);
  delay(agua);
}

void fn_motores_mediano() {
  for (int i = 0; i < vueltas_motor_mediano; i++) {
    motor_stepper();
  }
  digitalWrite(bomba, HIGH);
  delay(agua);
}

void fn_motores_grande() {
  for (int i = 0; i < vueltas_motor_grande; i++) {
    motor_stepper();
  }
  digitalWrite(bomba, HIGH);
  delay(agua);
}


void motor_stepper() {
  digitalWrite(m1, HIGH);
  digitalWrite(m2, LOW);
  digitalWrite(m3, LOW);
  digitalWrite(m4, LOW);
  delay(5);

  digitalWrite(m1, LOW);
  digitalWrite(m2, HIGH);
  digitalWrite(m3, LOW);
  digitalWrite(m4, LOW);
  delay(5);

  digitalWrite(m1, LOW);
  digitalWrite(m2, LOW);
  digitalWrite(m3, HIGH);
  digitalWrite(m4, LOW);
  delay(5);

  digitalWrite(m1, LOW);
  digitalWrite(m2, LOW);
  digitalWrite(m3, LOW);
  digitalWrite(m4, HIGH);
  delay(5);
}

este es el código completo, intenté documentarlo lo mejor posible

Yo empezaría por ejecutar un scanner de I2C para asegurar que el Arduino lo detecta, y posteriormente alguno(s) de los ejemplos de la librería

Intentaré con ello, gracias por tu ayuda, informaré cualquier actualización

Probaste el contraste, usando el potenciómetro?

A4 es SDA
A5 es SCL

Prueba este ejemplo y nos cuentas

Yo uso