// ==============================
// PINES
// ==============================
const int btnStart1 = 2;
const int btnStart2 = 3;
const int btnStop = 4;
const int bomba1 = 8;
const int bomba2 = 9;
// ==============================
// TIEMPO ANTIRREBOTE (ms)
// ==============================
const unsigned long debounceTime = 50;
// ==============================
// ESTADOS DE BOTONES
// ==============================
bool estadoStart1 = HIGH;
bool estadoStart2 = HIGH;
bool estadoStop = HIGH;
bool lastStart1 = HIGH;
bool lastStart2 = HIGH;
bool lastStop = HIGH;
unsigned long tStart1 = 0;
unsigned long tStart2 = 0;
unsigned long tStop = 0;
// ==============================
// MEMORIA TIPO PLC
// ==============================
bool estadoBomba1 = false;
bool estadoBomba2 = false;
// ==============================
void setup() {
pinMode(btnStart1, INPUT_PULLUP);
pinMode(btnStart2, INPUT_PULLUP);
pinMode(btnStop, INPUT_PULLUP);
pinMode(bomba1, OUTPUT);
pinMode(bomba2, OUTPUT);
digitalWrite(bomba1, LOW);
digitalWrite(bomba2, LOW);
}
// ==============================
void loop() {
leerBotones();
logicaControl();
actualizarSalidas();
}
// ==============================
// ANTIRREBOTE
// ==============================
void leerBotones() {
unsigned long ahora = millis();
// --- START 1 ---
bool lectura1 = digitalRead(btnStart1);
if (lectura1 != lastStart1) {
tStart1 = ahora;
}
if ((ahora - tStart1) > debounceTime) {
estadoStart1 = lectura1;
}
lastStart1 = lectura1;
// --- START 2 ---
bool lectura2 = digitalRead(btnStart2);
if (lectura2 != lastStart2) {
tStart2 = ahora;
}
if ((ahora - tStart2) > debounceTime) {
estadoStart2 = lectura2;
}
lastStart2 = lectura2;
// --- STOP ---
bool lecturaS = digitalRead(btnStop);
if (lecturaS != lastStop) {
tStop = ahora;
}
if ((ahora - tStop) > debounceTime) {
estadoStop = lecturaS;
}
lastStop = lecturaS;
}
// ==============================
// LÓGICA DE CONTROL
// ==============================
void logicaControl() {
bool start1 = (estadoStart1 == LOW);
bool start2 = (estadoStart2 == LOW);
bool stop = (estadoStop == LOW);
// STOP GENERAL (PRIORIDAD)
if (stop) {
estadoBomba1 = false;
estadoBomba2 = false;
return;
}
// START BOMBA 1 (interlock)
if (start1 && !estadoBomba2) {
estadoBomba1 = true;
estadoBomba2 = false;
}
// START BOMBA 2 (interlock)
if (start2 && !estadoBomba1) {
estadoBomba2 = true;
estadoBomba1 = false;
}
}
// ==============================
void actualizarSalidas() {
digitalWrite(bomba1, estadoBomba1);
digitalWrite(bomba2, estadoBomba2);
}