Echtzeituhr-Modul (DS1302)

../_images/16_DS1302_module.png

Einleitung

Das DS1302 Echtzeituhr-Modul ist ein Gerät zur präzisen Zeit- und Datumsverwaltung. Es eignet sich hervorragend für Projekte, die genaue Zeitangaben und Planungen erfordern, oder um eine digitale Uhr mit Arduino zu realisieren.

Funktionsweise

DS1302 ist ein von DALLAS in den USA eingeführter Uhrenbaustein mit Trickle-Ladung. Er verfügt über eine integrierte Echtzeituhr und einen 31-Byte-Statischen RAM. Der Baustein kommuniziert mit dem Mikrocontroller (MCU) über einfache serielle Schnittstellen. Er stellt Informationen zu Sekunde, Minute, Stunde, Tag, Woche, Monat und Jahr bereit. Zudem passt der DS1302 die Anzahl der Tage pro Monat sowie Schaltjahre automatisch an. Ob das 24-Stunden- oder das 12-Stunden-System verwendet wird, lässt sich über eine AM/PM-Auswahl festlegen. Die Kommunikation mit dem MCU erfolgt synchron über nur drei Anschlusskabel: Reset (RST), I/O-Daten (SDA) und serielle Uhr (SCL).

Anwendungsbeispiele

Hardware-Komponenten

  • Arduino Uno R4 oder R3 Platine * 1

  • Echtzeituhr-Modul (DS1302) * 1

  • Jumperkabel

Schaltungsaufbau

../_images/16_DS1302_module_circuit.png

Programmcode

Bemerkung

Um die Bibliothek zu installieren, nutzen Sie den Arduino-Bibliotheksmanager und suchen Sie nach „Rtc by Makuna“, um sie zu installieren.



Code-Erklärung

  1. Initialisierung und Einbindung der Bibliotheken

    Bemerkung

    Um die Bibliothek zu installieren, nutzen Sie den Arduino-Bibliotheksmanager und suchen Sie nach „Rtc by Makuna“, um sie zu installieren.

    Hier werden die erforderlichen Bibliotheken für das DS1302 RTC-Modul eingebunden.

    #include <ThreeWire.h>
    #include <RtcDS1302.h>
    
  2. Pin-Definitionen und Erstellung der RTC-Instanz

    Die Pins für die Kommunikation werden definiert und eine Instanz des RTC wird erstellt.

    const int IO = 4;    // DAT
    const int SCLK = 5;  // CLK
    const int CE = 2;    // RST
    
    ThreeWire myWire(4, 5, 2);  // IO, SCLK, CE
    RtcDS1302<ThreeWire> Rtc(myWire);
    
  3. setup() Funktion

    Diese Funktion initialisiert die serielle Kommunikation und nimmt die Grundkonfiguration des RTC-Moduls vor. Es werden diverse Prüfungen durchgeführt, um sicherzustellen, dass die RTC korrekt arbeitet.

    void setup() {
      Serial.begin(9600);
    
      Serial.print("compiled: ");
      Serial.print(__DATE__);
      Serial.println(__TIME__);
    
      Rtc.Begin();
    
      RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
      printDateTime(compiled);
      Serial.println();
    
      if (!Rtc.IsDateTimeValid()) {
        // Common Causes:
        //    1) first time you ran and the device wasn't running yet
        //    2) the battery on the device is low or even missing
    
        Serial.println("RTC lost confidence in the DateTime!");
        Rtc.SetDateTime(compiled);
      }
    
      if (Rtc.GetIsWriteProtected()) {
        Serial.println("RTC was write protected, enabling writing now");
        Rtc.SetIsWriteProtected(false);
      }
    
      if (!Rtc.GetIsRunning()) {
        Serial.println("RTC was not actively running, starting now");
        Rtc.SetIsRunning(true);
      }
    
      RtcDateTime now = Rtc.GetDateTime();
      if (now < compiled) {
        Serial.println("RTC is older than compile time!  (Updating DateTime)");
        Rtc.SetDateTime(compiled);
      } else if (now > compiled) {
        Serial.println("RTC is newer than compile time. (this is expected)");
      } else if (now == compiled) {
        Serial.println("RTC is the same as compile time! (not expected but all is fine)");
      }
    }
    
  4. loop() Funktion

    Diese Funktion liest regelmäßig das aktuelle Datum und die aktuelle Uhrzeit vom RTC aus und gibt sie im seriellen Monitor aus. Sie prüft auch, ob die RTC weiterhin eine gültige Zeit und ein gültiges Datum beibehält.

    void loop() {
      RtcDateTime now = Rtc.GetDateTime();
    
      printDateTime(now);
      Serial.println();
    
      if (!now.IsValid()) {
        // Common Causes:
        //    1) the battery on the device is low or even missing and the power line was disconnected
        Serial.println("RTC lost confidence in the DateTime!");
      }
    
      delay(5000);  // five seconds
    }
    
  5. Datum- und Zeitdruckfunktion

    Eine Hilfsfunktion, die ein RtcDateTime-Objekt nimmt und das formatierte Datum und die Uhrzeit im seriellen Monitor ausgibt.

    void printDateTime(const RtcDateTime& dt) {
      char datestring[20];
    
      snprintf_P(datestring,
                 countof(datestring),
                 PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
                 dt.Month(),
                 dt.Day(),
                 dt.Year(),
                 dt.Hour(),
                 dt.Minute(),
                 dt.Second());
      Serial.print(datestring);
    }
    

Weitere Ideen

  • Anzeige der Uhrzeit auf einem LCD oder im seriellen Monitor

  • Planung von Ereignissen/Weckern zu bestimmten Zeiten