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