// Se definen los pins de la tarjeta ESP32 a los que se han cambleado
// cada uno de los segmentos del Display LED de 7 segmentos, incluido el punto
const int segmentPins[] = {12, 13, 14, 15, 16, 17, 18, 19}; // A, B, C, D, E, F, G, DP
// Mapa de los números a segmentos (cátodo común)
// Incluimos una fila por la configuración de los segmentos para representar cada número,
// el punto (DP), y para el display con todos los segmentos apagados (Reset).
const int numMap[12][8] = {
{1, 1, 1, 1, 1, 1, 0, 0}, // 0
{0, 1, 1, 0, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1, 0}, // 2
{1, 1, 1, 1, 0, 0, 1, 0}, // 3
{0, 1, 1, 0, 0, 1, 1, 0}, // 4
{1, 0, 1, 1, 0, 1, 1, 0}, // 5
{1, 0, 1, 1, 1, 1, 1, 0}, // 6
{1, 1, 1, 0, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1, 0}, // 8
{1, 1, 1, 1, 0, 1, 1, 0}, // 9
{0, 0, 0, 0, 0, 0, 0, 1}, // . (con DP)
{0, 0, 0, 0, 0, 0, 0, 0} // Reset / Blanco
};
// Se configuran los pines de los segmentos del display como salidas
void setup() {
// Configurar los pines de los segmentos como salidas
for (int i = 0; i < 8; i++) {
pinMode(segmentPins[i], OUTPUT);
}
}
// Función para convertir letra a su posición en el alfabeto
int letterToNumber(char letter) {
return (int)letter - 64; // Convierte la 'A' a 1, 'B' a 2, ..., 'Z' a 26
}
// Función para descomponer nombre en dígitos
//Toma un nombre y lo descompone en dígitos individuales correspondientes a la posición
//de cada letra en el alfabeto. Los dígitos se almacenan en el array digits y
//el número total de dígitos se almacena en numDigits.
void decomposeName(const char* name, int* digits, int& numDigits) {
numDigits = 0;
for (int i = 0; name[i] != '\0'; i++) {
int letterNumber = letterToNumber(name[i]);
if (letterNumber >= 10) {
digits[numDigits++] = letterNumber / 10; // Decenas
}
digits[numDigits++] = letterNumber % 10; // Unidades
}
}
//Se define una función para recorrer en bucle el valor que debe tomar
//cada segmento (0 o 1), según el mapa de la letra que toca representar.
void displayNumber(int num) {
for (int i = 0; i < 8; i++) {
digitalWrite(segmentPins[i], numMap[num][i]);
}
}
// función principal que se ejecuta
void loop() {
//Declaramos las variables que se van a utilizar durante toda la ejecución.
const char* name = "MARIA"; // Nombre a mostrar en el display 1,3,1,1,8,9,1
// M = 13
// A = 1
// R = 18
// I = 9
// A = 1
int numDigits; // Número de dígitos descompuestos
int digits[40]; // Para almacenar los dígitos descompuestos
//Llamamos a la función que descompone el nombre de la variable "name" en la cadena
//de caracteres numéricos según su posición en el alfabeto. Y devolverá el array
//digits[] con la posición y secuencia de números a mostrar en el display,
//y el numDigits de elementos del array.
decomposeName(name, digits, numDigits);
// Mostrar cada dígito de la secuencia con un retraso de 1 segundo
// Mostramos además el punto del display cada vez que se produce el cambio de un
// número para poder identificar que se hace bien, ya que se pueden llegar a mostrar
// varias veces seguidas el mismo número.
for (int i = 0; i < numDigits; i++) {
displayNumber(10);
displayNumber(digits[i]);
delay(1000);
}
//Paramos la ejecución y dejamos en blanco el display.
while (true){
displayNumber(11);
}
}