Echtzeituhr (RTC)

Projekt I06 - DS1307/DS3231 Real-Time Clock

Intermediate
DS1307
I2C
1
Lernziele

Was du lernst

  • Echtzeituhr (RTC) - Zeit unabhaengig vom Arduino messen
  • Batterie-Backup - Zeit auch bei Stromausfall behalten
  • DateTime-Objekte - Datum und Zeit strukturiert verarbeiten
  • I2C-Kommunikation - Daten ueber zwei Leitungen austauschen

Voraussetzungen

Beginner-Projekte B01-B08 abgeschlossen, Grundlagen von I2C aus B07 (LCD) bekannt

Komponenten

Was du brauchst

DS1307 vs DS3231

DS1307DS3231
Genauigkeit+/- 2 Sek/Tag+/- 2 Sek/Monat
TemperaturNeinIntegriert
PreisGuenstigerTeurer
I2C Adresse0x680x68

Tipp: Die RTClib funktioniert mit beiden!

🔋

Backup-Batterie

Eine CR2032 Knopfzelle haelt die Zeit, wenn der Arduino stromlos ist.

  • Spannung: 3V Lithium
  • Lebensdauer: 5-10 Jahre typisch
  • Wichtig: Polaritaet beachten!

I2C Pins am Arduino Uno

A4 = SDA (Datenleitung) | A5 = SCL (Taktleitung) - Diese Pins sind fest vorgegeben!

2
Theorie

Wie funktioniert eine RTC?

Quarz-Oszillator

  • Praeziser 32.768 kHz Kristall
  • Schwingt 32768 Mal pro Sekunde
  • 2^15 = exakt 1 Sekunde zaehlen
  • Temperaturkompensiert beim DS3231

Unix-Timestamp

Sekunden seit 1. Januar 1970. Einfach zu speichern und zu vergleichen!

1704067200 = 1.1.2024 00:00:00

RTC Blockdiagramm

┌─────────────────────────────┐
│         DS1307/DS3231       │
│  ┌─────────┐  ┌──────────┐  │
│  │ 32.768  │  │ Sekunden │  │
│  │  kHz    │→→│ Minuten  │  │
│  │ Quarz   │  │ Stunden  │  │
│  └─────────┘  │ Datum    │  │
│               └──────────┘  │
│  ┌─────────┐       ↑↓       │
│  │ Batterie│  ┌──────────┐  │
│  │ CR2032  │  │   I2C    │  │
│  └─────────┘  │ Interface│  │
└───────────────┴──────────┴──┘
                    ↕
              SDA  SCL
            

Speicher: 56 Bytes RAM fuer eigene Daten

Schaltplan

Verbindungen zum Arduino

Wokwi-Aufbau

    Arduino Uno           DS1307
   ┌───────────┐        ┌───────┐
   │           │        │       │
   │  5V ──────┼────────┼─ VCC  │
   │           │        │       │
   │  A4 ──────┼────────┼─ SDA  │
   │           │        │       │
   │  A5 ──────┼────────┼─ SCL  │
   │           │        │       │
   │  GND ─────┼────────┼─ GND  │
   │           │        │       │
   └───────────┘        └───────┘
            

Wichtige Verbindungen

  • RTC VCC → Arduino 5V
  • RTC SDA → Arduino A4
  • RTC SCL → Arduino A5
  • RTC GND → Arduino GND

I2C Pull-Ups

Die meisten RTC-Module haben bereits integrierte 4.7k Pull-Up Widerstaende. In Wokwi nicht noetig.

3
Code

Schritt 1: Library einbinden

// Schritt 1: RTC-Library einbinden

#include <Wire.h>      // I2C-Kommunikation
#include <RTClib.h>   // RTC-Bibliothek von Adafruit

// RTC-Objekt erstellen (funktioniert mit DS1307 und DS3231)
RTC_DS1307 rtc;

// Wochentage auf Deutsch
const char* wochentage[] = {
    "Sonntag", "Montag", "Dienstag", "Mittwoch",
    "Donnerstag", "Freitag", "Samstag"
};

Erklaerung

  • Wire.h - Standard I2C-Library
  • RTClib.h - Vereinfacht RTC-Zugriff
  • RTC_DS1307 - Auch fuer DS3231 nutzbar

Alternative Klassen

RTC_DS3231 fuer DS3231-spezifische Features wie Temperaturauslese.

3
Code

Schritt 2: Zeit lesen

void setup() {
    Serial.begin(9600);

    if (!rtc.begin()) {
        Serial.println("RTC nicht gefunden!");
        while (true);  // Anhalten
    }

    // Pruefen ob RTC laeuft (Batterie leer?)
    if (!rtc.isrunning()) {
        Serial.println("RTC laeuft nicht - setze Zeit...");
        // Zeit auf Kompilierzeitpunkt setzen
        rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    }
}

void loop() {
    // DateTime-Objekt mit aktueller Zeit
    DateTime now = rtc.now();

    Serial.println(now.hour());    // 0-23
    Serial.println(now.minute());  // 0-59
    Serial.println(now.second());  // 0-59

    delay(1000);
}

DateTime-Objekt

rtc.now() liefert ein DateTime-Objekt mit allen Zeit- und Datumsinformationen. Einmal abfragen, mehrfach nutzen!

3
Code

Schritt 3: Formatierte Ausgabe

void loop() {
    DateTime now = rtc.now();

    // Datum formatiert ausgeben: DD.MM.YYYY
    if (now.day() < 10) Serial.print("0");
    Serial.print(now.day());
    Serial.print(".");
    if (now.month() < 10) Serial.print("0");
    Serial.print(now.month());
    Serial.print(".");
    Serial.print(now.year());
    Serial.print(" (");
    Serial.print(wochentage[now.dayOfTheWeek()]);
    Serial.println(")");

    // Zeit formatiert: HH:MM:SS
    if (now.hour() < 10) Serial.print("0");
    Serial.print(now.hour());
    Serial.print(":");
    if (now.minute() < 10) Serial.print("0");
    Serial.print(now.minute());
    Serial.print(":");
    if (now.second() < 10) Serial.print("0");
    Serial.println(now.second());

    // Unix-Timestamp
    Serial.print("Unix: ");
    Serial.println(now.unixtime());

    delay(1000);
}

DateTime Methoden

year(), month(), day(), hour(), minute(), second(), dayOfTheWeek() (0=So), unixtime()

Ausprobieren

Simulation in Wokwi

Wokwi Projekt

Erstelle ein neues Projekt mit Arduino Uno und DS1307:

So testest du

  • Fuege einen DS1307 hinzu (Suche: "ds1307" oder "rtc")
  • Verbinde: VCC → 5V, SDA → A4, SCL → A5, GND → GND
  • Kopiere den Code in die sketch.ino
  • Klicke auf Play - im Serial Monitor erscheint die Zeit
  • Tipp: In Wokwi kannst du die simulierte Zeit aendern!
4
Challenges

Erweiterungen

Probiere diese Aufgaben aus

📺

Challenge 1: LCD Uhr

Zeige Uhrzeit und Datum auf einem LCD Display an

Challenge 2: Wecker

Wecker mit einstellbarer Zeit und Buzzer-Alarm

Challenge 3: Stoppuhr

Stoppuhr mit Start/Stop/Reset Tastern

Challenge 4: Countdown

Countdown-Timer mit LED-Warnung bei Ablauf

Geschafft!

Du kannst jetzt Zeit unabhaengig vom Arduino messen

📅

DateTime

Zeit und Datum als Objekt

🔋

Batterie-Backup

Zeit bleibt bei Stromausfall

🔗

I2C Bus

Nur 2 Leitungen noetig

Naechstes Projekt

I07: Drehgeber (Rotary Encoder) - Praezise Eingaben mit Drehbewegungen

← →
1 / 11