#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definición de pines
#define MOTOR_PIN 23
#define BUTTON_PIN 4
#define LED_GREEN 17
#define LED_RED 16
// Configuración LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Variables de control
bool sistemaActivo = false;
unsigned long ultimaPulsacion = 0;
bool pulsacionEnProgreso = false;
// Variables para el ciclo de tiempos
unsigned long segundosTotales = 0;
unsigned long ultimoTiempo = 0;
bool estadoMotor = false;
// Estados del ciclo
enum EstadoCiclo { ENCENDIDO_1, APAGADO, ENCENDIDO_2 };
EstadoCiclo estadoActual = ENCENDIDO_1;
// Tiempos en segundos
const unsigned long TIEMPO_CICLO = 720; // 12 minutos (12*60)
const unsigned long TIEMPO_ENCENDIDO_1 = 180; // 3 minutos
const unsigned long TIEMPO_APAGADO = 420; // 7 minutos
const unsigned long TIEMPO_ENCENDIDO_2 = 120; // 2 minutos
void setup() {
Serial.begin(115200);
// Inicializar pines
pinMode(MOTOR_PIN, OUTPUT);
digitalWrite(MOTOR_PIN, LOW); // Asegurar que empiece apagado
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_RED, OUTPUT);
// Iniciar LCD
lcd.init();
lcd.backlight();
// Iniciar con todo apagado
apagarTodo();
Serial.println("Sistema iniciado - Listo para usar");
}
void apagarTodo() {
sistemaActivo = false;
estadoMotor = false;
digitalWrite(MOTOR_PIN, LOW);
digitalWrite(LED_RED, HIGH); // ROJO ENCENDIDO (OFF)
digitalWrite(LED_GREEN, LOW); // VERDE APAGADO
lcd.noBacklight();
lcd.noDisplay();
Serial.println("Sistema apagado");
}
void encenderSistema() {
sistemaActivo = true;
segundosTotales = 0;
estadoActual = ENCENDIDO_1;
ultimoTiempo = millis();
lcd.display();
lcd.backlight();
digitalWrite(LED_GREEN, HIGH); // VERDE ENCENDIDO (ON)
digitalWrite(LED_RED, LOW); // ROJO APAGADO
actualizarDisplay();
Serial.println("Sistema encendido - Ciclo iniciado");
Serial.println("Motor debería estar ENCENDIDO (Estado ON1)");
}
void actualizarDisplay() {
if (!sistemaActivo) return;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ciclo: ");
switch(estadoActual) {
case ENCENDIDO_1:
lcd.print("ON1 (3min)");
break;
case APAGADO:
lcd.print("OFF (7min)");
break;
case ENCENDIDO_2:
lcd.print("ON2 (2min)");
break;
}
lcd.setCursor(0, 1);
unsigned long minutos = segundosTotales / 60;
unsigned long segundos = segundosTotales % 60;
lcd.print("T: ");
lcd.print(minutos);
lcd.print("m ");
lcd.print(segundos);
lcd.print("s");
}
void actualizarCiclo() {
if (!sistemaActivo) return;
if (millis() - ultimoTiempo >= 1000) {
ultimoTiempo += 1000;
segundosTotales++;
// Reiniciar ciclo cada 12 minutos
if (segundosTotales >= TIEMPO_CICLO) {
segundosTotales = 0;
estadoActual = ENCENDIDO_1;
Serial.println("Ciclo reiniciado - Estado ON1");
}
// Transición entre estados
else if (estadoActual == ENCENDIDO_1 && segundosTotales >= TIEMPO_ENCENDIDO_1) {
estadoActual = APAGADO;
Serial.println("Cambio a estado APAGADO");
}
else if (estadoActual == APAGADO && segundosTotales >= (TIEMPO_ENCENDIDO_1 + TIEMPO_APAGADO)) {
estadoActual = ENCENDIDO_2;
Serial.println("Cambio a estado ENCENDIDO_2");
}
actualizarDisplay();
}
// Control directo del motor basado en el estado actual
bool nuevoEstadoMotor = (estadoActual == ENCENDIDO_1 || estadoActual == ENCENDIDO_2);
if (nuevoEstadoMotor != estadoMotor) {
estadoMotor = nuevoEstadoMotor;
digitalWrite(MOTOR_PIN, estadoMotor ? HIGH : LOW);
Serial.print("Motor cambiado a: ");
Serial.println(estadoMotor ? "ENCENDIDO" : "APAGADO");
}
}
void loop() {
// Control del pulsador
if (digitalRead(BUTTON_PIN) == LOW) {
if (!pulsacionEnProgreso) {
pulsacionEnProgreso = true;
ultimaPulsacion = millis();
}
} else {
if (pulsacionEnProgreso) {
unsigned long duracionPulsacion = millis() - ultimaPulsacion;
if (duracionPulsacion < 3000) {
if (!sistemaActivo) {
encenderSistema();
// Forzar actualización inmediata del motor
estadoMotor = !(estadoActual == ENCENDIDO_1 || estadoActual == ENCENDIDO_2);
actualizarCiclo();
}
} else {
apagarTodo();
}
pulsacionEnProgreso = false;
}
}
// Actualizar ciclo de tiempos
actualizarCiclo();
delay(100);
}