#include <Stepper.h> // Incluye la librería Stepper
#include <Wire.h> // Incluye la librería Wire para el I2C
#include <LiquidCrystal_I2C.h> // Incluye la librería LiquidCrystal_I2C para el LCD
const int stepsPerRevolution = 400; // Define el número de pasos por revolución del motor
const long duration = 195000; // Define la duración del programa en milisegundos (3 minutos 15 segundos = 3*60*1000 + 15*1000 = 184500 milisegundos)
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11); // Crea un objeto Stepper llamado myStepper con los pines de control 8, 10, 9 y 11
LiquidCrystal_I2C lcd(0x27, 16, 2); // Crea un objeto LiquidCrystal_I2C llamado lcd con la dirección I2C 0x27 y 16 columnas y 2 filas
void setup() {
myStepper.setSpeed(75); // Establece la velocidad del motor en 60 RPM
lcd.init(); // Inicializa el LCD
lcd.backlight(); // Enciende el backlight del LCD
lcd.setCursor(0, 0); // Coloca el cursor en la primera columna de la primera fila
lcd.print("Tiempo restante:"); // Imprime el texto "Tiempo restante:" en el LCD
Serial.begin(9600);
}
void loop() {
long startTime = millis(); // Guarda el tiempo actual en milisegundos en la variable startTime
long elapsedTime = 0; // Inicializa la variable elapsedTime en 0
while (elapsedTime < duration) { // Mientras elapsedTime sea menor que la duración del programa
myStepper.step(stepsPerRevolution); // Gira el motor 400 pasos a la derecha
Serial.println("clockwise");
delay(1000); // Espera 500 milisegundos
myStepper.step(-stepsPerRevolution); // Gira el motor 400 pasos a la izquierda
Serial.println("counterclockwise");
delay(1000); // Espera 500 milisegundos
elapsedTime = millis() - startTime; // Actualiza elapsedTime con la diferencia entre el tiempo actual y startTime
long remainingTime = duration - elapsedTime; // Calcula el tiempo restante como la diferencia entre la duración del programa y elapsedTime
int minutes = remainingTime / 60000; // Calcula el número de minutos restantes
int seconds = (remainingTime % 60000) / 1000; // Calcula el número de segundos restantes
lcd.setCursor(0, 1); // Coloca el cursor en la primera columna de la segunda fila
lcd.print(minutes); // Imprime el número de minutos restantes en el LCD
lcd.setCursor(1, 1); // Coloca el cursor en la primera columna de la segunda fila
lcd.print(":"); // Imprime el número de minutos restantes en el LCD
// Verifica si el número de segundos es menor que 10
lcd.setCursor(2, 1);
if (seconds < 10) {
lcd.print("0"); // Imprime un cero adicional si el número de segundos es menor que 10
}
lcd.print(seconds); // Imprime el número de segundos restantes en el LCD
}
}