Control de 9 LEDs con lógica OR (Pulsadores en pines 28-22 y Teclas 1-4 en pines 31-37)
O[] = { 13, 12, 11, 10, 9, 8, 7, 6, 5 }
I[] = { 28, 26, 24, 22 }
K[] = { 31, 33, 35, 37 }
// Salidas: 9 LEDs (Pines 13 al 5)
const int O[] = { 13, 12, 11, 10, 9, 8, 7, 6, 5 };
const int nO = 9;
// Entradas Pulsadores (Práctica 2)
const int PIN_BTN1 = 28; // Modo 1: Encender todos
const int PIN_BTN2 = 26; // Modo 2: Apagar todos
const int PIN_BTN3 = 24; // Modo 3: Secuencia acumulativa
const int PIN_BTN4 = 22; // Modo 4: Secuencia corrimiento
const int I[] = { 28, 26, 24, 22 };
const int nI = 4;
// Entradas Teclado Matricial (Práctica 3)
const int PIN_KEY1 = 31; // Tecla 1 -> Modo 1
const int PIN_KEY2 = 33; // Tecla 2 -> Modo 2
const int PIN_KEY3 = 35; // Tecla 3 -> Modo 3
const int PIN_KEY4 = 37; // Tecla 4 -> Modo 4
const int K[] = { 31, 33, 35, 37 };
const int nK = 4;
const unsigned long RETARDO_MS = 200; // 200 ms constante
int modoActual = 0;
void setup() {
Serial.begin(9600);
for (int i = 0; i < nO; i++) {
pinMode(O[i], OUTPUT);
digitalWrite(O[i], LOW);
}
for (int i = 0; i < nI; i++) pinMode(I[i], INPUT);
for (int i = 0; i < nK; i++) pinMode(K[i], INPUT);
}
void loop() {
// Lógica OR: respuesta a pulsador O tecla de teclado
if (digitalRead(PIN_BTN1) == HIGH || digitalRead(PIN_KEY1) == HIGH) modoActual = 1;
else if (digitalRead(PIN_BTN2) == HIGH || digitalRead(PIN_KEY2) == HIGH) modoActual = 2;
else if (digitalRead(PIN_BTN3) == HIGH || digitalRead(PIN_KEY3) == HIGH) modoActual = 3;
else if (digitalRead(PIN_BTN4) == HIGH || digitalRead(PIN_KEY4) == HIGH) modoActual = 4;
switch (modoActual) {
case 1: encenderTodos(); break;
case 2: apagarTodos(); break;
case 3: secuencia3(); break;
case 4: secuencia4(); break;
default: apagarTodos(); break;
}
}
void encenderTodos() {
for (int i = 0; i < nO; i++) digitalWrite(O[i], HIGH);
}
void apagarTodos() {
for (int i = 0; i < nO; i++) digitalWrite(O[i], LOW);
}
void secuencia3() {
apagarTodos();
if (esperarConInterrupcion(RETARDO_MS)) return;
for (int i = 0; i < nO; i++) {
digitalWrite(O[i], HIGH);
if (esperarConInterrupcion(RETARDO_MS)) return;
}
if (esperarConInterrupcion(RETARDO_MS)) return;
apagarTodos();
if (esperarConInterrupcion(RETARDO_MS)) return;
}
void secuencia4() {
for (int i = 0; i < nO; i++) {
apagarTodos();
digitalWrite(O[i], HIGH);
if (esperarConInterrupcion(RETARDO_MS)) return;
digitalWrite(O[i], LOW);
}
}
bool esperarConInterrupcion(unsigned long ms) {
unsigned long inicio = millis();
while (millis() - inicio < ms) {
if (digitalRead(PIN_BTN1) == HIGH || digitalRead(PIN_KEY1) == HIGH) { modoActual = 1; return true; }
if (digitalRead(PIN_BTN2) == HIGH || digitalRead(PIN_KEY2) == HIGH) { modoActual = 2; return true; }
if (digitalRead(PIN_BTN3) == HIGH || digitalRead(PIN_KEY3) == HIGH) { modoActual = 3; return true; }
if (digitalRead(PIN_BTN4) == HIGH || digitalRead(PIN_KEY4) == HIGH) { modoActual = 4; return true; }
delay(5);
}
return false;
}