MAX7219 en Arduino: interactieve LED lichtkrant
|
Met een Arduino kun je eenvoudig een lichtkrant maken met meerdere MAX7219 8×8 LED matrix modules. Er zijn slechts 5 verbindingen nodig tussen de eerste module en de Arduino: 3 voor data en 2 voor de stroomvoorziening. Meerdere modules kun je met elkaar doorverbinden. Afhankelijk van de stroomvoorziening kun je op deze manier een groot aantal displays aansluiten.
How-to: interactieve lichtkrant
In deze korte tutorial kun je lezen hoe je een interactieve lichtkrant kunt maken. Het display laat eerst een voorgeprogrammeerde tekst voorbij scrollen, daarna kun je via de seriële monitor zelf een tekst naar de lichtkrant sturen.
Arduino en MAX7219 8×8 LED matrix modules aansluiten
Je hoeft alleen de eerste module op de arduino aan te sluiten. Alle volgende modules sluit je op elkaar aan. Hier een voorbeeld met 3 displays:


Arduino Uno | MAX7219 |
5V | VCC |
GND | GND |
D8 | DIN |
D9 | CS |
D10 | CLK |
MaxMatrix library
Om het aansturen van de matrix-modules eenvoudig te maken gebruiken we de “MaxMatrix”-library die je hier kunt downloaden: https://github.com/riyas-org/. Daar kun je ook een voorbeeldsketch vinden, we zullen deze aanpassen en interactief maken zodat je vanaf je toetsenbord via de seriële verbinding tekst naar de lichtkrant kunt sturen.
Voorbeeldsketch: interactieve lichtkrant
Als je de library geïnstalleerd hebt kun je de de onderstaande voorbeeldsketch downloaden of copy/pasten. Een paar instellingen die je kunt veranderen:
- Met de waarde “maxInUse” kun je instellen hoeveel modules je aangesloten hebt;
- De waarde “scrollSpeed” geeft aan hoe snel de tekst over het display loopt: lager is sneller, hoger is langzamer;
- Met “m.setIntensity()” kun je van 0 tot 15 de helderheid instellen: hoger is meer licht.
Als je de sketch upload en start dan zal eerst de voorgeprogrammeerde tekst voorbij scrollen. Daarna kun je de seriële monitor in de Arduino-IDE openen en een tekst van maximaal 64 tekens naar de lichtkrant sturen.
/* Interactive scrolling led sign for Arduino and MAX7219 8x8 LED Display This is the code I use to control the MAX7219 8x8 LED modules from my Chinese "Geekcreit"-brand Arduino clone. The first module is connected to the Uno like this: Module: VCC -> Uno: 5V Module: GND -> Uno: GND Module: DIN -> Uno: D8 Module: CS -> Uno: D9 Module: CLK -> Uno: D10 Additional modules are connected like this: Module 2: VCC -> Module 1: VCC Module 2: GND -> Module 1: GND Module 2: DIN -> Module 1: DIN Module 2: CS -> Module 1: CS Module 2: CLK -> Module 1: CLK See the blog post at https://nl.oneguyoneblog.com/2016/10/20/arduino-lichtkrant-max7219-8x8-led/ */ #include <MaxMatrix.h> #include <avr/pgmspace.h> PROGMEM prog_uchar const CH[] = { 3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space 1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // ! 3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // " 5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // # 4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $ 5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // % 5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // & 1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // ' 3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // ( 3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // ) 5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // * 5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // + 2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // , 4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // - 2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // . 4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // / 4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0 3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1 4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2 4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3 4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4 4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5 4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6 4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7 4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8 4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9 2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // : 2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ; 3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // < 3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // = 3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // > 4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ? 5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // @ 4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A 4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B 4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C 4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D 4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E 4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F 4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G 4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H 3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I 4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J 4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K 4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L 5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M 5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N 4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O 4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P 4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q 4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R 4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S 5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T 4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U 5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V 5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W 5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X 5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y 4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z 2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [ 4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash 2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ] 3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // hat 4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _ 2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // ` 4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a 4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b 4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c 4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d 4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e 3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f 4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g 4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h 3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i 4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j 4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k 3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l 5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m 4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n 4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o 4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p 4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q 4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r 4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s 3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t 4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u 5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v 5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w 5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x 4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y 3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z 3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // { 1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // | 3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // } 4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~ }; int data = 8; // DIN pin of MAX7219 displays int load = 9; // CS pin of MAX7219 displays int clock = 10; // CLK pin of MAX7219 displays int scrollSpeed = 35; // speed of scrolling text, lower is faster int maxInUse = 3; //Number of MAX7219 displays MaxMatrix m(data, load, clock, maxInUse); // define Library byte buffer[10]; char inData[64] = "MAX7219 8x8 LED Matrix - Visit oneguyoneblog.com"; // The string (max 64 bytes) char inChar; // Where to store the character read byte index = 0; // Index into array; where to store the character void setup(){ m.init(); // init display m.setIntensity(7); // LED light intensity from 0 (dimmest) to 15 Serial.begin(9600); // init serial connection } void loop(){ // Get input from serial connection index=0; while(Serial.available() > 0) // Don't read unless there is data { if(index < 63) // One less than the size of the array { inChar = Serial.read(); // Read a character Serial.write(inChar); inData[index] = inChar; // Store it index++; // Increment where to write next inData[index] = '\0'; // Null terminate the string } } byte c; delay(100); m.shiftLeft(false, true); printStringWithShift(inData, scrollSpeed); // Send scrolling Text clearLCD(maxInUse, scrollSpeed); } // Put extracted character on Display void printCharWithShift(char c, int shift_speed){ if (c < 32) return; c -= 32; memcpy_P(buffer, CH + 7*c, 7); m.writeSprite(maxInUse*8, 0, buffer); m.setColumn(maxInUse*8 + buffer[0], 0); for (int i=0; i<buffer[0]+1; i++) { delay(shift_speed); m.shiftLeft(false, false); } } // Extract characters from Scrolling text void printStringWithShift(char* s, int shift_speed){ while (*s != 0){ printCharWithShift(*s, shift_speed); s++; } } // Add trailing space to clear the display void clearLCD(int maxInUse, int shift_speed){ for (int i=0; i<maxInUse*8; i++) { m.setColumn((maxInUse*8), 0); delay(shift_speed); m.shiftLeft(false, false); } }
Deze voorbeeldsketch is ook op GitHub te vinden: https://github.com/oneguyoneblog/