English Click this button for the international website

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 met 3x MAX7219 8x8 LED matrix module
Arduino Uno met 3x MAX7219 8×8 LED matrix module
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/

Geekcreit® UNO R3 ATmega328P Development Board For Arduino
Getest en Aanbevolen door OneGuyOneBlog.com:

Geekcreit® UNO R3 ATmega328P Development Board For Arduino

Voeg een reactie toe

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *