#include <Adafruit_NeoPixel.h>
#define PIN 9
#define NUM_LEDS 112 // 2 dígitos × 56 LEDs
Adafruit_NeoPixel strip(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
// Devuelve el índice base del dígito (0 = izquierda, 1 = derecha)
int digitBase(int digit) {
// digit = 0 → izquierda (MSD)
// digit = 1 → derecha (LSD)
return digit * 56;
}
// Enciende un segmento (A..G) de un dígito concreto
void setSegment(int digit, char seg, uint32_t color) {
int base = digitBase(digit);
int offset = 0;
switch (seg) {
case 'A': offset = 0; break; // A: base + 0..7
case 'B': offset = 8; break; // B: base + 8..15
case 'C': offset = 16; break; // C: base + 16..23
case 'D': offset = 24; break; // D: base + 24..31
case 'E': offset = 32; break; // E: base + 32..39
case 'F': offset = 40; break; // F: base + 40..47
case 'G': offset = 48; break; // G: base + 48..55
}
for (int i = 0; i < 8; i++) {
strip.setPixelColor(base + offset + i, color);
}
}
// Dibuja un dígito (0–9) en un dígito concreto (0 = izquierda, 1 = derecha)
void drawDigit(int digit, int n, uint32_t color) {
switch (n) {
case 0: setSegment(digit,'A',color); setSegment(digit,'B',color); setSegment(digit,'C',color);
setSegment(digit,'D',color); setSegment(digit,'E',color); setSegment(digit,'F',color); break;
case 1: setSegment(digit,'B',color); setSegment(digit,'C',color); break;
case 2: setSegment(digit,'A',color); setSegment(digit,'B',color); setSegment(digit,'G',color);
setSegment(digit,'E',color); setSegment(digit,'D',color); break;
case 3: setSegment(digit,'A',color); setSegment(digit,'B',color); setSegment(digit,'C',color);
setSegment(digit,'D',color); setSegment(digit,'G',color); break;
case 4: setSegment(digit,'F',color); setSegment(digit,'G',color); setSegment(digit,'B',color);
setSegment(digit,'C',color); break;
case 5: setSegment(digit,'A',color); setSegment(digit,'F',color); setSegment(digit,'G',color);
setSegment(digit,'C',color); setSegment(digit,'D',color); break;
case 6: setSegment(digit,'A',color); setSegment(digit,'F',color); setSegment(digit,'E',color);
setSegment(digit,'D',color); setSegment(digit,'C',color); setSegment(digit,'G',color); break;
case 7: setSegment(digit,'A',color); setSegment(digit,'B',color); setSegment(digit,'C',color); break;
case 8: setSegment(digit,'A',color); setSegment(digit,'B',color); setSegment(digit,'C',color);
setSegment(digit,'D',color); setSegment(digit,'E',color); setSegment(digit,'F',color); setSegment(digit,'G',color); break;
case 9: setSegment(digit,'A',color); setSegment(digit,'B',color); setSegment(digit,'C',color);
setSegment(digit,'D',color); setSegment(digit,'F',color); setSegment(digit,'G',color); break;
}
}
// Muestra un número de 0 a 99
void showNumber(int num, uint32_t color) {
if (num < 0) num = 0;
if (num > 99) num = 99;
int tens = num / 10;
int ones = num % 10;
strip.clear();
// dígito 0 = izquierda (más significativo)
// dígito 1 = derecha (menos significativo)
drawDigit(0, tens, color);
drawDigit(1, ones, color);
strip.show();
}
void setup() {
strip.begin();
strip.show();
}
void loop() {
for (int n = 0; n <= 99; n++) {
showNumber(n, strip.Color(255, 0, 0));
delay(300);
}
}