#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Configuración del display: dirección I2C (generalmente 0x27) y dimensiones (16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Constants for the pin connections
#define ENCODER_CLK 2
#define ENCODER_DT 3
#define ENCODER_SW 4 // Botón del encoder para alternar entre tiempo y temperatura
int ultimaPosicionClk = HIGH;
int tiempo = 0;
int temperatura = 20; // Valor inicial de la temperatura
bool editandoTiempo = true; // Controla si estamos editando tiempo o temperatura
unsigned long ultimoDebounceTime = 0;
unsigned long debounceDelay = 5;
unsigned long ultimoBotonPressTime = 0;
unsigned long botonDelay = 200;
void setup() {
// Set pin modes
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_SW, INPUT_PULLUP); // Usar resistencia interna pull-up para el botón
// Start the serial monitor
Serial.begin(9600);
// Initialize the LCD
lcd.init();
lcd.backlight();
actualizarLCD();
}
void loop() {
// Leer el estado actual de CLK
unsigned int posicionActualClk = digitalRead(ENCODER_CLK);
// Leer el estado del botón del encoder
unsigned int estadoBoton = digitalRead(ENCODER_SW);
// Alternar entre tiempo y temperatura al presionar el botón
if (estadoBoton == LOW && (millis() - ultimoBotonPressTime > botonDelay)) {
editandoTiempo = !editandoTiempo;
actualizarLCD();
ultimoBotonPressTime = millis();
}
// Solo comprobar cambios si el estado de CLK ha cambiado y ha pasado el tiempo de debounce
if ((posicionActualClk != ultimaPosicionClk) && (millis() - ultimoDebounceTime > debounceDelay)) {
// Leer el estado de DT solo si CLK ha cambiado
unsigned int dtEncoder = digitalRead(ENCODER_DT);
if (posicionActualClk == LOW) {
if (dtEncoder == HIGH) {
// Incrementar tiempo o temperatura
if (editandoTiempo) {
tiempo += 1;
} else {
temperatura += 1;
}
} else {
// Decrementar tiempo o temperatura
if (editandoTiempo) {
tiempo -= 1;
} else {
temperatura -= 1;
}
}
// Imprimir el valor actual de tiempo o temperatura en el monitor serie
if (editandoTiempo) {
Serial.print("Tiempo: ");
Serial.println(tiempo);
} else {
Serial.print("Temperatura: ");
Serial.println(temperatura);
}
// Actualizar el display LCD con el nuevo valor de tiempo o temperatura
actualizarLCD();
// Actualizar el tiempo de debounce
ultimoDebounceTime = millis();
}
}
// Actualizar ultimaPosicionClk al estado actual para la próxima comparación
ultimaPosicionClk = posicionActualClk;
}
void actualizarLCD() {
lcd.clear();
if (editandoTiempo) {
lcd.setCursor(0, 0);
lcd.print("Editando Tiempo:");
lcd.setCursor(0, 1);
lcd.print(tiempo);
} else {
lcd.setCursor(0, 0);
lcd.print("Editando Temp:");
lcd.setCursor(0, 1);
lcd.print(temperatura);
}
}