48×8 Scrolling LED Matrix mit Arduino – Schritt-für-Schritt Anleitung
Komponenten und Zubehör
| Arduino UNO | × | 1 |
| 74HC595 8-Bit Shift Register | × | 7 |
| Widerstand 475 Ω | × | 56 |
| Male Header 40-polig (1 Reihe, 0,1″) | × | 2 |
| Female Header 8-polig (1 Reihe, 0,1″) | × | 21 |
| Universal-Lochrasterplatine 6″×4″ | × | 4 |
| 8×8 LED Matrix (gemeinsame Kathode) | × | 6 |
| BC548 Transistor | × | 1 |
Benötigte Werkzeuge
- Lötkolben
- Heißklebepistole
- Digitalmultimeter (z. B. Mastech MS8217)
Apps und Online-Dienste
- Arduino IDE
Über dieses Projekt
Hallo zusammen!
Dieses Projekt zeigt den Bau einer 48×8 programmierbaren Scrolling-LED-Matrix mit Arduino UNO und 74HC595 Shift-Registern. Meine erste Arduino-Herausforderung (Lehrer-Auftrag) – ohne Vorwissen (nicht mal LED blinken). Mit Geduld & Verständnis auch für Einsteiger machbar.
Einzige Referenz: Schaltplan aus dem Internet. Recherche zu Shift-Registern & Multiplexing.
Die Schaltung
Ein 8×8 Modul beherrschen → Spalten-Steuerung replizieren & erweitern. Pro 8 Spalten (1 Modul) 1 weiteres 74HC595. Zeilen-Steuerung bleibt 1 Register. Kein Spalten-Limit.
Bauteile beschaffen
Prototyp bauen
Lötphase
Zeilen- & Spaltensteuerung auf separaten Lochrasterplatinen, per Drähten & Headern verbunden.
Erfolgreiches 8×8 Modul → weitere Shift-Register für Spalten anketten (gemeinsamer Clock). Zeilen: nur 1 Register. Unbegrenzt erweiterbar.
Zweite Hälfte bauen
Gehäuse: Ohne 3D-Drucker beim Schreiner fertigen lassen – wurde größer als geplant. Besser: Fusion 360 designen & 3D-drucken. Bohrungen für USB/Strom.
Der Code
Code in Anhängen. Prinzip: Zeilen scannen, Spalten mit Logikpegeln füllen. Code bestimmt Scrollgeschwindigkeit & Text. Standard: Rechts-nach-Links, andere Richtungen per Modifikation möglich.
Arduino Code für 48×8 LED Matrix
/*////////////////////////////////////////////////////////////////////////////////
* Arduino code to display scrolling characters on 6 or more 8x8 LED matrix.
* Number of matrices adjustable with small code change.
* Comments in each statement for editing.
* Coded by Prasanth K S | Contact: kksjunior@hotmail.com
*////////////////////////////////////////////////////////////////////////////////
char msg[] = "WELCOME WIZ"; // Text hier ändern
int scrollspeed = 5; // Scrollgeschwindigkeit (niedriger = schneller)
int x, y;
// Spalten-Pins (74HC595 Kette)
int clockPin1 = 2;
int latchPin1 = 3;
int dataPin1 = 4;
// Zeilen-Pins (einzelnes 74HC595)
int clockPin2 = 5;
int latchPin2 = 6;
int dataPin2 = 7;
// BITMAP: 8 Zeilen, 7 Zonen (6 Matrizen + 1 Reserve)
byte bitmap[8][7];
int numZones = sizeof(bitmap) / 8;
int maxZoneIndex = numZones - 1;
int numCols = numZones * 8;
// Font Definition (5x7 + 2 Spalten Abstand)
byte alphabets[][8] = {
{0,0,0,0,0}, // @ = SPACE
{31, 36, 68, 36, 31}, // A
{127, 73, 73, 73, 54}, // B
{62, 65, 65, 65, 34}, // C
{127, 65, 65, 34, 28}, // D
{127, 73, 73, 65, 65}, // E
{127, 72, 72, 72, 64}, // F
{62, 65, 65, 69, 38}, // G
{127, 8, 8, 8, 127}, // H
{0, 65, 127, 65, 0}, // I
{2, 1, 1, 1, 126}, // J
{127, 8, 20, 34, 65}, // K
{127, 1, 1, 1, 1}, // L
{127, 32, 16, 32, 127}, // M
{127, 32, 16, 8, 127}, // N
{62, 65, 65, 65, 62}, // O
{127, 72, 72, 72, 48}, // P
{62, 65, 69, 66, 61}, // Q
{127, 72, 76, 74, 49}, // R
{50, 73, 73, 73, 38}, // S
{64, 64, 127, 64, 64}, // T
{126, 1, 1, 1, 126}, // U
{124, 2, 1, 2, 124}, // V
{126, 1, 6, 1, 126}, // W
{99, 20, 8, 20, 99}, // X
{96, 16, 15, 16, 96}, // Y
{67, 69, 73, 81, 97} // Z
};
void setup() {
pinMode(latchPin1, OUTPUT); pinMode(clockPin1, OUTPUT); pinMode(dataPin1, OUTPUT);
pinMode(latchPin2, OUTPUT); pinMode(clockPin2, OUTPUT); pinMode(dataPin2, OUTPUT);
// Bitmap leeren
for (int row = 0; row < 8; row++)
for (int zone = 0; zone <= maxZoneIndex; zone++)
bitmap[row][zone] = 0;
}
// Display refreshen (Multiplexing)
void RefreshDisplay() {
for (int row = 0; row < 8; row++) {
int rowbit = 1 << row;
digitalWrite(latchPin2, LOW);
shiftOut(dataPin2, clockPin2, MSBFIRST, rowbit);
digitalWrite(latchPin1, LOW);
for (int zone = maxZoneIndex; zone >= 0; zone--)
shiftOut(dataPin1, clockPin1, MSBFIRST, bitmap[row][zone]);
digitalWrite(latchPin1, HIGH);
digitalWrite(latchPin2, HIGH);
delayMicroseconds(300);
}
}
// Pixel setzen/löschen
void Plot(int col, int row, bool isOn) {
int zone = col / 8;
int colBitIndex = col % 8;
byte colBit = 1 << colBitIndex;
if (isOn) bitmap[row][zone] |= colBit;
else bitmap[row][zone] &= ~colBit;
}
// Nachricht verarbeiten & scrollen
void XProcess() {
for (int charIndex = 0; charIndex < (sizeof(msg) - 1); charIndex++) {
int alphabetIndex = msg[charIndex] - '@';
if (alphabetIndex < 0) alphabetIndex = 0;
// Jedes Zeichen: 5 Spalten + 2 Spalten Abstand = 7 Spalten
for (int col = 0; col < 7; col++) {
for (int row = 0; row < 8; row++) {
bool isOn = 0;
if (col < 5) isOn = bitRead(alphabets[alphabetIndex][col], 7 - row) == 1;
Plot(numCols - 1, row, isOn); // Rechts zeichnen, Shift scrollt links
}
for (int refreshCount = 0; refreshCount < scrollspeed; refreshCount++)
RefreshDisplay();
// Bitmap 1 Spalte nach links shiften
for (int row = 0; row < 8; row++) {
for (int zone = 0; zone < numZones; zone++) {
bitmap[row][zone] >>= 1;
if (zone < maxZoneIndex)
bitWrite(bitmap[row][zone], 7, bitRead(bitmap[row][zone + 1], 0));
}
}
}
}
}
void loop() {
XProcess();
}
Schaltplan (Referenz)
Danke! :)
Herstellungsprozess
- Monitor-Ambilight selbst bauen mit Arduino Nano & WS2812B LEDs
- LED per Bluetooth mit Arduino steuern – Einfache DIY-Anleitung
- Interaktive LED-Matrix Tür-Anzeige mit PIR-Bewegungssensor – Arduino Feiertagsgruß
- Intelligenten Arduino-Vierbeiner-Roboter bauen: Schritt-für-Schritt-Anleitung
- Stufenlose LED-Helligkeitssteuerung mit Bolt IoT und Arduino UNO
- Arduino Flip Clock mit 8×8 LED-Matrix – DIY Echtzeituhr-Projekt
- Arduino RGB-LED-Farbmischer – Einsteigerfreundliches DIY-Projekt
- 8×8 LED-Matrix mit Arduino Uno meistern: Schritt-für-Schritt-Anleitung
- Kompaktes FM-Radio mit Arduino Nano und RDA5807M selbst bauen
- Outdoor DMX-fähige RGB-LED-Fluter – Günstig & Hochleistungsstark