// === Pines ===
const int filasPines[5] = {2, 3, 4, 5, 6};
const int columnasPines[7] = {7, 8, 9, 10, 11, 12, 14};
const int botonPin = 15;
// === Configuración ===
const unsigned long pollingBase = 100;
const unsigned long intervaloLed = 500;
const unsigned long debounceMs = 50;
// === Variables de estado ===
unsigned long prevTick = 0;
unsigned long acumLed = 0;
int fila = 0;
int columna = 6;
int modoRecorrido = 0; // 0 = horizontal (por filas), 1 = vertical (por columnas)
bool modoInicializado = false;
bool botonEstadoAnterior = HIGH;
bool botonPresionado = false;
unsigned long lastBounceTime = 0;
bool flagReportBoton = false;
bool reportBotonEstado = false;
// === Buffers para texto ===
char rxBuffer[11];
byte rxIndex = 0;
// ==========================================================
// FUNCIONES AUXILIARES
// ==========================================================
void cambiarVocal(char *str) {
for (int i = 0; i < (int)strlen(str); i++) {
switch (str[i]) {
case 'a': case 'A': str[i] = '1'; break;
case 'e': case 'E': str[i] = '2'; break;
case 'i': case 'I': str[i] = '3'; break;
case 'o': case 'O': str[i] = '4'; break;
case 'u': case 'U': str[i] = '5'; break;
}
}
}
void mostrarUnicaColumna(int col) {
for (int i = 0; i < 7; i++) digitalWrite(columnasPines[i], LOW);
digitalWrite(columnasPines[col], HIGH);
}
void mostrarUnicaFila(int fil) {
for (int i = 0; i < 5; i++) digitalWrite(filasPines[i], HIGH);
digitalWrite(filasPines[fil], LOW);
}
// ==========================================================
// ANTIRREBOTE
// ==========================================================
void procesarBoton_polling() {
bool lectura = digitalRead(botonPin);
if (lectura != botonEstadoAnterior && millis() - lastBounceTime >= debounceMs) {
lastBounceTime = millis();
botonEstadoAnterior = lectura;
botonPresionado = (lectura == LOW);
flagReportBoton = true;
reportBotonEstado = botonPresionado;
}
}
// ==========================================================
// MOVER LED (recorridos ajustados a la descripción)
// ==========================================================
void moverLed_polling() {
if (!modoInicializado) {
if (modoRecorrido == 0) { fila = 0; columna = 6; } // Horizontal: fila 0, empieza en derecha
else { fila = 0; columna = 6; } // Vertical: columna 6, empieza arriba
modoInicializado = true;
}
if (botonPresionado) return; // pausa mientras se presiona
acumLed += pollingBase;
if (acumLed < intervaloLed) return;
acumLed = 0;
// === Lógica de avance ===
if (modoRecorrido == 0) {
// === Recorrido horizontal por filas ===
columna--; // ir de derecha a izquierda
if (columna < 0) {
columna = 6; // volver a la derecha
fila++; // pasar a la siguiente fila
if (fila > 4) {
fila = 0; // reiniciar filas
modoRecorrido = 1; // cambiar a recorrido vertical
modoInicializado = false;
}
}
}
else if (modoRecorrido == 1) {
// === Recorrido vertical por columnas ===
fila++; // ir de arriba a abajo
if (fila > 4) {
fila = 0;
columna--; // pasar a la siguiente columna a la izquierda
if (columna < 0) {
columna = 6; // reiniciar columnas
modoRecorrido = 0; // volver al horizontal
modoInicializado = false;
}
}
}
}
// ==========================================================
// SETUP
// ==========================================================
void setup() {
for (int i = 0; i < 5; i++) { pinMode(filasPines[i], OUTPUT); digitalWrite(filasPines[i], HIGH); }
for (int i = 0; i < 7; i++) { pinMode(columnasPines[i], OUTPUT); digitalWrite(columnasPines[i], LOW); }
pinMode(botonPin, INPUT_PULLUP);
Serial.begin(115200);
Serial.println("=== Sistema listo: ingrese una palabra (máx 10 caracteres) ===");
}
// ==========================================================
// LOOP PRINCIPAL (polling 100 ms)
// ==========================================================
void loop() {
unsigned long now = millis();
if (now - prevTick >= pollingBase) {
prevTick = now;
// --- Lectura Serial (palabra) ---
while (Serial.available()) {
char c = Serial.read();
if (c == '\n' || c == '\r') {
rxBuffer[rxIndex] = '\0';
cambiarVocal(rxBuffer);
Serial.print("Resultado: ");
Serial.println(rxBuffer);
rxIndex = 0;
memset(rxBuffer, 0, sizeof(rxBuffer));
} else if (rxIndex < 10) {
rxBuffer[rxIndex++] = c;
}
}
// --- Lógica principal ---
procesarBoton_polling();
moverLed_polling();
// --- Actualizar LED activo ---
mostrarUnicaColumna(columna);
mostrarUnicaFila(fila);
// --- Reportar eventos (solo al presionar/soltar) ---
if (flagReportBoton) {
flagReportBoton = false;
if (reportBotonEstado) {
Serial.print("Pulsado -> Fila: ");
Serial.print(fila);
Serial.print(" | Columna: ");
Serial.println(columna);
} else {
Serial.println("No pulsado");
}
}
}
}