Bluetooth-fähige 8x8 LED-Matrix mit Scrolltext – Arduino-Projekt
Komponenten und Zubehör
| Arduino Nano R3 | × | 1 |
| HC-05 Bluetooth Modul | × | 1 |
| 8x8 LED Matrix Modul mit MAX7219 | × | 7 |
| 6,8 kOhm Widerstand | × | 1 |
| 2,2 kOhm Widerstand | × | 2 |
Benötigte Werkzeuge und Maschinen
- Lötkolben (allgemein)
Apps und Online-Dienste
- Arduino IDE
- Bluetooth SPP Pro (Android-App, nicht mehr im Play Store, Download via Uptodown)
Über dieses Projekt
Nach mehreren Versuchen, Scrolltext auf einer 8x8-Matrix darzustellen, fand ich die umfassendste Anleitung auf Embedded Lab: Portable Bluetooth Enabled Scrolling LED Matrix Display.
Das Gerät besteht aus Arduino Nano, Bluetooth-Modul für Smartphone-Datenempfang und 8x8 LED-Matrizen mit MAX7219-Treiber.
Anders als im Original nutze ich fertige 8x8-Matrix-Module mit MAX7219 (günstig auf eBay/AliExpress). Ich hatte nur 7 Module, daher Code-Anpassung. Die Android-App „Bluetooth SPP Pro“ ist nicht mehr im Play Store, Download: Uptodown. Sie steuert Scrollgeschwindigkeit, Helligkeit, Pause, Text löschen und vordefinierte Text-Buttons.
Das Gerät wurde in ein Gehäuse aus PVC-Material mit schwarzer Folie eingebaut.
Verwendete Arduino Libraries:
Code
Code (Arduino)
/* Hier sind die Befehle, die Arduino erkennt.
1. Jeder Zeichenstrom muss in Klammern gesendet werden. Beispiel: "(Hello! How are you?)"
Bei '(' erkennt Arduino Anzeigedaten bis ')' – Scroll von rechts nach links.
2. Helligkeit: '/+' erhöht, '/-' verringert (16 Stufen).
3. Scrollgeschwindigkeit: '/>' langsamer, '/<' schneller.
4. '/p' pausiert Scrollen. Erneutes Senden setzt fort.
5. '/e' löscht Puffer und leert Display.
Anschlüsse:
Easy Matrix Arduino
VCC +5V
DIN MOSI (Pin 11)
LOAD pinCS (im Code definiert)
CLK SCK (Pin 13)
GND Gnd
UART: 9600 Baud.
Autor: Rajendra Bhatt, admin@embedded-lab.com
Produktlink: https://embedded-lab.com/blog/?p=9186
*/
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
int pinCS = 10;
int numberOfHorizontalDisplays = 7;
int numberOfVerticalDisplays = 1;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
int scrollspeed = 100;
int spacer = 1;
int width = 5 + spacer;
boolean inChar = false, NewData = false, pause = false;
boolean dataAvailable = false;
char inputString[512];
int count = 0, BTvalue = 5;
void setup() {
matrix.setIntensity(1);
matrix.setPosition(0, 0, 0);
matrix.setPosition(1, 1, 0);
matrix.setPosition(2, 2, 0);
matrix.setPosition(3, 3, 0);
matrix.setPosition(4, 4, 0);
matrix.setPosition(5, 5, 0);
matrix.setPosition(6, 6, 0);
matrix.fillScreen(0);
matrix.write();
Serial.begin(9600);
pinMode(2, INPUT);
digitalWrite(2, LOW);
attachInterrupt(0, serialInterrupt, CHANGE);
}
void loop() {
if (dataAvailable) display_data();
}
void display_data() {
for (int i = 0; i < width * count + matrix.width() - 1 - spacer; i++) {
matrix.fillScreen(0);
int letter = i / width;
int x = (matrix.width() - 1) - i % width;
int y = (matrix.height() - 8) / 2;
while (x + width - spacer >= 0 && letter >= 0) {
if (letter < count) {
matrix.drawChar(x, y, inputString[letter], HIGH, LOW, 1);
}
letter--;
x -= width;
}
matrix.write();
if (!dataAvailable) {
i = width * count + matrix.width() - 1 - spacer;
matrix.fillScreen(LOW);
matrix.write();
}
if (NewData) {
i = 0;
matrix.fillScreen(LOW);
matrix.write();
NewData = false;
}
while (pause == true) delay(0);
delay(scrollspeed);
}
}
volatile boolean inService = false;
void serialInterrupt() {
if (inService) return;
inService = true;
interrupts();
while (!Serial.available());
while (Serial.available()) {
char ch = Serial.read();
if (ch == '(') {
count = 0;
inChar = true;
while (inChar) {
if (Serial.available()) {
ch = Serial.read();
if (ch == ')') {
inChar = false;
dataAvailable = true;
} else {
inputString[count] = ch;
count++;
}
if (count > 0) NewData = true;
}
}
}
if (ch == '/') {
inChar = true;
while (inChar) {
if (Serial.available()) {
ch = Serial.read();
if (ch == '+') { if (BTvalue < 15) { BTvalue++; matrix.setIntensity(BTvalue); } break; }
if (ch == '-') { if (BTvalue > 0) { BTvalue--; matrix.setIntensity(BTvalue); } break; }
if (ch == '>') { if (scrollspeed < 200) scrollspeed += 20; break; }
if (ch == '<') { if (scrollspeed > 10) scrollspeed -= 10; break; }
if (ch == 'e') { dataAvailable = false; break; }
if (ch == 'p') { pause = !pause; break; }
else break;
}
}
}
}
inService = false;
}
Schaltpläne
Herstellungsprozess
- Smartes Sparschwein: Münzprüfer mit Arduino Nano steuern
- 24×16 LED Pong-Konsole mit Arduino Nano & MAX7219 bauen
- LED per Bluetooth mit Arduino steuern – Einfache DIY-Anleitung
- Bluetooth Text-Teleporter: Arduino + Android Projekt
- Sprachgesteuerte Haushaltsgeräte: Bluetooth-Steuerung mit Google Assistant
- 8×8 LED-Matrix mit Arduino Uno meistern: Schritt-für-Schritt-Anleitung
- Präzise Solareinstrahlungsmessung mit Arduino UNO & Ethernet Shield
- Arduino Uno & Bluetooth: Fernsteuerung eines Autos – Schritt-für-Schritt-Anleitung
- SMS Senden & Empfangen mit GSM SIM900 Shield für Arduino Mega
- Arduino-HID-USV: Dummy-Netzteil per USB zu intelligenter Backup-Stromversorgung aufrüsten