Bluetooth 8x8 LED-matrix met Scrollende Tekst – Arduino Project
Onderdelen en benodigdheden
| Arduino Nano R3 | × | 1 |
| HC-05 Bluetooth-module | × | 1 |
| 8x8 LED-matrix module met MAX7219 | × | 7 |
| 6,8 kOhm Weerstand | × | 1 |
| 2,2 kOhm Weerstand | × | 2 |
Nodige tools en machines
- Solderbout (standaard)
Apps en online diensten
- Arduino IDE
- Bluetooth SPP Pro
Over dit project
Na verschillende pogingen om scrollende tekst op de 8x8-matrix te maken, vond ik de meest complete handleiding op de Embedded Lab-pagina: Embedded Lab.
Het apparaat bevat een Arduino Nano, Bluetooth-module voor het ontvangen van data van de smartphone en 8x8 LED-matrices aangedreven door MAX7219.
In tegenstelling tot daar, gebruikte ik kant-en-klaar 8x8-matrixmodules met MAX7219-chip die heel goedkoop op eBay of AliExpress te koop zijn. Op dat moment had ik maar 7 modules, dus maakte ik een kleine codewijziging. Een Android-applicatie bestaat niet meer op de Google Play Store, dus je kunt het downloaden van:
Het kan de scrollsnelheid, helderheid van LEDs, pauzeren, tekst wissen, en verschillende vooraf gedefinieerde tekstknoppen bedienen.
Uiteindelijk stopte ik het hele apparaat in een doos, die ik maakte van PVC-materiaal dat ik met zwart behangpapier bekleedde.
Arduino-bibliotheken:
Code
CodeArduino
/* Hier zijn de commando's die Arduino herkent.
1. Elke tekenreeks moet binnen haakjes gestuurd worden.
Voorbeeld: Als je een bericht "Hallo! Hoe gaat het?" wilt tonen,
moet je het als volgt sturen: (Hallo! Hoe gaat het?)
Wanneer Arduino het eerste teken '(' ontvangt, begrijpt het dat de komende tekens
displaydata zijn tot ')' ontvangen wordt. Het bericht wordt gescrold van rechts naar links.
2. Display-intensiteit kan verhoogd of verlaagd worden door /+ of /- te sturen.
Elke keer dat Arduino '/' ontvangt, begrijpt het dat het een commando is.
Het ondersteunt 16 helderheidsniveaus.
3. Op dezelfde manier kan scrollsnelheid verhoogd of verlaagd worden door /< of /> te sturen.
4. /p wordt gebruikt om het scrollende bericht te pauzeren. Opnieuw sturen hervat de scroll.
5. /e wordt gebruikt om de buffer te wissen en het display leeg te maken.
Aansluitingen:
Easy Matrix Arduino
VCC +5V
DIN MOSI (Pin 11)
LOAD pinCS gedefinieerd in onderstaand programma
CLK SCK (Pin 13)
GND Gnd
UART-communicatie gebeurt op 9600 baud.
Geschreven door: Rajendra Bhatt
Contact: admin@embedded-lab.com
Easy Matrix productlink: https://embedded-lab.com/blog/?p=9186 */
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
int pinCS = 10; // CS aan deze pin, DIN aan MOSI en CLK aan SCK (cf https://arduino.cc/en/Reference/SPI)
int numberOfHorizontalDisplays = 7;
int numberOfVerticalDisplays = 1;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
int scrollspeed = 100; // Standaard scrollsnelheid (milliseconden)
int spacer = 1; // Ruimte tussen twee tekens
int width = 5 + spacer; // Font-breedte is 5 pixels
boolean inChar = false, NewData = false, pause = false;
boolean dataAvailable = false;
char inputString[512];
int count = 0, BTvalue = 5;
void setup() {
matrix.setIntensity(1); // Waarde tussen 0 en 15 voor helderheid
// Aanpassen aan eigen behoeften
matrix.setPosition(0, 0, 0); // Eerste display op <0, 7>
matrix.setPosition(1, 1, 0); // Tweede display op <1, 0>
matrix.setPosition(2, 2, 0); // Derde display op <2, 0>
matrix.setPosition(3, 3, 0); // Vierde display op <3, 0>
matrix.setPosition(4, 4, 0); // Vijfde display op <4, 0>
matrix.setPosition(5, 5, 0); // Zesde display op <5, 0>
matrix.setPosition(6, 6, 0); // Zevende display op <6, 0>
// ...
// matrix.setRotation(0, 2); // Eerste display omgekeerd
// matrix.setRotation(3, 2); // Hetzelfde geldt voor laatste display
matrix.fillScreen(0);
matrix.write();
Serial.begin(9600); // Seriële communicatie initialiseren
// Interrupt 0 op digitale pin 2 gebruiken.
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; // Tekst verticaal centreren
while (x + width - spacer >= 0 && letter >= 0) {
if (letter < count) {
matrix.drawChar(x, y, inputString[letter], HIGH, LOW, 1);
}
letter--;
x -= width;
}
matrix.write(); // Bitmap naar display sturen
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);
} // Pauzeer hier als pauze-commando ontvangen
delay(scrollspeed);
}
}
// Volatile, omdat gewijzigd in een ISR.
volatile boolean inService = false;
void serialInterrupt(){
if (inService) return; // Je was niet in service. Nu wel.
inService = true;
// Interrupts weer inschakelen, om Serial te laten werken. Alleen als inService false is.
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 =='/'){
// Commandomodus
inChar = true;
while(inChar){
if (Serial.available()) {
ch = Serial.read();
// '/+' is voor helderheid verhogen
if(ch == '+'){
if(BTvalue < 15) {
BTvalue++;
matrix.setIntensity(BTvalue);
}
break;
}
// '/-' is voor helderheid verlagen
if(ch == '-'){
if(BTvalue > 0){
BTvalue--;
matrix.setIntensity(BTvalue);
}
break;
}
// '/>' is om scroll te vertragen
if(ch == '>'){
if(scrollspeed < 200) {
scrollspeed = scrollspeed + 20;
}
break;
}
// '/<' is om scroll te versnellen
if(ch == '<'){
if(scrollspeed > 10){
scrollspeed = scrollspeed - 10;
}
break;
}
// '/e' is om display te wissen
if(ch == 'e'){
dataAvailable = false;
break;
}
// '/p' is om display te pauzeren
if(ch == 'p'){
if(pause == false){
pause = true;
} else {
pause = false;
}
break;
}
else {
break; // Onherkend commando
}
}
}
}
} // while(serial.available)
inService = false;
}
Schema's
Productieproces
- Slimme spaarpot bouwen: Muntenacceptor besturen met Arduino Nano
- Bouw een 24×16 LED Pong-console met Arduino Nano & MAX7219
- Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
- Bluetooth Tekst Teleporter: Arduino + Android Project
- Spraakgestuurde huishoudapparaten: Bluetooth-besturing met Google Assistant
- Een 8×8 LED-matrix beheersen met Arduino Uno: Stap-voor-stap handleiding
- Accurate zonnestralingsmeting met Arduino UNO en Ethernet Shield
- Arduino Uno & Bluetooth voor afstandsbediening van auto: stap-voor-stap handleiding
- SMS Versturen & Ontvangen met GSM SIM900 Shield voor Arduino Mega
- Arduino-aangedreven HID UPS: Upgrade je dummy voeding naar USB-compatibele backup
- Smartphone‑gestuurde Bluetooth‑muis: Bouw je eigen virtuele joystick