// Definición de pines para cada segmento (A-G)
const int segmentPins[7] = {18, 19, 2, 4, 16, 5, 17};
const int decimalPointPin = 15; // Pin para el punto decimal
// Patrones binarios para mostrar dígitos 0-9 en display 7 segmentos (ánodo común)
const byte digitPatterns[10] = {
0b1000000, // 0
0b1111001, // 1
0b0100100, // 2
0b0110000, // 3
0b0011001, // 4
0b0010010, // 5
0b0000010, // 6
0b1111000, // 7
0b0000000, // 8
0b0010000 // 9
};
// Alfabeto para conversión de letras a números
const char alphabet[27] = {
'A','B','C','D','E','F','G','H','I','J','K',
'L','M','N','Ñ','O','P','Q','R','S','T','U','V',
'W','X','Y','Z'
};
char nameToDisplay[] = "OSCAR"; // Nombre a mostrar
int letterPosition = 0; // Posición en el alfabeto de la letra actual
int currentIndex = 0; // Índice para recorrer el nombre
void setup() {
// Configuración de todos los pines de segmentos como salidas
for (int pin = 0; pin < 7; pin++) {
pinMode(segmentPins[pin], OUTPUT);
}
pinMode(decimalPointPin, OUTPUT); // Configuración del pin del punto decimal como salida
digitalWrite(decimalPointPin, HIGH); // Apagado del punto decimal para el inicio
}
void loop() {
// Verificación de que no se exceda la longitud del nombre
if (currentIndex < sizeof(nameToDisplay) - 1) {
letterPosition = 0; // Reseteo de posición
// Se encuentra la posición de la letra actual en el alfabeto
for (int alphaIndex = 0; alphaIndex < 27; alphaIndex++) {
if (nameToDisplay[currentIndex] == alphabet[alphaIndex]) {
letterPosition = alphaIndex + 1; // A=1, B=2,... Z=27
break;
}
}
// Se muestra el número según su valor
if (letterPosition < 10) {
showDigit(letterPosition); // Muestra unidad para posiciones hasta 9
delay(1000);
}
else if (letterPosition < 20) {
showDigit(1); // Muestra decena (1)
delay(1000);
showDigit(letterPosition - 10); // Muestra unidad para posiciones entre 10 y 19
delay(1000);
}
else {
showDigit(2); // Muestra decena (2)
delay(1000);
showDigit(letterPosition - 20); // Muestra unidad para posiciones a partir de 20
delay(1000);
}
// Se avanza al siguiente carácter, reiniciando al final
currentIndex = (currentIndex + 1) % (sizeof(nameToDisplay) - 1);
// Si currentIndex es 0, se completó el nombre; se apaga el display y se muestra el punto decimal por 1 segundo
if (currentIndex == 0) {
clearDisplay(); // Apagado de todos los segmentos
digitalWrite(decimalPointPin, LOW); // Encendido del punto decimal
delay(1000);
digitalWrite(decimalPointPin, HIGH); // Apagado del punto decimal
}
}
else {
currentIndex = 0; // Reinicio al final del nombre
}
}
// Función para visualización de un dígito en el display
void showDigit(int digitToShow) {
byte segmentMap = digitPatterns[digitToShow];
for (int segment = 0; segment < 7; segment++) {
bool segmentState = bitRead(segmentMap, segment);
digitalWrite(segmentPins[segment], segmentState);
}
}
// Función para apagado de todos los segmentos del display
void clearDisplay() {
for (int segment = 0; segment < 7; segment++) {
digitalWrite(segmentPins[segment], HIGH);
}
}