#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
     
  }
}