const int SENSOR_PRODUCTO = 4;
const int SENSOR_LIMITE = 5;
const int BOTON_CONTROL = 18;
const int MOTOR = 12;
const int LED_ALARMA = 13;
// Variables para el control de la lógica
enum EstadoBanda {
APAGADO,
MANUAL,
AUTOMATICO,
DETENIDO_POR_LIMITE
};
EstadoBanda estadoActual = APAGADO;
bool controlManual = false;
// Variables para el control de debounce
unsigned long tiempoUltimaPulsacion = 0;
const long INTERVALO_DEBOUNCE = 50; // 50 milisegundos
void setup() {
// Configurar pines de entrada con pull-up interno
pinMode(SENSOR_PRODUCTO, INPUT_PULLUP);
pinMode(SENSOR_LIMITE, INPUT_PULLUP);
pinMode(BOTON_CONTROL, INPUT_PULLUP);
// Configurar pines de salida
pinMode(MOTOR, OUTPUT);
pinMode(LED_ALARMA, OUTPUT);
// Inicializar salidas
digitalWrite(MOTOR, LOW);
digitalWrite(LED_ALARMA, LOW);
Serial.begin(115200);
Serial.println("Banda transportadora lista.");
Serial.println("Presione el boton de control para encender/apagar manualmente.");
}
void loop() {
// Leer el estado de las entradas
bool productoDetectado = (digitalRead(SENSOR_PRODUCTO) == LOW);
bool limiteAlcanzado = (digitalRead(SENSOR_LIMITE) == LOW);
bool botonControlPresionado = (digitalRead(BOTON_CONTROL) == LOW);
// Lógica para el botón de control manual (flanco de bajada)
if (botonControlPresionado && millis() - tiempoUltimaPulsacion > INTERVALO_DEBOUNCE) {
controlManual = !controlManual; // Invertir el estado manual
tiempoUltimaPulsacion = millis();
Serial.print("Modo manual: ");
Serial.println(controlManual ? "ENCENDIDO" : "APAGADO");
}
// Máquina de estados
switch (estadoActual) {
case APAGADO:
digitalWrite(MOTOR, LOW);
digitalWrite(LED_ALARMA, LOW);
if (controlManual) {
estadoActual = MANUAL;
} else if (productoDetectado) {
estadoActual = AUTOMATICO;
}
break;
case MANUAL:
digitalWrite(MOTOR, HIGH);
digitalWrite(LED_ALARMA, LOW);
if (!controlManual) {
estadoActual = APAGADO;
}
break;
case AUTOMATICO:
if (limiteAlcanzado) {
estadoActual = DETENIDO_POR_LIMITE;
Serial.println("Objeto detectado en el limite. Banda detenida.");
} else if (!productoDetectado) {
digitalWrite(MOTOR, LOW);
estadoActual = APAGADO;
} else {
digitalWrite(MOTOR, HIGH);
digitalWrite(LED_ALARMA, LOW);
}
break;
case DETENIDO_POR_LIMITE:
digitalWrite(MOTOR, LOW);
digitalWrite(LED_ALARMA, HIGH);
if (!limiteAlcanzado) {
estadoActual = APAGADO;
Serial.println("Objeto retirado. Sistema listo.");
}
break;
}
}