MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul

Antworten
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul

Beitrag von Admin »

Ich habe mir das "MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul" mal bei AZ-Delivery bestellt und auf den Tisch genommen. Ich will mal sehen ob das eine interessante Option zu einer rel. großen Anzeige ist. Mit der man auch gut scrollen kann, oder eigentlich muss, weil da ja gerade so für 7 Buchstaben Platz ist. Man kann ja nicht viel Text drauf bringen, aber es wird sinnvoll durch scrollen.

Hier mal ein Bild von dem Ding:
.
Max72xx LED_Anzeige_V01.jpg
Max72xx LED_Anzeige_V01.jpg (165.41 KiB) 723 mal betrachtet
.

Und hier ein kleiner Video, der das Teil in Aktion zeigt. Das ist ein Demo Programm das AZ-Delivery zur Verfügung stellt. In dem Video sind noch einige andere Funktionen gezeigt, die ich hier ausgeklammert habe. Ich habe ihn auch auf meinen Mega angepasst, weil ich den zum Testen gerade frei hatte.

Ich finde es ganz interessant.

Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul

Beitrag von Admin »

Hier ist das Testprogramm dazu. Ich habe einfach nur ein paar Parameter am Programm geändert um nur diese zwei Funktionen aus dem Programm zu aktivieren. Ganz unten im Programm befindet sich der Loop, indem die Funktionen aufgerufen werden. Dort habe ich einige deaktiviert. Ich muss erst mal die Möglichkeiten der Lib. ausloten, dann mache ich mal bischen eigene Funktionen. Aber da muss ich mich jetzt erst mal damit bischen einarbeiten.

Franz

Code: Alles auswählen

/* 
 * SPI Schnittstelle Mega
 * MOSI(Data) - pin 51
 * MISO - pin 50
 * CLK - pin 52
 * CS - pin 53 (for MKRZero SD: SDCARD_SS_PIN)
 */
#include <MD_MAX72xx.h >
#define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); }
#define PRINTS(x) Serial.print(F(x))
#define PRINTD(x) Serial.println(x, DEC)
#define PRINT(s, x)
#define PRINTS(x)
#define PRINTD(x)
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN 52 // or SCK
#define DATA_PIN 51 // or MOSI
#define CS_PIN 53 // or SS
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
#define DELAYTIME 100 // in milliseconds
//###################################################################

void scrollText(char *p) { //----------Text scrollen-----------------
uint8_t charWidth;
uint8_t cBuf[8]; // Dies sollte für alle integrierten Schriftarten in Ordnung sein
PRINTS("\nScrolling text");
mx.clear();
while (*p != '\0') {
charWidth = mx.getChar(*p++, sizeof(cBuf) / sizeof(cBuf[0]), cBuf);
// Platz zwischen den Zeichen zulassen
for (uint8_t i=0; i<=charWidth; i++) {
mx.transform(MD_MAX72XX::TSL);
if (i < charWidth) {
mx.setColumn(0, cBuf[i]);
}
delay(DELAYTIME);
}
}
}
void rows() { //-----------------Reihen-------------------------------
mx.clear();
for (uint8_t row=0; row<ROW_SIZE; row++) {
mx.setRow(row, 0xff); delay(2*DELAYTIME);
mx.setRow(row, 0x00);
}
}
void columns() { //---------------Säulen------------------------------
mx.clear();
for (uint8_t col=0; col<mx.getColumnCount(); col++) {
mx.setColumn(col, 0xff); delay(DELAYTIME/MAX_DEVICES);
mx.setColumn(col, 0x00);
}
}
void stripe() {//------------------Streifen---------------------------
const uint16_t maxCol = MAX_DEVICES*ROW_SIZE;
const uint8_t stripeWidth = 10;
mx.clear();
for (uint16_t col=0; col<maxCol + ROW_SIZE + stripeWidth; col++) {
for(uint8_t row=0; row < ROW_SIZE; row++) {
mx.setPoint(row, col-row, true);
mx.setPoint(row, col-row - stripeWidth, false);
}
delay(DELAYTIME);
}
}
void spiral() {//-------------Spirale----------------------------
int rmin = 0, rmax = ROW_SIZE-1;
int cmin = 0, cmax = (COL_SIZE*MAX_DEVICES)-1;
mx.clear();
while ((rmax > rmin) && (cmax > cmin)) {
for (int i=cmin; i<=cmax; i++) { // do row
mx.setPoint(rmin, i, true); delay(DELAYTIME/MAX_DEVICES);
}
rmin++;
for (uint8_t i=rmin; i<=rmax; i++) { // do column
mx.setPoint(i, cmax, true); delay(DELAYTIME/MAX_DEVICES);
}
cmax--;
for (int i=cmax; i>=cmin; i--) { // do row
mx.setPoint(rmax, i, true); delay(DELAYTIME/MAX_DEVICES);
}
rmax--;
for (uint8_t i=rmax; i>=rmin; i--) { // do column
mx.setPoint(i, cmin, true); delay(DELAYTIME/MAX_DEVICES);
}
cmin++;
}
}
void bounce() {//-------------------Ball_Springt-----------------
const int minC = 0;
const int maxC = mx.getColumnCount()-1;
const int minR = 0;
const int maxR = ROW_SIZE-1;
int nCounter = 0;
int r = 0, c = 2;
int8_t dR = 1, dC = 1; // delta row and column
mx.clear();
while (nCounter++ < 60) { // Das war 200
mx.setPoint(r, c, false);
r += dR; c += dC;
mx.setPoint(r, c, true);
delay(DELAYTIME/2);
if ((r == minR) || (r == maxR)) {
dR = -dR;
}
if ((c == minC) || (c == maxC)) {
dC = -dC;
}
}
}
void intensity() { //-------------Intensität Steuern-------------
uint8_t row;
mx.clear();
for (int8_t i=0; i<=MAX_INTENSITY; i++) {
mx.control(MD_MAX72XX::INTENSITY, i);
mx.setRow(0, 0xff); delay(DELAYTIME*10);
}
mx.control(MD_MAX72XX::INTENSITY, 8);
}
void transformation() { //----------Pfeile scrollen---------------
uint8_t arrow[COL_SIZE] = {
0b00001000,
0b00011100,
0b00111110,
0b01111111,
0b00011100,
0b00011100,
0b00111110,
0b00000000 };
MD_MAX72XX::transformType_t t[] = {
MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL,
MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL,
MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL,
MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL,
MD_MAX72XX::TFLR,
MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR,
MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR,
MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR,
MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR,
MD_MAX72XX::TRC,
MD_MAX72XX::TSD, MD_MAX72XX::TSD, MD_MAX72XX::TSD, MD_MAX72XX::TSD,
MD_MAX72XX::TSD, MD_MAX72XX::TSD, MD_MAX72XX::TSD, MD_MAX72XX::TSD,
MD_MAX72XX::TFUD,
MD_MAX72XX::TSU, MD_MAX72XX::TSU, MD_MAX72XX::TSU, MD_MAX72XX::TSU,
MD_MAX72XX::TSU, MD_MAX72XX::TSU, MD_MAX72XX::TSU, MD_MAX72XX::TSU,
MD_MAX72XX::TINV,
MD_MAX72XX::TRC, MD_MAX72XX::TRC, MD_MAX72XX::TRC, MD_MAX72XX::TRC,
MD_MAX72XX::TINV };
mx.clear();
mx.control(MD_MAX72XX::UPDATE, MD_MAX72XX::OFF);
for (uint8_t j=0; j<mx.getDeviceCount(); j++) {
mx.setBuffer(((j+1)*COL_SIZE)-1, COL_SIZE, arrow);
}
mx.control(MD_MAX72XX::UPDATE, MD_MAX72XX::ON);
delay(DELAYTIME);
mx.control(MD_MAX72XX::WRAPAROUND, MD_MAX72XX::ON);
// one tab
for (uint8_t i=0; i<(sizeof(t)/sizeof(t[0])); i++) {
mx.transform(t[i]); delay(DELAYTIME*4);
}
mx.control(MD_MAX72XX::WRAPAROUND, MD_MAX72XX::OFF);
}
void showCharset() { //-------------Zeichensatz anzeigen--------------
mx.clear();
mx.update(MD_MAX72XX::OFF);
for (uint16_t i=0; i<256; i++) {
mx.clear(0);
mx.setChar(COL_SIZE-1, i);
if (MAX_DEVICES >= 3) {
char hex[3]; //-------------------------????????????------------------
sprintf(hex, "%02X", i);
mx.clear(1); mx.setChar((2*COL_SIZE)-1, hex[1]);
mx.clear(2); mx.setChar((3*COL_SIZE)-1, hex[0]);
}
mx.update();
delay(DELAYTIME*6);//--------------War Mal 2 !!!!!!!!!!!!!!!!!!!!!!!!!
}
mx.update(MD_MAX72XX::ON);
}
//######################################################################
void setup() { mx.begin(); }
//######################################################################
void loop() {
scrollText("> Das ist ein Graphics scroll Test !! <          ");
//rows();
//columns();
//stripe();
bounce(); // Ball springt durchs Display
//spiral(); // Spirale
//intensity();
//transformation();
//showCharset();
delay(30);
}
//--------------------------------LOOP ENDE-----------------------------
//######################################################################
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul

Beitrag von Admin »

Ich habe hier mal das Programm, das oben im Video zu sehen ist, noch gekürzt. Also nur die Programmteile, die dafür gebraucht werden.

Code: Alles auswählen

/* 
 * SPI Schnittstelle Mega
 * MOSI(Data) - pin 51
 * MISO - pin 50 Wird hier nicht verwendet!!
 * CLK - pin 52
 * CS - pin 53 SS_PIN
 */
#include <MD_MAX72xx.h >
#define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); }
#define PRINTS(x) Serial.print(F(x))
#define PRINTD(x) Serial.println(x, DEC)
#define PRINT(s, x)
#define PRINTS(x)
#define PRINTD(x)
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 8 // Anzahl der 8x8 Blocks in Reihe
#define CLK_PIN 52 // or SCK
#define DATA_PIN 51 // or MOSI
#define CS_PIN 53 // or SS
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
#define DELAYTIME 100 // in milliseconds
//###################################################################
void scrollText(char *p) { //----------Text scrollen-----------------
uint8_t charWidth;
uint8_t cBuf[8]; // Dies sollte für alle integrierten Schriftarten in Ordnung sein
PRINTS("\nScrolling text");
mx.clear();
mx.control(MD_MAX72XX::INTENSITY, 8); // Leuchtstärker der LED´s (1-8)
while (*p != '\0') {
charWidth = mx.getChar(*p++, sizeof(cBuf) / sizeof(cBuf[0]), cBuf);
// Platz zwischen den Zeichen zulassen
for (uint8_t i=0; i<=charWidth; i++) {
mx.transform(MD_MAX72XX::TSL);
if (i < charWidth) {
mx.setColumn(0, cBuf[i]);
}
delay(DELAYTIME);
}
}
}
void bounce() {//-------------------Ball_Springt-----------------
const int minC = 0;
const int maxC = mx.getColumnCount()-1;
const int minR = 0;
const int maxR = ROW_SIZE-1;
int nCounter = 0;
int r = 0, c = 2;
int8_t dR = 1, dC = 1; // delta row and column
mx.clear();
mx.control(MD_MAX72XX::INTENSITY, 8); // Leuchtstärker der LED´s (1-8)
while (nCounter++ < 120) { // Das war 200
mx.setPoint(r, c, false);
r += dR; c += dC;
mx.setPoint(r, c, true);
delay(DELAYTIME/2);
if ((r == minR) || (r == maxR)) {
dR = -dR;
}
if ((c == minC) || (c == maxC)) {
dC = -dC;
}
}
}
//######################################################################
void setup() { mx.begin(); }
//######################################################################
void loop() {
scrollText("> Das ist ein Graphics scroll Test !! <          ");
bounce(); // Ball springt durchs Display
delay(30);
}
//--------------------------------LOOP ENDE-----------------------------
//######################################################################
In der Programmzeile bestimmt man, wie lange diese LED Zeile ist.
"#define MAX_DEVICES 4"
Wenn ich da anstelle der 4 eine 8 schreibe, kann ich den Balken um 4 Felder verlängern. Das mache ich mal, wenn mir langweilig ist :oo: Um zu sehen ob sich der Stromverbrauch in den letzten Modulen vielleicht negativ auswirkt. Übrigens braucht dieser Balken hier, mit den 4x Max7219 IC´s. etwas über 600mA, wenn ich alle LED´s einschalte. Dann könnte man sicher auch die Spannung gleichzeitig von hinten und vorne, oder in der Mitte zuführen. Nur die Daten müßen ganz klar vom Anfang her, also von rechts, zugeführt werden. Das probiere ich aber alles noch aus.

Servus
Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul

Beitrag von Admin »

Ich habe jetzt mal zwei dieser Module aneinader gelötet, und das Programm dann entsprechend angepasst. Und schon läuft es.

Hier ist das Programm:

Code: Alles auswählen

/* 
 * SPI Schnittstelle Mega
 * MOSI(Data) - pin 51
 * MISO - pin 50 Wird hier nicht verwendet!!
 * CLK - pin 52
 * CS - pin 53 SS_PIN
 */
#include <MD_MAX72xx.h >
#define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); }
#define PRINTS(x) Serial.print(F(x))
#define PRINTD(x) Serial.println(x, DEC)
#define PRINT(s, x)
#define PRINTS(x)
#define PRINTD(x)
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 8 // Anzahl der 8x8 Blocks in Reihe
#define CLK_PIN 52 // or SCK
#define DATA_PIN 51 // or MOSI
#define CS_PIN 53 // or SS
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
#define DELAYTIME 100 // in milliseconds
//###################################################################
void scrollText(char *p) { //----------Text scrollen-----------------
uint8_t charWidth;
uint8_t cBuf[8]; // Dies sollte für alle integrierten Schriftarten in Ordnung sein
PRINTS("\nScrolling text");
mx.clear();
//mx.control(MD_MAX72XX::INTENSITY, 8); // Leuchtstärker der LED´s (1-8)
while (*p != '\0') {
charWidth = mx.getChar(*p++, sizeof(cBuf) / sizeof(cBuf[0]), cBuf);
// Platz zwischen den Zeichen zulassen
for (uint8_t i=0; i<=charWidth; i++) {
mx.transform(MD_MAX72XX::TSL);
if (i < charWidth) {
mx.setColumn(0, cBuf[i]);
}
delay(DELAYTIME);
}
}
}
void bounce() {//-------------------Ball_Springt-----------------
const int minC = 0;
const int maxC = mx.getColumnCount()-1;
const int minR = 0;
const int maxR = ROW_SIZE-1;
int nCounter = 0;
int r = 0, c = 2;
int8_t dR = 1, dC = 1; // delta row and column
mx.clear();
//mx.control(MD_MAX72XX::INTENSITY, 8); // Leuchtstärker der LED´s (1-8)
while (nCounter++ < 125) { // Das war 200
mx.setPoint(r, c, false);
r += dR; c += dC;
mx.setPoint(r, c, true);
delay(DELAYTIME/2);
if ((r == minR) || (r == maxR)) {
dR = -dR;
}
if ((c == minC) || (c == maxC)) {
dC = -dC;
}
}
}
//######################################################################
void setup() { mx.begin(); }
//######################################################################
void loop() {
scrollText("> Das ist ein Graphics scroll Test !! <                     ");
bounce(); // Ball springt durchs Display
delay(30);
}
//--------------------------------LOOP ENDE-----------------------------
//######################################################################
Spannungsversorgung von zwei Seiten ist nicht nötig. Einen Helligkeits-Unterschied, zwischen den ersten und dem letzten Modul kann ich nicht erkennen. Hier habe ich den Video mit dem doppelten Anzeigebalken. Die Anzeige ist genauso intensiv wie beim Video oben mit dem halben Balken, ich habe nur das seeeehr helle Arbeitslicht über dem Tisch an, deshalb wirkt die Anzeige etwas schwach.
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul

Beitrag von Admin »

Das ist ein Display, das man auch aus etwas Entfernung noch gut lesen kann. Gefällt mir immer besser. Ich werde mir noch eines machen, das drei Module hat. Denn das hier kann ja gerade mal 15 Zeichen anzeigen. Eine Zeile mit 22 Zeichen ist mir lieber.
.
LED_Max72xx Display.jpg
LED_Max72xx Display.jpg (292.11 KiB) 660 mal betrachtet
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul

Beitrag von Admin »

Ich habe jetzt drei solche Module nachgekauft, um einen LED Streifen mit 40cm länge bauen zu können. Das Bild hier oben ist mit zwei Modulen. Ich bin begeistert von den Dingern. Wenn man mal ein Display braucht, das auf ein paar Meter Abstand gut lesbar ist, dann ist das sehr schön zu machen. Ich bin noch dabei, die Testsoftware, die mit dem "MD_MAX72xx.h" Treiber mitgeliefert wird, zu durchforsten. Wenn ich wieder was gutes zu berichten habe, bin ich natürlich wieder hier.

Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul

Beitrag von Admin »

Hier habe ich mal das Minimale Programm zur Textausgabe auf das Display.

Code: Alles auswählen

// Verwenden Sie die MD_MAX72XX-Bibliothek, um Text auf dem Display zu drucken
// Demonstriert die Verwendung der Bibliothek zum Drucken von Text.
// Der Benutzer kann Text auf dem seriellen Monitor eingeben und dieser wird als angezeigt
// Meldung auf dem Display.

#include <MD_MAX72xx.h>
#include <SPI.h>

// Definieren Sie die Anzahl der Geräte, die wir in der Kette haben,
// und die Hardwareschnittstelle
// HINWEIS: Diese Pin-Nummern funktionieren wahrscheinlich nicht mit Ihrer Hardware und können
// müssen angepasst werden
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 12 // Hier wird die Länge der Textzeile angegeben
// Übegabe der SPI Pin´s
#define DATA_PIN 51 // MOSI Z1
#define CS_PIN 52 // CS Z1
#define CLK_PIN 53 // SCK Z1
// Beliebige Pin´s
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

// Text parameters
#define CHAR_SPACING  1 // Pixel zwischen Zeichen

// Globale Nachrichtenpuffer, die von seriellen und scrollenden Funktionen
// gemeinsam genutzt werden
#define BUF_SIZE  75
char message[BUF_SIZE] = "Das ist ein neuer Test"; // Hier wird der Text übergeben
bool newMessageAvailable = true; // Hier wird gesagt, dass das ein neuer Text ist

//#############################################################################
//#                                 Setup                                     #
//#############################################################################
void setup()
{
  mx.begin();
  mx.control(MD_MAX72XX::INTENSITY, 1); //Display Anzeige Helligkeit
}
//#############################################################################
//#                                LOOP                                       #
//#############################################################################
void loop()
{
  if (newMessageAvailable) // Hier wird geprüft, ob der Text neu ist
  {
    printText(0, MAX_DEVICES - 1, message); Hier wird der Text an die Funktion gegeben
    // Hier wird angezeigt, dass der Text ausgegeben ist, und somit jetzt alt ist
    newMessageAvailable = false;
  }
}
//#############################################################################
//#                            Print den Text                                 #
//#############################################################################
void printText(uint8_t modStart, uint8_t modEnd, char *pMsg)
{
  // Drucken Sie die Textzeichenfolge an die angegebenen LED-Matrix-Module.
  // Nachrichtenbereich wird nach dem Drucken mit Leerspalten aufgefüllt.
  uint8_t   state = 0;
  uint8_t   curLen;
  uint16_t  showLen;
  uint8_t   cBuf[8];
  int16_t   col = ((modEnd + 1) * COL_SIZE) - 1;

  mx.control(modStart, modEnd, MD_MAX72XX::UPDATE, MD_MAX72XX::OFF);

  do     // Zustandsmaschine, um die Zeichen in den verfügbaren Platz zu drucken
  {
    switch (state)
    {
      case 0: // Laden Sie das nächste Zeichen aus der Schriftartentabelle
        // Wenn wir das Ende der Nachricht erreicht haben,
        // setzen Sie den Nachrichtenzeiger zurück
        if (*pMsg == '\0')
        {
          showLen = col - (modEnd * COL_SIZE);  // padding characters
          state = 2;
          break;
        }

        // Rufen Sie das nächste Zeichen aus der Schriftartdatei ab
        showLen = mx.getChar(*pMsg++, sizeof(cBuf) / sizeof(cBuf[0]), cBuf);
        curLen = 0;
        state++;
      //fallen Sie absichtlich in den nächsten Zustand, um mit der Anzeige zu beginnen

      case 1: // zeigt den nächsten Teil des Zeichens an
        mx.setColumn(col--, cBuf[curLen++]);

        // Fertig mit Schriftzeichen, zeigen Sie jetzt den Abstand zwischen den Zeichen an
        if (curLen == showLen)
        {
          showLen = CHAR_SPACING; // Zeichenabstand
          state = 2;
        }
        break;

      case 2: // Initialisierungszustand zum Anzeigen leerer Spalten
        curLen = 0;
        state++;
      // durchfallen

      case 3:  // Zeichenabstand oder Auffüllen am Ende der Nachricht anzeigen (leere Spalten)
        mx.setColumn(col--, 0);
        curLen++;
        if (curLen == showLen)
          state = 0;
        break;

      default:
        col = -1;   // dies beendet definitiv die do-Schleife
    }
  } while (col >= (modStart * COL_SIZE));

  mx.control(modStart, modEnd, MD_MAX72XX::UPDATE, MD_MAX72XX::ON);
}
Hier das Bild dazu. Ich habe die LED Intensität auf Stufe 1 von 8 gestellt. Deshalb schaut die Schrift am Bild sehr schwach aus. Das ist erstens nicht wirklich so schwach und zweitens eben die Stufe 1 von 8!!
.
LED_Max72xx Displayx12.jpg
LED_Max72xx Displayx12.jpg (204.7 KiB) 578 mal betrachtet
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul

Beitrag von Admin »

Ich denke, dass mit dieser Art der Display - Anzeige ein Lichtsensor nicht schlecht wäre. Also habe ich mir mal schnelle einen kleinen Sensor zusammengebaut, aus einen Lichtentfindlichen Widerstand und einen Festwiderstand. Das Ding an Port A0 angeschlossen und das Programm um ein paar Zeilen erweitert. Jetzt ist funktioniert es so, dass die Leuchtstärke bei Dunkelheit auf "1" ist und je nach Helligkeit, diese bis "8" hochgeregelt wird.

Das ist das erweiterte Display-Anzeige Programm:

Code: Alles auswählen

// Verwenden Sie die MD_MAX72XX-Bibliothek, um Text auf dem Display zu drucken
// Demonstriert die Verwendung der Bibliothek zum Drucken von Text.
// Der Benutzer kann Text auf dem seriellen Monitor eingeben und dieser wird als angezeigt
// Meldung auf dem Display.

#include <MD_MAX72xx.h>
#include <SPI.h>

// Definieren Sie die Anzahl der Geräte, die wir in der Kette haben,
// und die Hardwareschnittstelle
// HINWEIS: Diese Pin-Nummern funktionieren wahrscheinlich nicht mit Ihrer Hardware und können
// müssen angepasst werden
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 12 // Hier wird die Länge der Textzeile angegeben
// Übegabe der SPI Pin´s
#define DATA_PIN 51 // MOSI Z1
#define CS_PIN 52 // CS Z1
#define CLK_PIN 53 // SCK Z1
// Beliebige Pin´s
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

const byte Lichtsensor = A0;
int Licht = 0;
byte Regler = 0;
byte ReglerAlt = 0;
// Text parameters
#define CHAR_SPACING  1 // Pixel zwischen Zeichen
// Globale Nachrichtenpuffer, die von seriellen und scrollenden Funktionen
// gemeinsam genutzt werden
#define BUF_SIZE  75
char message[BUF_SIZE] = "Das ist ein neuer Test"; // Hier wird der Text übergeben
bool newMessageAvailable = true; // Hier wird gesagt, dass das ein neuer Text ist

//#############################################################################
//#                                 Setup                                     #
//#############################################################################
void setup()
{
  Serial.begin(9600);
  pinMode(Lichtsensor, INPUT);      // Eingang für Lichtsensor A0
  mx.begin();
}
//#############################################################################
//#                                LOOP                                       #
//#############################################################################
void loop()
{
  // Der mögliche "Licht" Wert ist am PinA0 0-1023. Da der Wert aber im Zimmer nur etwa
  // 0-850 wird, benutze ich den, und verändere in mit "map" auf 1 bis 8 als Wert "Regler"
  // Mit dem Wert 1-8 "Regler" kann die Intensitäts Einstellung fürs Display arbeiten.
  Licht = analogRead (Lichtsensor);
  Regler = map(Licht, 0, 850, 1, 8);
  if (Regler != ReglerAlt)
  {
    mx.control(MD_MAX72XX::INTENSITY, Regler); //Display Anzeige Helligkeit
    ReglerAlt = Regler;
    Serial.print(F("Lichtstärke =  "));
    Serial.println(Regler);
  }
  if (newMessageAvailable) // Hier wird geprüft, ob der Text neu ist
  {
    printText(0, MAX_DEVICES - 1, message); //Hier wird der Text an die Funktion gegeben
    // Hier wird angezeigt, dass der Text ausgegeben ist, und somit jetzt alt ist
    newMessageAvailable = false;
  }
}
//#############################################################################
//#                            Print den Text                                 #
//#############################################################################
void printText(uint8_t modStart, uint8_t modEnd, char *pMsg)
{
  // Drucken Sie die Textzeichenfolge an die angegebenen LED-Matrix-Module.
  // Nachrichtenbereich wird nach dem Drucken mit Leerspalten aufgefüllt.
  uint8_t   state = 0;
  uint8_t   curLen;
  uint16_t  showLen;
  uint8_t   cBuf[8];
  int16_t   col = ((modEnd + 1) * COL_SIZE) - 1;

  mx.control(modStart, modEnd, MD_MAX72XX::UPDATE, MD_MAX72XX::OFF);

  do     // Zustandsmaschine, um die Zeichen in den verfügbaren Platz zu drucken
  {
    switch (state)
    {
      case 0: // Laden Sie das nächste Zeichen aus der Schriftartentabelle
        // Wenn wir das Ende der Nachricht erreicht haben,
        // setzen Sie den Nachrichtenzeiger zurück
        if (*pMsg == '\0')
        {
          showLen = col - (modEnd * COL_SIZE);  // padding characters
          state = 2;
          break;
        }

        // Rufen Sie das nächste Zeichen aus der Schriftartdatei ab
        showLen = mx.getChar(*pMsg++, sizeof(cBuf) / sizeof(cBuf[0]), cBuf);
        curLen = 0;
        state++;
      //fallen Sie absichtlich in den nächsten Zustand, um mit der Anzeige zu beginnen

      case 1: // zeigt den nächsten Teil des Zeichens an
        mx.setColumn(col--, cBuf[curLen++]);

        // Fertig mit Schriftzeichen, zeigen Sie jetzt den Abstand zwischen den Zeichen an
        if (curLen == showLen)
        {
          showLen = CHAR_SPACING; // Zeichenabstand
          state = 2;
        }
        break;

      case 2: // Initialisierungszustand zum Anzeigen leerer Spalten
        curLen = 0;
        state++;
      // durchfallen

      case 3:  // Zeichenabstand oder Auffüllen am Ende der Nachricht anzeigen (leere Spalten)
        mx.setColumn(col--, 0);
        curLen++;
        if (curLen == showLen)
          state = 0;
        break;

      default:
        col = -1;   // dies beendet definitiv die do-Schleife
    }
  } while (col >= (modStart * COL_SIZE));

  mx.control(modStart, modEnd, MD_MAX72XX::UPDATE, MD_MAX72XX::ON);
}
.
Lichtsensor.JPG
Lichtsensor.JPG (9.57 KiB) 562 mal betrachtet
Der Lichtsensor besteht aus zwei Teile, beides Cent Artikel, also kein Akt.
Lichtsensor02.jpg
Lichtsensor02.jpg (125.21 KiB) 570 mal betrachtet
Antworten

Zurück zu „Hardware / Schaltungstechnik“

Wer ist online?

Mitglieder in diesem Forum: Ahrefs [Bot] und 2 Gäste