Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Über mich
  • Deutsch
  • English
Menu

Arduino Projekt: LED Matrix Uhr

Posted on 10. Februar 20185. März 2024 by Stefan Draeger

Mit zwei (oder mehr) MAX7219 lässt sich relativ einfach und schnell eine LED Uhr erzeugen. Als Zeitgeber verwende ich ein RTC Modul DS3231.

  • Benötigte Bauteile
  • Das Shield MAX7219
  • Aufbau
  • Quellcode
  • Video
  • Download

Benötigte Bauteile

Für den Ausbau verwende ich folgende Bauteile:

  • Arduino UNO*,
  • 2x MAX7219 Shield*,
  • 1x RTC DS3231*,
  • 5x Breadboardkabel 20 cm, weiblich – weiblich*,
  • 5x Breadboardkabel 20 cm, männlich – weiblich*,
  • 6x Breadboardkabel 20 cm, männlich – männlich*,
  • 1x Breadboard*, (min. 400 PINs)

Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!

Das Shield MAX7219

Das Shield gibt es bei eBay.de aufgebaut und nicht aufgebaut zu kaufen, wenn man sich mit dem Lötkolben gut auskennt, dann kann ich das Kit zum selber aufbauen empfehlen.

Aufbau

Das Projekt besteht aus 2x MAX7219 LED Matrix Shields sowie einer RTC und dem Arduino UNO.

ModulArduino UNO
 MAX7219 LED Matrix Shield 
VCC 5V
GND GND
DIN digitaler PIN 9
 CS digitaler PIN 10
CLK digitaler PIN 11
RTC DS3231 
VCC 5V
GND GND
 SDA analoger PIN A4
 SCL analoger PIN A5
Aufbau der Schaltung für die LED Matrix Uhr
Aufbau der Schaltung für die LED Matrix Uhr

Der Anschlussplan für dieses Projekt sieht wie folgt aus:

Anschlussplan für MAX7219 LED Matrix Uhr mit RTC
Anschlussplan für MAX7219 LED Matrix Uhr mit RTC

Quellcode

Der nachfolgende Quellcode ist nur ein Auszug, es werden noch die Dateien „statics.h“, „rtc_functions.h“ sowie „max7219_functions.h“ benötigt (Diese sind am Ende de Tutorials als Paket zum Download bereitgestellt.) Des Weiteren wird die Bibliothek für das Max7219 Shield und die Wire.h Bibliothek benötigt.

//Die Bibliotheken 
#include <MaxMatrix.h>
#include <avr/pgmspace.h>
#include <Wire.h>
#define RTC_I2C_ADDRESS 0x68 // I2C Adresse des RTC  DS3231

int data = 8;    // DIN Pin vom MAX7219 Shield
int load = 9;    // CS Pin vom MAX7219 Shield
int clock = 10;  // CLK Pin vom MAX7219 Shield

int maxInUse = 2;    //Dieser Wert bestimmt wieviele MaxMatrix Shields hintereinander (kaskadiert) verwendet werden.

MaxMatrix m(data, load, clock, maxInUse); // Definiert nun ein Objekt der Klasse MaxMatrix.
//Ausgelagerte CHAR Arrays damit dieser Code übersichtlicher bleibt.
#include "statics.h" 
//Funktionen für die RTC DS3231
#include "rtc_functions.h"
//Funktionen für das MAX7219 Shield
#include "max7219_functions.h"

//Die Nachricht welche auf dem Shield dargestellt
//werden soll als Char Array.
char msg[] = {""};

void setup(){
  Wire.begin(); //Kommunikation über die Wire.h bibliothek beginnen.
  m.init(); // Das Max7219 initialisieren.
  m.setIntensity(1); // LED Leucht intensität, Werte von 0-15 sind hier erlaubt.
  Serial.begin(9600); // Übertragungsgeschwindigeit der seriellen Verbindung
}

void loop(){
  //Lesen der aktuellen Zeit
  rtcReadTime();
  String dateTime = getRTCDateTime();
  //Umwandeln des String wertes in ein Char Array.
  dateTime.toCharArray(msg, dateTime.length());
  //Schreibt die Message auf die Max LED Matrix, mit einer wiederholungsgeschwindigkeit von 75ms.
  printStringWithShift(msg, 75);

  //Es muss einmalig die Zeit gesetzt werden, dazu also die Funktion "setRTCTime" auskommentieren
  //und auf dem Seriellen Monitor mit set DD.MM.YYY HH:mm:ss das Datum nd die Uhrzeit einmalig setzen
  //setRTCTime();
}

//Gibt einen Zeitstempel auf der Seriellen Schnittstelle aus.
String getRTCDateTime(){
  char linebuf[60];
  int dOW = calcDayOfWeek(jahr, monat, tag);
  String wochentagC = daysInWeek[dOW];
  String monatC = monthInYear[monat-1];
 
  String result = "";
  if(tag<10) { result += "0"; }
  result += tag;
  result += ".";
  if(monat<10) { result += "0"; }
  result += monat;
  result += " ";  
  result += jahr;  
  result += " "; 
  if(stunde<10) { result += "0"; }
  result += stunde;  
  result += ":";  
  if(minute<10) { result += "0"; }
  result += minute;  
  result += ":"; 
  if(sekunde<10) { result += "0"; }
  result += sekunde;  
  result += "  "; 
  return result; 
}
 
//Manuelles setzen der Uhrzeit über den Seriellen Monitor der IDE.
void setRTCTime(){
  char linebuf[30];
  byte counter;
  if (Serial.available()){
    delay(100); // Warte auf das Eintreffen aller Zeichen vom seriellen Monitor
    memset(linebuf,0,sizeof(linebuf)); // Zeilenpuffer löschen
    counter=0; // Zähler auf Null
    while (Serial.available()){
      linebuf[counter]=Serial.read(); // Zeichen in den Zeilenpuffer einfügen
      if (counter<sizeof(linebuf)-1) counter++; // Zeichenzähler erhöhen
    }
    // Wenn in der gelesenen Zeile das Wort 'set' vorkommt dann...
    //(Hier muss man bedenken das die Suche nach 'set' auch nach x Zeichen ein positives Ergebnis liefern wird, zbsp. 123set 09.01.2016 12:00:00)
    if (strstr(linebuf,"set")==linebuf){ 
      tag=getIntFromString (linebuf,1);
      monat=getIntFromString (linebuf,2);
      jahr=getIntFromString (linebuf,3);
      stunde=getIntFromString (linebuf,4);
      minute=getIntFromString (linebuf,5);
      sekunde=getIntFromString (linebuf,6);
    } else {
      Serial.println("Befehl unbekannt.");
      return;
    }
    // Ausgelesene Werte einer groben Plausibilitätsprüfung unterziehen:
    if (!checkDateTime(jahr, monat, tag, stunde, minute, sekunde)){
      Serial.println(linebuf);
      Serial.println("Fehlerhafte Zeitangabe im 'set' Befehl");
      Serial.println("Beispiel: set 28.08.2013 10:54");
      return;
    }
    rtcWriteTime(jahr, monat, tag, stunde, minute, sekunde);
    Serial.println("Zeit und Datum wurden auf neue Werte gesetzt.");
  }
}
 
//Prüft das eingegebene Datum auf korrektheit.
boolean checkDateTime(int jahr, int monat, int tag, int stunde, int minute, int sekunde){
   boolean result = false;
   if(jahr>2000){
     result = true;  
   } else {
     return false;
   }
   // Schaltjahr prüfen
   if(jahr % 400 == 0 || (jahr % 100 != 0 && jahr % 4 == 0)){
     //Wenn es ein Schaltjahr ist dann den Wert 29 in das Array an der Stelle 1 für den Monat Februar schreiben.
     daysInMonth[1]=29;
   }
   
   //Monat muss kleiner 13 sein.
   if (monat<13){
      if( tag <= daysInMonth[monat-1] ){
        result = true;
      }
   } else {
     return false;
   }
    
  //Wert für Stunde muss zwischen 0 und 24 liegen,
  //Wert für Minute und sekunde muss zwischen 0 und 59 liegen
  if(stunde <24 && minute <60 && sekunde <60 && stunde >= 0 && minute >=0 && sekunde >=0){
        result = true;
  } else {
     return false;
   }
   
   return result;
}

Video

Arduino LED Uhr mit Max7219 Shield
Dieses Video auf YouTube ansehen.

Download

Arduino Projekt: LED Matrix UhrHerunterladen

13 thoughts on “Arduino Projekt: LED Matrix Uhr”

  1. heli wood sagt:
    4. Juni 2018 um 16:23 Uhr

    Hallo Stefan,

    Sketch läuft. Anzeige müsste um 90 Grad gedreht werden.
    Ich konnte keine Lösung finden.

    Grüße Heli

    Antworten
    1. Hansi sagt:
      17. Mai 2019 um 11:27 Uhr

      Hallo zusammen,
      gibt es hier mittlerweile eine Lösung damit die ANzeige auch wieder sauber von links nach rechts läuft?

      Gruß Hansi

      Antworten
      1. Stefan Draeger sagt:
        18. Mai 2019 um 08:05 Uhr

        Hi,

        ich habe bisher noch keine Zeit gehabt mich damit zu beschäftigen.
        Das steht jedoch ziemlich weit oben auf meiner ToDo Liste.

        Gruß,

        Stefan

        Antworten
  2. Alex sagt:
    19. Mai 2019 um 13:59 Uhr

    Hallo,

    wie kann man zeit einstellen ?

    grüß

    Antworten
    1. Stefan Draeger sagt:
      19. Mai 2019 um 19:22 Uhr

      Hi,

      die Zeit kann zbsp. über den seriellen Monitor der Arduino IDE gesetzt werden.
      Wenn dieses Fenster geöffnet wird und der Microcontroller gestartet wird, sollte ein Text erscheinen welcher den Befehl erläutert.

      Beispiel: set 28.08.2013 10:54

      Gruß,

      Stefan

      Antworten
      1. Alex sagt:
        24. Mai 2019 um 23:45 Uhr

        Hallo Stefan,

        Fenster geöfnet aber leer, Ich habe zeit gegeben und gesendet aber funktioniert nicht, ich mache ein fehler aber wo..?

        Grüß

        Alex

        Antworten
        1. Stefan Draeger sagt:
          7. Juni 2019 um 14:23 Uhr

          Hi Alex,

          leider verstehe ich dein Problem nicht.
          Gerne kannst du auch in englisch schreiben wenn es für dich einfacher ist.
          Dein Sketch kannst du mir gerne per E-Mail senden, dann schaue ich mir es mal an.

          Gruß,

          Stefan

          Antworten
      2. Alex sagt:
        25. Mai 2019 um 15:22 Uhr

        Hallo Stefan Kannst du mal bitte funktionierte sketch senden oder welche spalte muss ich ändern.

        danke

        Alex

        Antworten
        1. Stefan Draeger sagt:
          26. Mai 2019 um 09:55 Uhr

          Hi,

          ich verstehe nicht welchen Sketch. Auf dem Chip des Bausatzes ist bereits ein fertiges Sketch / Programm drauf.

          Gruß,

          Stefan Draeger

          Antworten
  3. Robertas sagt:
    13. Juni 2019 um 11:05 Uhr

    Hi,
    Ich habe jetzt ne Stunde rumgespielt und kann die Zeit immernoch nicht einstellen.
    Wenn ich setRTCTime auskommentiere kommt ein Fehler beim überprüfen.
    Der serielle Monitor zeigt nichts.
    Könntest du es bitte erklären (für dumme).
    Hier mal die Stelle im Code:
    //Manuelles setzen der Uhrzeit über den Seriellen Monitor der IDE.
    void setRTCTime(){
    char linebuf[30];
    byte counter;
    if (Serial.available()){
    delay(100); // Warte auf das Eintreffen aller Zeichen vom seriellen Monitor
    memset(linebuf,0,sizeof(linebuf)); // Zeilenpuffer löschen
    counter=0; // Zähler auf Null
    while (Serial.available()){
    linebuf[counter]=Serial.read(); // Zeichen in den Zeilenpuffer einfügen
    if (counter<sizeof(linebuf)-1) counter++; // Zeichenzähler erhöhen
    _____________________________________________________________________
    Gruß
    Rob

    Antworten
    1. Stefan Draeger sagt:
      17. Juni 2019 um 20:02 Uhr

      Hi Robert,

      ich habe gemerkt das so einige ein Problem mit diesem Beitrag haben, daher habe ich mich entschlossen einen erweiterten Beitrag zu verfassen wo ich hoffentlich alle Fragen abschließend klären kann.

      Gruß,

      Stefan Draeger

      Antworten
  4. Andreas Hickmann sagt:
    18. August 2020 um 17:08 Uhr

    Hallo,
    die Bibliotheken lassen sich nicht Installieren.

    Was mache ich falsch?

    Gruß Hicki

    Antworten
    1. Stefan Draeger sagt:
      18. August 2020 um 20:42 Uhr

      Hi,

      welche Fehlermeldung wird dir angezeigt?

      Gruß,

      Stefan

      Antworten

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen

Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}