#include <Wire.h>
#include <RTClib.h>
#include <Servo.h>
RTC_DS1307 rtc; // Usa DS3231 o DS1307 según tu módulo
Servo myServo;
int servoPin = 9;
int abierto = 90; // Posición a la que se moverá el servomotor
int cerrado = 0; // Posición inicial
unsigned long trabajo = 5000; // Tiempo de activación en milisegundos (5 segundos por defecto)
const int incrementButtonPin = 2; // Pin del botón para incrementar el tiempo
const int decrementButtonPin = 3; // Pin del botón para decrementar el tiempo
int buttonStateIncrement = 0; // Estado del botón de incremento
int buttonStateDecrement = 0; // Estado del botón de decremento
unsigned long tiempoInicio = 0;
bool activado = false;
void setup() {
Serial.begin(9600);
myServo.attach(servoPin);
// Verifica si el RTC está conectado
if (!rtc.begin()) {
Serial.println("No se encontró RTC");
while (1);
}
// Establece la hora (descomentar para usar solo una vez)
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
myServo.write(cerrado); // Posiciona el servo al inicio
// Configura los pines de los botones como entradas
pinMode(incrementButtonPin, INPUT);
pinMode(decrementButtonPin, INPUT);
}
void loop() {
DateTime fecha = rtc.now();
// Leer el estado de los botones
buttonStateIncrement = digitalRead(incrementButtonPin);
buttonStateDecrement = digitalRead(decrementButtonPin);
// Incrementar el tiempo de trabajo si el botón de incremento está presionado
if (buttonStateIncrement == HIGH) {
trabajo += 5000; // Incrementar en 5 segundos
Serial.print("Tiempo de trabajo incrementado a: ");
Serial.print(trabajo);
Serial.println(" ms");
delay(300); // Pequeña demora para evitar múltiples incrementos rápidos
}
// Decrementar el tiempo de trabajo si el botón de decremento está presionado
if (buttonStateDecrement == HIGH) {
if (trabajo > 5000) { // Asegurarse de que el tiempo no sea menor a 5 segundos
trabajo -= 5000; // Disminuir en 5 segundos
Serial.print("Tiempo de trabajo decrementado a: ");
Serial.print(trabajo);
Serial.println(" ms");
}
delay(300); // Pequeña demora para evitar múltiples decrementos rápidos
}
// Condición para mover el servo a la posición abierta
if (fecha.hour() == 22 && fecha.minute() == 41 && fecha.second() == 0 && !activado) {
myServo.write(abierto);
tiempoInicio = millis(); // Guarda el tiempo actual
activado = true;
Serial.println("Servo abierto");
}
// Condición para mover el servo de vuelta a la posición cerrada después del tiempo de trabajo
if (activado && (millis() - tiempoInicio >= trabajo)) {
myServo.write(cerrado);
activado = false;
Serial.println("Servo cerrado");
}
// Condición para mover el servo a la posición abierta de nuevo (Ejemplo adicional, si necesitas repetir el ciclo)
if (fecha.hour() == 22 && fecha.minute() == 42 && fecha.second() == 0 && !activado) {
myServo.write(abierto);
tiempoInicio = millis(); // Guarda el tiempo actual
activado = true;
Serial.println("Servo abierto");
}
// Condición para mover el servo de vuelta a la posición cerrada después del tiempo de trabajo
if (activado && (millis() - tiempoInicio >= trabajo)) {
myServo.write(cerrado);
activado = false;
Serial.println("Servo cerrado");
}
delay(1000); // Esperar un segundo antes de la siguiente lectura
}