// Pines para segmentos del display
const int segA = D2;
const int segB = D3;
const int segC = D4;
const int segD = D5;
const int segE = D6;
const int segF = D7;
const int segG = D8;
const int boton = D9;
// Mapa de segmentos para dígitos 0–9 (ánodo común)
byte segmentMap[10] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
int digitos[40];
int total = 0;
int paso = 0;
unsigned long tAnterior = 0;
bool mostrarSecuencia = false;
bool modoDado = false;
// Antirrebote
bool botonPresionado = false;
int estadoAnterior = HIGH;
unsigned long ultimoCambio = 0;
const unsigned long debounceDelay = 50;
void mostrarDigito(int d) {
if (d < 0 || d > 9) return;
byte s = segmentMap[d];
digitalWrite(segA, !bitRead(s, 0));
digitalWrite(segB, !bitRead(s, 1));
digitalWrite(segC, !bitRead(s, 2));
digitalWrite(segD, !bitRead(s, 3));
digitalWrite(segE, !bitRead(s, 4));
digitalWrite(segF, !bitRead(s, 5));
digitalWrite(segG, !bitRead(s, 6));
}
int letraAPosicion(char c) {
c = toupper(c);
if (c >= 'A' && c <= 'Z') return c - 'A' + 1;
return 0;
}
void descomponer(int valor) {
if (valor >= 10) {
digitos[total++] = valor / 10;
digitos[total++] = valor % 10;
} else {
digitos[total++] = valor;
}
}
void setup() {
Serial.begin(9600);
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
pinMode(boton, INPUT_PULLUP);
Serial.println("=== MENÚ STM32 ===");
Serial.println("A: Ingresar nombre y mostrar secuencia");
Serial.println("B: Activar modo dado digital (1–6)");
Serial.println("Ingrese opción:");
// Verificación inicial del display
Serial.println("Prueba de encendido: mostrando 8");
mostrarDigito(8);
delay(2000);
mostrarDigito(0); // limpiar
// Verificación de todos los dígitos
Serial.println("Verificando dígitos del 0 al 9:");
for (int i = 0; i < 10; i++) {
Serial.print("Mostrando dígito: ");
Serial.println(i);
mostrarDigito(i);
delay(1000);
}
mostrarDigito(0); // limpiar al final
}
void loop() {
// Entrada serial
if (Serial.available()) {
String entrada = Serial.readStringUntil('\n');
entrada.trim();
if (entrada == "A" || entrada == "a") {
Serial.println("Opción A seleccionada.");
Serial.println("Digite su nombre (solo letras):");
while (!Serial.available());
String nombre = Serial.readStringUntil('\n');
nombre.trim();
total = 0;
Serial.println("Procesando nombre: " + nombre);
for (int i = 0; i < nombre.length(); i++) {
int pos = letraAPosicion(nombre.charAt(i));
if (pos > 0) {
Serial.print(nombre.charAt(i));
Serial.print(" = ");
Serial.println(pos);
descomponer(pos);
}
}
Serial.print("Secuencia final: ");
for (int i = 0; i < total; i++) {
Serial.print(digitos[i]);
Serial.print(" ");
}
Serial.println();
paso = 0;
tAnterior = millis();
mostrarSecuencia = true;
}
else if (entrada == "B" || entrada == "b") {
Serial.println("Opción B seleccionada: Dado digital activado.");
modoDado = true;
}
else {
Serial.println("Entrada inválida. Use A o B.");
}
}
// Mostrar secuencia del nombre
if (mostrarSecuencia && millis() - tAnterior >= 1000) {
if (paso < total) {
Serial.print("Mostrando: ");
Serial.println(digitos[paso]);
mostrarDigito(digitos[paso]);
paso++;
tAnterior = millis();
} else {
mostrarSecuencia = false;
Serial.println("Fin de la secuencia.");
mostrarDigito(0); // limpiar
}
}
// Antirrebote para botón (modo dado)
if (modoDado) {
int estadoActual = digitalRead(boton);
if (estadoActual != estadoAnterior) {
ultimoCambio = millis();
estadoAnterior = estadoActual;
}
if ((millis() - ultimoCambio) > debounceDelay && estadoActual == LOW && !botonPresionado) {
botonPresionado = true;
int dado = random(1, 7);
Serial.println("Botón presionado.");
Serial.print("Número del dado: ");
Serial.println(dado);
mostrarDigito(dado);
}
if (estadoActual == HIGH) {
botonPresionado = false;
}
}
}