// bajo licencia GNU GPL 3.0// Código escrito por Abhishek Ghosh// Sitio web: https://thecustomizewindows.com // // #include #incluir #incluir #incluir // Definir pines para codificador rotatorio#definir ENCODER_PIN1 A0#definir ENCODER_PIN2 A1#definir BUTTON_PIN A2 // Definir pines para pulsadores usando interrupciones#definir START_STOP_PIN 2#definir RESET_PIN 3 // Definir pines para LED#definir LED_RUNNING_PIN 4#definir LED_COMPLETE_PIN 5 / / Inicializar objetosLiquidCrystal_I2C lcd(0x3F, 16, 2); // Ajusta la dirección y el tamaño según tu LCDRTC_DS3231 rtc;Codificador encoder(ENCODER_PIN1, ENCODER_PIN2); bool volátil startStopPressed = falso; bool volátil resetPressed = falso; // Variables del temporizadorint countdownMinutes = 0;unsigned long countdownEndTime = 0;bool timerRunning = false; configuración vacía() { lcd.begin(); LCD luz de fondo(); modopin(BUTTON_PIN, INPUT_PULLUP); modopin(START_STOP_PIN, INPUT_PULLUP); pinMode(RESET_PIN, INPUT_PULLUP); pinMode(LED_RUNNING_PIN, SALIDA); pinMode(LED_COMPLETE_PIN, SALIDA); adjuntarInterrupt(digitalPinToInterrupt(START_STOP_PIN), startStopInterrupt, FALLING); adjuntarInterrupt(digitalPinToInterrupt(RESET_PIN), resetInterrupt, FALLING); // Inicializa RTC if (!rtc.begin()) { lcd.print(«¡RTC no encontrado!»); mientras (1); }} void loop() { // Leer el codificador rotatorio long encoderValue = encoder.read(); if (encoderValue > 0) { cuenta atrásMinutos++; } más si (encoderValue < 0 && countdownMinutes > 0) { cuenta regresivaMinutos–; } // Comprobar si se presionó el botón de inicio/parada if (startStopPressed) { startStopPressed = false; if (!timerRunning) { iniciarTimer(); } más { stopTimer(); } } // Comprobar si se presionó el botón de reinicio if (resetPressed) { resetPressed = false; restablecer temporizador(); } // Actualizar la pantalla LCD updateDisplay(); // Comprobar si el cronómetro ha finalizado if (timerRunning && millis() >= countdownEndTime) { timerRunning = false; escritura digital (LED_COMPLETE_PIN, ALTA); // Activa el relé o realiza cualquier acción cuando se complete el cronómetro (opcional) }} void startStopInterrupt() { startStopPressed = true;} void resetInterrupt() { resetPressed = true;} void startTimer() { countdownEndTime = millis() + (countdownMinutes * 60000); // Convertir minutos a milisegundos timerRunning = true; escritura digital (LED_RUNNING_PIN, ALTA); digitalWrite(LED_COMPLETE_PIN, LOW);} void stopTimer() { timerRunning = false; digitalWrite(LED_RUNNING_PIN, LOW);} void resetTimer() { countdownMinutes = 0; detener temporizador(); digitalWrite(LED_COMPLETE_PIN, LOW);} void updateDisplay() { lcd.clear(); lcd.setCursor(0, 0); lcd.print(«Establecer temporizador: «); lcd.print(cuenta regresivaMinutos); lcd.print(«mínimo»); lcd.setCursor(0, 1); lcd.print(«Estado: «); if (timerRunning) { lcd.print(«En ejecución»); } else { lcd.print(«Detenido»); }}