← Volver al Simulador Interactivo 100% C++ Sin Librerías Externas

💻 Código Fuente C++: Práctica 3

Control de 9 LEDs con lógica OR (Pulsadores en pines 28-22 y Teclas 1-4 en pines 31-37)

💡 9 Salidas LEDs: O[] = { 13, 12, 11, 10, 9, 8, 7, 6, 5 }
🔘 4 Pulsadores (Práctica 2): I[] = { 28, 26, 24, 22 }
⌨️ 4 Teclas (Práctica 3): K[] = { 31, 33, 35, 37 }
control_motor_mega.ino 67 líneas
// 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;
}