/** * TEST SKETCH 1.4 – GYMAX7219 Modulnummern-Diagnose * * Jedes Modul zeigt seine eigene 0-basierte Index-Nummer (0..7). * Direkte MD_MAX72XX API – kein Parola, keine Zonen. * * Ablauf: * 1. Alle Module zeigen dauerhaft ihre Indexnummer 0–7 * 2. Alle 3 s wird abwechselnd getestet: * a) Alle LEDs EIN (volle Helligkeit → Stromtest) * b) Alle LEDs AUS * c) Jedes Modul zeigt seine Nummer wieder * * Serial Monitor zeigt welcher hw-Typ gerade aktiv ist. * → Nummern richtig/lesbar + Reihenfolge notieren, dann in config.h eintragen. * * Flash: pio run -e test-display --target upload * Monitor: pio device monitor -e test-display */ #include #include #include // ---- Pins ---- #define CS_PIN 5 #define NUM_MOD 8 // ---- Zu testende Hardware-Typen ---- // Kommentiere einen aus und flashe erneut, bis die Zahlen AUFRECHT stehen. // Dann diesen Typ in config.h als DISPLAY_HW_TYPE eintragen. #define HW_TYPE MD_MAX72XX::GENERIC_HW //#define HW_TYPE MD_MAX72XX::FC16_HW //#define HW_TYPE MD_MAX72XX::PAROLA_HW // Lesbare Bezeichnung für Serial (muss zur obigen Wahl passen) #define HW_TYPE_NAME "GENERIC_HW" //#define HW_TYPE_NAME "FC16_HW" //#define HW_TYPE_NAME "PAROLA_HW" MD_MAX72XX mx = MD_MAX72XX(HW_TYPE, CS_PIN, NUM_MOD); // 5-spaltige 7-Segment-ähnliche Ziffern 0–8 (8 Zeilen, Spalten links→rechts) // Jeder Eintrag: 8 Bytes = 8 Pixelzeilen von oben nach unten static const uint8_t DIGIT[9][8] = { // 0 { 0b00111100, 0b01000010, 0b01000010, 0b01000010, 0b01000010, 0b01000010, 0b00111100, 0b00000000 }, // 1 { 0b00010000, 0b00110000, 0b00010000, 0b00010000, 0b00010000, 0b00010000, 0b00111000, 0b00000000 }, // 2 { 0b00111100, 0b01000010, 0b00000010, 0b00001100, 0b00110000, 0b01000000, 0b01111110, 0b00000000 }, // 3 { 0b00111100, 0b01000010, 0b00000010, 0b00011100, 0b00000010, 0b01000010, 0b00111100, 0b00000000 }, // 4 { 0b00001000, 0b00011000, 0b00101000, 0b01001000, 0b01111110, 0b00001000, 0b00001000, 0b00000000 }, // 5 { 0b01111110, 0b01000000, 0b01000000, 0b01111100, 0b00000010, 0b01000010, 0b00111100, 0b00000000 }, // 6 { 0b00111100, 0b01000000, 0b01000000, 0b01111100, 0b01000010, 0b01000010, 0b00111100, 0b00000000 }, // 7 { 0b01111110, 0b00000010, 0b00000100, 0b00001000, 0b00010000, 0b00010000, 0b00010000, 0b00000000 }, // 8 { 0b00111100, 0b01000010, 0b01000010, 0b00111100, 0b01000010, 0b01000010, 0b00111100, 0b00000000 }, }; // Dreht eine 8x8 Bitmap 90° gegen den Uhrzeigersinn // Kompensiert die 90° CW physische Ausrichtung der Module // Formel: new[r][c] = old[c][7-r] // → new_row[r] |= (1<<(7-c)) wenn old_row[c] Bit r gesetzt ist void rotateCCW(const uint8_t src[8], uint8_t dst[8]) { memset(dst, 0, 8); for (uint8_t r = 0; r < 8; r++) { for (uint8_t c = 0; c < 8; c++) { if (src[c] & (1 << r)) { dst[r] |= (1 << (7 - c)); } } } } // Schreibt Ziffer d (0-basiert) in Modul moduleIdx – mit 90° CCW Korrektur void showDigit(uint8_t moduleIdx, uint8_t d) { if (d > 8) d = 8; uint8_t rotated[8]; rotateCCW(DIGIT[d], rotated); for (uint8_t row = 0; row < 8; row++) { mx.setRow(moduleIdx, row, rotated[row]); } } void allLedsOn() { for (uint8_t m=0;m= 4000) { last = millis(); allLedsOff(); delay(100); showAllNumbers(); Serial.println("[LIVE] Module 0–7 angezeigt"); } }