23. Texto en matriz P10 - angelmicelti/Aprendiz-de-Maker GitHub Wiki
Un papá de la comunidad educativa de mi IES me proporcionó una matriz P10, y me dijo: "toma, a ver si eres capaz de echarla a andar, porque yo no he podido".
Pues nada, otro reto. Ni idea de qué es una matriz P10, pero inmediatamente, el SAV, me empuja a buscar.

Para mi exploración he utilizado los vídeos de NetAndino sobre el tema:
Para la ExpoVilladiego de 2025 hice una pequeña programación del panel a partir de los ejemplos citados en los dos vídeos anteriores, instalando las librerías indicadas.
Posteriormente, modificando los ejemplos base, obtuve un sencillo programa en el que:
- Se dibujan varios círculos aleatorios.
- Se introduce un texto animado con la leyenda "ExpoVilladiego 2025" hacia la izquierda.
Las modificaciones de los ejemplos las realicé a través de ChatGPT, en este hilo

#include <SPI.h>
#include <Fuente.h>
#include <TimerOne.h>
#include <fuente16x10.h>
#define NRO_FILAS_DISPLAY 1
#define NRO_COLUMNAS_DISPLAY 1
#define PANEL_WIDTH 32 // ancho total del panel en píxeles
DMD dmd(NRO_FILAS_DISPLAY, NRO_COLUMNAS_DISPLAY);
void ScanDMD() {
dmd.scanDisplayBySPI();
}
void setup() {
Timer1.initialize(3000);
Timer1.attachInterrupt(ScanDMD);
dmd.clearScreen(true);
dmd.selectFont(fuente16x10);
Serial.begin(115200);
}
void loop() {
// 1. Mostrar círculos aleatorios entre 3 y 10
int numCirculos = random(3, 11);
for (int i = 0; i < numCirculos; i++) {
int cx = random(5, 27);
int cy = random(5, 12);
int r = random(1, 7);
for (int j = 0; j < r; j++) {
dmd.clearScreen(true);
dmd.drawCircle(cx, cy, j, GRAPHICS_NORMAL);
delay(100);
}
delay(500);
}
delay(1000); // Pausa antes del scroll
// 2. Scroll del mensaje una sola pasada completa
const char* MSG = "ExpoVilladiego 2025";
int charWidth = 8; // aprox ancho caracter en fuente16x10
int textWidth = strlen(MSG) * charWidth;
int startX = PANEL_WIDTH; // empezar justo fuera a la derecha
int totalSteps = textWidth + PANEL_WIDTH; // pasos para que el texto salga completamente a la izquierda
dmd.clearScreen(true);
dmd.drawMarquee(MSG, strlen(MSG), startX, 0);
for (int step = 0; step < totalSteps; step++) {
dmd.stepMarquee(-1, 0);
delay(75);
}
dmd.clearScreen(true);
delay(1000); // pausa antes de repetir el loop
}


