// Definición de pines
const int PIN_SENSOR_PRESENCIA = 34; // Sensor 1: detecta presencia de huevos
const int PIN_SENSOR_CALIDAD = 35; // Sensor 2: detecta calidad de huevos
const int PIN_MOTOR_CINTA = 16; // LED Verde - Motor de la cinta transportadora
const int PIN_MOTOR_TUBO = 17; // LED Amarillo - Motor del tubo de succión
const int PIN_SISTEMA_APAGADO = 4; // LED Rojo - Fuera del horio de funcionamiento
// Variables de tiempo
const unsigned long TIEMPO_INACTIVIDAD = 3000; // 6 Segundos en milisegundos
const unsigned long TIEMPO_SUCCION = 2000; // 2 segundos para succión
const unsigned long HORA_EN_MILLIS = 1000; // 1 Segundo = 1 hora simulada
unsigned long ultimaDeteccionHuevo = 0;
unsigned long tiempoInicioSuccion = 0;
unsigned long tiempoInicio;
unsigned long horaActual = 0;
// Variables de estado
bool sistemaEncendido = false;
bool motorCintaActivo = false;
bool tuboProcesando = false;
bool huevoDetectadoCalidad = false;
bool ultimoEstadoSensorCalidad = false; // Para detectar cambios en el sensor de calidad
void setup() {
Serial.begin(115200);
// Configuración de pines
pinMode(PIN_SENSOR_PRESENCIA, INPUT);
pinMode(PIN_SENSOR_CALIDAD, INPUT);
pinMode(PIN_MOTOR_CINTA, OUTPUT);
pinMode(PIN_MOTOR_TUBO, OUTPUT);
pinMode(PIN_SISTEMA_APAGADO, OUTPUT);
// Inicialización de salidas
digitalWrite(PIN_MOTOR_CINTA, LOW);
digitalWrite(PIN_MOTOR_TUBO, LOW);
digitalWrite(PIN_SISTEMA_APAGADO, HIGH);
// Inicializar tiempo (empezamos a las 0:00)
tiempoInicio = millis();
Serial.println("Sistema iniciado. Comenzando en hora 0:00");
}
void loop() {
unsigned long tiempoActual = millis();
// Actualizar hora simulada (cada 1 segundos = 1 hora)
horaActual = ((tiempoActual - tiempoInicio) / HORA_EN_MILLIS) % 24;
// Mostrar hora actual cada vez que cambie
static unsigned long ultimaHora = 0;
if (horaActual != ultimaHora) {
Serial.print("Hora actual: ");
Serial.println(horaActual);
ultimaHora = horaActual;
}
// Paso 1: Encendido automático a las 7 AM
if (horaActual >= 7) {
if (!sistemaEncendido) {
sistemaEncendido = true;
Serial.println("Sistema encendido - 7:00 AM");
digitalWrite(PIN_SISTEMA_APAGADO, LOW);
}
} else if (sistemaEncendido) {
sistemaEncendido = false;
apagarSistema();
}
if (sistemaEncendido) {
// Paso 2: Detección de huevo y activación de cinta
bool hayHuevo = digitalRead(PIN_SENSOR_PRESENCIA) == HIGH;
// Control del motor de la cinta basado en la presencia de huevo
if (hayHuevo) {
ultimaDeteccionHuevo = tiempoActual;
digitalWrite(PIN_MOTOR_CINTA, HIGH);
if (!motorCintaActivo) {
Serial.println("Cinta activada - Huevo detectado");
motorCintaActivo = true;
}
} else {
digitalWrite(PIN_MOTOR_CINTA, LOW);
if (motorCintaActivo) {
Serial.println("Cinta desactivada - No hay huevo");
motorCintaActivo = false;
}
}
// Paso 3: Detección de calidad y succión
bool huevoMalEstado = digitalRead(PIN_SENSOR_CALIDAD) == HIGH;
// Detectar cambio de LOW a HIGH en el sensor de calidad
if (huevoMalEstado && !ultimoEstadoSensorCalidad && !tuboProcesando) {
iniciarSuccion();
digitalWrite(PIN_MOTOR_CINTA, HIGH);
Serial.println("Cinta Reactivada");
}
ultimoEstadoSensorCalidad = huevoMalEstado;
// Control del tiempo de succión
if (tuboProcesando && (tiempoActual - tiempoInicioSuccion >= TIEMPO_SUCCION)) {
detenerSuccion();
}
// Paso 4: Apagado por inactividad
if (tiempoActual - ultimaDeteccionHuevo >= TIEMPO_INACTIVIDAD && hayHuevo) {
apagarComponentes();
}
}
delay(10); // Pequeña pausa para estabilidad
}
void apagarSistema() {
Serial.println("Sistema apagado");
sistemaEncendido = false;
motorCintaActivo = false;
digitalWrite(PIN_MOTOR_CINTA, LOW);
digitalWrite(PIN_MOTOR_TUBO, LOW);
digitalWrite(PIN_SISTEMA_APAGADO, HIGH);
tuboProcesando = false;
}
void iniciarSuccion() {
Serial.println("Iniciando succión - Huevo en mal estado");
digitalWrite(PIN_MOTOR_CINTA, LOW);
Serial.println("Cinta desactivada");
tuboProcesando = true;
tiempoInicioSuccion = millis();
digitalWrite(PIN_MOTOR_TUBO, HIGH);
delay(2000);
}
void detenerSuccion() {
Serial.println("Succión completada");
tuboProcesando = false;
digitalWrite(PIN_MOTOR_TUBO, LOW);
}
void apagarComponentes(){
Serial.println("Sistema En Suspenso");
motorCintaActivo = false;
digitalWrite(PIN_MOTOR_CINTA, LOW);
digitalWrite(PIN_MOTOR_TUBO, LOW);
tuboProcesando = false;
}