Ich versuche, eine Textuhr mit dem Arduino Uno zu programmieren.
Die Anzeige soll auf 3 Matrixanzeigen mit MAX7219 durchgeführt werden (oben die Stunden, unten in 2 Displays die Minuten (s. Anhang)).
Allerdings funktioniert die Anzeige, abhängig von der Sketch-Größe, nicht korrekt.
Ist der Speicherbedarf zu groß?
Wie viele MAX7219 sind genau verbaut?
Welche library verwendest du?
vermutlich liegt es an deinem Sketch.
Hallo, verbaut sind 3 MAX7219.
Der Sketch sieht folgendermaßen aus:
// Test-System für Matrix-Wortuhr
#define PIN_LED 13
#include <Wire.h>
#include <TimeLib.h>
#include <MD_Parola.h> // include // lcd.init();MajicDesigns Parola library
#include <MD_MAX72xx.h> // include MajicDesigns MAX72xx LED matrix library
#include <SPI.h> // include Arduino SP/
// Definitionen
char c, d, e;
int Poti = A0; // Schleifer des Potis
int Schleiferwert; // Abfrage des Potis
int Helligkeit; // Helligkeit der LEDs
int hrold, minold; // Alte Zeitwerte
int hor, minu; // Stunde bzw. Minute
String texto, textl, textr;
MD_Parola oben = MD_Parola(MD_MAX72XX::FC16_HW,12,13,8,12);
MD_Parola links = MD_Parola(MD_MAX72XX::FC16_HW,12,13,9,10);
MD_Parola rechts = MD_Parola(MD_MAX72XX::FC16_HW,12,13,10,10);
void setup()
{
pinMode(PIN_LED, OUTPUT);
// Initialisierung der Displays
oben.begin();
links.begin();
rechts.begin();
// Voreinstellung der Display-Helligkeit (choose a number between 0 and 15)
oben.setIntensity(12);
links.setIntensity(12);
rechts.setIntensity(12);
// Textanordnung für das Display
oben.setTextAlignment(PA_CENTER);
links.setTextAlignment(PA_RIGHT);
rechts.setTextAlignment(PA_LEFT);
// Definition der Umlaute
c=0+252; // ü
d=0+246; // ö
e=0+228; // ä
// Test für alte Uhrzeit
hrold=4;
minold=25;
// Setzen der Uhrzeit
hor=5; // Uhrzeit-Vorgabewerte
minu=15;
setTime(hor,minu,0,28,8,25); // Manuelles Setzen der Uhrzeit
// Anzeige des Titels
texto="Matrix-Wortuhr";
oben.print(texto);
delay(2000);
}
void loop()
{
// Abfrage des Helligkeits-Potis
Schleiferwert = analogRead(Poti);
Helligkeit=Schleiferwert/68;
// Setzen der Display-Helligkeit (abhängig vom Poti)
oben.setIntensity(Helligkeit);
links.setIntensity(Helligkeit);
rechts.setIntensity(Helligkeit);
// Blinken der LED
digitalWrite(PIN_LED, HIGH);
delay(500);
digitalWrite(PIN_LED, LOW);
delay(500);
digitalClockDisplay();
}
void digitalClockDisplay()
{
// Anzeigen der Zeit auf dem Matrix-Display
// Stunden
if (hour()!=hrold)
{
Stunden();
oben.print(texto);
hrold=hour();
}
// Minuten
if (minute()!=minold)
{
Minuten();
links.print(textl);
rechts.print(textr);
minold=minute();
}
}
void Stunden()
{
hor=hour();
// Anzeige der Stunden
switch (hor) {
case 0: {texto="Null Uhr";} break;
case 1: {texto="Ein Uhr";} break;
case 2: {texto="Zwei Uhr";} break;
case 3: {texto="Drei Uhr";} break;
case 4: {texto="Vier Uhr";} break;
case 5: {texto=(String("F")+String(c)+String("nf Uhr"));} break;
case 6: {texto="Sechs Uhr";} break;
case 7: {texto="Sieben Uhr";} break;
case 8: {texto="Acht Uhr";} break;
case 9: {texto="Neun Uhr";} break;
case 10: {texto="Zehn Uhr";} break;
case 11: {texto="Elf Uhr";} break;
case 12: {texto=(String("Zw")+String(d)+String("lf Uhr"));} break;
case 13: {texto="Dreizehn Uhr";} break;
case 14: {texto="Vierzehn Uhr";} break;
case 15: {texto=(String("F")+String(c)+String("nfzehn Uhr"));} break;
case 16: {texto="Sechzehn Uhr";} break;
case 17: {texto="Siebzehn Uhr";} break;
case 18: {texto="Achtzehn Uhr";} break;
case 19: {texto="Neunzehn Uhr";} break;
case 20: {texto="Zwanzig Uhr";} break;
case 21: {texto="Einundzwanzig Uhr";} break;
case 22: {texto="Zweiundzwanzig Uhr";} break;
case 23: {texto="Dreiundzwanzig Uhr";} break;
}
}
void Minuten()
{
minu=minute();
// Anzeige der Minuten
switch (minu)
{
case 0: {textl="Null";textr=" Minuten";} break;
case 1: {textl="Ein"; textr=" Minuten";} break;
case 2: {textl="Zwei";textr=" Minuten";} break;
case 3: {textl="Drei";textr=" Minuten";} break;
case 4: {textl="Vier";textr=" Minuten";} break;
case 5: {textl=(String("F")+String(c)+String("nf"));textr=" Minuten";} break;
case 6: {textl="Sechs";textr=" Minuten";} break;
case 7: {textl="Sieben";textr=" Minuten";} break;
case 8: {textl="Acht";textr=" Minuten";} break;
case 9: {textl="Neun";textr=" Minuten";} break;
case 10: {textl="Zehn";textr=" Minuten";} break;
case 11: {textl="Elf";textr=" Minuten";} break;
case 12: {textl=(String("Zw")+String(d)+String("lf"));textr=" Minuten";} break;
case 13: {textl="Dreizehn";textr=" Minuten";} break;
case 14: {textl="Vierzehn";textr=" Minuten";} break;
case 15: {textl=(String("F")+String(c)+String("nfzehn"));textr=" Minuten";} break;
case 16: {textl="Sechzehn";textr=" Minuten";} break;
case 17: {textl="Siebzehn";textr=" Minuten";} break;
case 18: {textl="Achtzehn";textr=" Minuten";} break;
case 19: {textl="Neunzehn";textr=" Minuten";} break;
case 20: {textl="Zwanzig";textr=" Minuten";} break;
case 21: {textl="Einundzwan";textr="zig Minuten";} break;
case 22: {textl="Zweiundzwan";textr="zig Minuten";} break;
case 23: {textl="Dreiundzwan";textr="zig Minuten";} break;
case 24: {textl="Vierundzwan";textr="zig Minuten";} break;
case 25: {textl=(String("F")+String(c)+String("nfundzwan"));textr="zig Minuten";} break;
case 26: {textl="Sechsundzwan";textr="zig Minuten";} break;
case 27: {textl="Siebenundzwa";textr="nzig Minuten";} break;
case 28: {textl="Achtundzwanzig";textr=" Minuten";} break;
case 29: {textl="Neunundzwanzig";textr=" Minuten";} break;
case 30: {textl="Dreissig";textr=" Minuten";} break;
case 31: {textl="Einunddreissig";textr=" Minuten";} break;
case 32: {textl="Zweiunddreissig";textr=" Minuten";} break;
case 33: textl="Dreiunddreissig";textr=" Minuten"; break;
case 34: textl="Vierunddreissig";textr=" Minuten"; break;
case 35: {textl=(String("F")+String(c)+String("nfunddreissig"));textr=" Minuten";} break;
case 36: {textl="Sechsunddreissig";textr=" Minuten";} break;
case 37: {textl="Siebenunddreissig";textr=" Minuten";} break;
case 38: {textl="Achtunddreissig";textr=" Minuten";} break;
case 39: {textl="Neununddreissig";textr=" Minuten";} break;
case 40: {textl="Vierzig";textr=" Minuten";} break;
case 41: {textl="Einundvierzig";textr=" Minuten";} break;
case 42: {textl="Zweiundvierzig";textr=" Minuten";} break;
case 43: {textl="Dreiundvierzig";textr=" Minuten";} break;
case 44: {textl="Vierundvierzig";textr=" Minuten";} break;
/* case 45: {textl=(String("F")+String(c)+String("nfundvierzig"));textr=" Minuten";} break;
case 46: {textl="Sechsundvierzig";textr=" Minuten";} break;
case 47: {textl="Siebenundvierzig";textr=" Minuten";} break;
case 48: {textl="Achtundvierzig";textr=" Minuten";} break;
case 49: {textl="Neunundvierzig";textr=" Minuten";} break;
case 50: {textl=(String("F")+String(c)+String("nfzig"));textr=" Minuten";} break;
case 51: {textl=(String("Einundf")+String(c)+String("nfzig"));textr=" Minuten";} break;
case 52: {textl=(String("Zweiundf")+String(c)+String("nfzig"));textr=" Minuten";} break;
case 53: {textl=(String("Dreiundf")+String(c)+String("nfzig"));textr=" Minuten";} break;
case 54: {textl=(String("Vierundf")+String(c)+String("nfzig"));textr=" Minuten";} break;
case 55: {textl=(String("F")+String(c)+String("nfundf")+String(c)+String("nf"));textr="zig Minuten";} break;
case 56: {textl=(String("Sechsundf")+String(c)+String("nfzig"));textr=" Minuten";} break;
case 57: {textl=(String("Siebenundf")+String(c)+String("nfzig"));textr=" Minuten";} break;
case 58: {textl=(String("Achtundf")+String(c)+String("nfzig"));textr=" Minuten";} break;
case 59: {textl=(String("Neunundf")+String(c)+String("nfzig"));textr=" Minuten";} break;
break; */
}
}
Wenn ich den kompletten Sketch abarbeiten lasse bzw. ab Minute 40 ausdokumentiere, bleiben die Displays dunkel - die Sekunden-LED blinkt allerdings korrekt, es kommt auch keine Fehlermeldung.
Dokumentiere ich die Minutenabfrage ab Minute 30 aus, ist die Anzeige korrekt.
Dokumentiere ich die Minutenabfrage ab Minute 37 aus, erscheint die Anzeige nur teilweise (s. folgendes Bild).
Das könntest Du mittels MemoryFree überprüfen.
In der Programmfassung von #4 sind nur noch 184 Byte frei.
Hmm... Die ganzen Texte dürften im RAM liegen...
Schau dir mal strcpy_P() und PROGMEM an.
Hilfe zu PROGMEM und dort besonders "Array von Strings".
du meinst jedes display besteht aus 3 x 4 MAX7219. Also insgesamt 36 MAX7219?!?
Nein.
Wie dem Sketch zu entnehmen ist, werden 3 MAX7219 eingesetzt:
- Eines für die Stundenanzeige mit 12 8x8-Matrixdisplay
- Je eines für die Minutenanzeige links und rechts mit je 10 8x8-Matrixdisplays
- Die Clk- und DIN-Eingänge sind miteinander verbunden, nur die CS-Anschlüsse sind separat.
Die auf den ersten Blick einfachste Lösung wäre natürlich, nur jede zweite Minute abzufragen, mit dem Nachteil, dass auch nur jede zweite Minute als Text zur Anzeige käme.
Stimmt, es sind "nur" 32 ![]()
Jeder Max7219 bedient ein 8x8-Display. Es ist nicht der Name des ganzen Display-Moduls sondern nur des ICs.
Innerhalb des Displays sind dann (je nach Bauart) mehrere 8x8-Module direkt aneinander verbaut: Ausgang von einem an den Eingang vom nächsten..
Ich würde auch nicht die beiden 10er Module separat ansteuern, sondern sie auch direkt miteinander verbinden und ein 20er draus machen. Sollte eigentlich nichts dagegensprechen, oder? (in die Runde gefragt)
Das Speicher-Platz-Problem kommt auch wohl eher von der apokalyptischen Flut an (speicherfressenden) Strings, die hier verwendet werden. Es gab ja schon Hinweise, diese in char-arrays umzuwandeln. Schon, weil hier einige Worte ja immer wieder verwendet werden. Die kann man sich dann nach Baustein-Prinzip aneinanderhängen, wie man es braucht.
dann sind es 12 + 10 + 10 MAX7219. Dreh mal deine Displays um und zähle die schwarzen Käfer. Wie viele sind das?
Das Problem ist gelöst:
Ich verwende einen Arduino Mega256, dort funktioniert alles wunder bar und ich habe noch genügend Speicherplatz, um einen DCF77-Empfänger und eine RTC einzusetzen.
Vielen Dank für Eure Beiträge!
Hmm... man kann versuchen das Problem zu verstehen und da herum arbeiten...
oooooder man schmeißt einfach mehr Ressourcen drauf...
Nimm nicht DS1307, besser ist DS3231 oder DS3232.
Solltest Du WLAN in der Nähe haben, ginge auch ein ESP32, der sich die Zeit aus dem WWW holt. Geht auch mit Arduino-IDE zu programmieren.
Warum antwortest du nicht aud gestellte Fragen?
Entschuldige die Zwischenfrage. Wo hast Du RTC Module mit dem DS3232 gefunden?
Grüße Uwe
Von der Existenz der Arduino DS3232RTC Library habe ich kühn auf die Existenz der passenden Hardware geschlossen: DS3232 Precise RTC
Das IC gibt es schon aber ich habe bis jetzt keine bezahlbaren Module mit dem DS3232 gefunden. Den DS3231 gibt es in Asien schon ab 2€. Den DS3232 finde ich über 20€.
Grüße Uwe
Was nützt es, durch Programmierfeinheiten ein paar Bytes herauszukitzeln, wenn im Anschluss bei Verwendung des DCF77-Moduls weitere Bibliotheken und Programmcode hinzukommen und man dann doch auf eine Lösung mit mehr Speicher kommen muß?
Ich habe keine Frage von Dir gefunden!

