// 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;
}