MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul
- Admin
- Administrator
- Beiträge: 1253
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul
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:
. .
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
Hier mal ein Bild von dem Ding:
. .
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
- Admin
- Administrator
- Beiträge: 1253
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul
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
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-----------------------------
//######################################################################
- Admin
- Administrator
- Beiträge: 1253
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul
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.
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
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
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-----------------------------
//######################################################################
"#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

Servus
Franz
- Admin
- Administrator
- Beiträge: 1253
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul
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:
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.
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-----------------------------
//######################################################################
- Admin
- Administrator
- Beiträge: 1253
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul
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.
.
.
- Admin
- Administrator
- Beiträge: 1253
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul
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
Franz
- Admin
- Administrator
- Beiträge: 1253
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul
Hier habe ich mal das Minimale Programm zur Textausgabe auf das Display.
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!!
.
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);
}
.
- Admin
- Administrator
- Beiträge: 1253
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul
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:
.
Der Lichtsensor besteht aus zwei Teile, beides Cent Artikel, also kein Akt.
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);
}
Wer ist online?
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast