Projekt I06 - DS1307/DS3231 Real-Time Clock
Beginner-Projekte B01-B08 abgeschlossen, Grundlagen von I2C aus B07 (LCD) bekannt
Was du brauchst
| DS1307 | DS3231 | |
|---|---|---|
| Genauigkeit | +/- 2 Sek/Tag | +/- 2 Sek/Monat |
| Temperatur | Nein | Integriert |
| Preis | Guenstiger | Teurer |
| I2C Adresse | 0x68 | 0x68 |
Tipp: Die RTClib funktioniert mit beiden!
Eine CR2032 Knopfzelle haelt die Zeit, wenn der Arduino stromlos ist.
A4 = SDA (Datenleitung) | A5 = SCL (Taktleitung) - Diese Pins sind fest vorgegeben!
Sekunden seit 1. Januar 1970. Einfach zu speichern und zu vergleichen!
1704067200 = 1.1.2024 00:00:00
┌─────────────────────────────┐
│ DS1307/DS3231 │
│ ┌─────────┐ ┌──────────┐ │
│ │ 32.768 │ │ Sekunden │ │
│ │ kHz │→→│ Minuten │ │
│ │ Quarz │ │ Stunden │ │
│ └─────────┘ │ Datum │ │
│ └──────────┘ │
│ ┌─────────┐ ↑↓ │
│ │ Batterie│ ┌──────────┐ │
│ │ CR2032 │ │ I2C │ │
│ └─────────┘ │ Interface│ │
└───────────────┴──────────┴──┘
↕
SDA SCL
Speicher: 56 Bytes RAM fuer eigene Daten
Verbindungen zum Arduino
Arduino Uno DS1307
┌───────────┐ ┌───────┐
│ │ │ │
│ 5V ──────┼────────┼─ VCC │
│ │ │ │
│ A4 ──────┼────────┼─ SDA │
│ │ │ │
│ A5 ──────┼────────┼─ SCL │
│ │ │ │
│ GND ─────┼────────┼─ GND │
│ │ │ │
└───────────┘ └───────┘
Die meisten RTC-Module haben bereits integrierte 4.7k Pull-Up Widerstaende. In Wokwi nicht noetig.
// 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"
};Wire.h - Standard I2C-LibraryRTClib.h - Vereinfacht RTC-ZugriffRTC_DS1307 - Auch fuer DS3231 nutzbarRTC_DS3231 fuer DS3231-spezifische Features wie Temperaturauslese.
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);
}rtc.now() liefert ein DateTime-Objekt mit allen Zeit- und Datumsinformationen. Einmal abfragen, mehrfach nutzen!
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);
}year(), month(), day(), hour(), minute(), second(), dayOfTheWeek() (0=So), unixtime()
Simulation in Wokwi
Probiere diese Aufgaben aus
Zeige Uhrzeit und Datum auf einem LCD Display an
Wecker mit einstellbarer Zeit und Buzzer-Alarm
Stoppuhr mit Start/Stop/Reset Tastern
Countdown-Timer mit LED-Warnung bei Ablauf
Du kannst jetzt Zeit unabhaengig vom Arduino messen
Zeit und Datum als Objekt
Zeit bleibt bei Stromausfall
Nur 2 Leitungen noetig
I07: Drehgeber (Rotary Encoder) - Praezise Eingaben mit Drehbewegungen