RTC Arduino
FunduinoDernière mise à jour le
Datum und Uhrzeit mit DS1307 und DS3231 – auf dem LCD und im seriellen Monitor
Wozu ein RTC-Modul gut ist
1 / 2
Schaltung aufbauen
1 / 3
Bibliotheken installieren und die Uhr stellen
Uhrzeit und Datum anzeigen
Uhrzeit und Datum auf einem LCD anzeigen (DS1307)
#include <Wire.h>
#include <LiquidCrystal.h>
#include <time.h>
#include <DS1307RTC.h>
// Hier wird festgelegt, welche Pins des Mikrocontrollerboards für das LCD verwendet werden.
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
// Im Setup wird angegeben, wie viele Zeichen und Zeilen verwendet werden.
lcd.begin(16, 2);
// Öffnet den seriellen Port und legt die Baudrate (9600) für die Übertragung fest.
Serial.begin(9600);
// Diese Funktion holt Zeit und Datum von der RTC.
setSyncProvider(RTC.get);
}
void loop()
{
// Serial.print zeigt etwas im seriellen Monitor an:
// Stunde, Minute, Sekunde, Leerzeichen, Tag, Leerzeichen und so weiter.
Serial.print(hour());
// Bei Minuten und Sekunden wird printDigits verwendet,
// das am Ende des Sketches festgelegt wird.
printDigits(minute());
printDigits(second());
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(month());
Serial.print(" ");
Serial.print(year());
Serial.println();
delay(1000); // eine Sekunde warten
// setCursor gibt an, wo der Text beginnen soll:
// hier beim dritten Zeichen in der ersten Zeile.
lcd.setCursor(2, 0);
lcd.print(hour());
lcd.print(":");
lcd.print(minute());
lcd.print(":");
lcd.print(second());
lcd.print(" ");
// Hinter der Uhrzeit erscheint das Wort "Uhr". Danach folgen drei Leerzeichen,
// sonst bliebe bei Zahlen unter 10 ein weiteres "r" hinter "Uhr" stehen: Die
// LCD-Bibliothek kennt keinen Befehl, der Zahlen unter 10 eine 0 voranstellt.
lcd.print("Uhr");
lcd.print(" ");
lcd.print(" ");
lcd.print(" ");
// Der nächste Text beginnt beim zweiten Zeichen in der zweiten Zeile.
lcd.setCursor(1, 1);
lcd.print(day()); // Das Datum wird als
lcd.print("."); // "Tag"."Monat"."Jahr" angegeben.
lcd.print(month());
lcd.print(".");
lcd.print(year());
}
// Hier wird festgelegt, dass Zahlen unter 10 im seriellen Monitor automatisch eine 0
// vorangestellt bekommen. Das gilt nur für den seriellen Monitor, nicht für das LCD.
void printDigits(int digits)
{
Serial.print(":");
if (digits < 10)
Serial.print('0');
Serial.print(digits);
}Erweiterung: Wochentag anzeigen
Erweiterung: Wochentag anzeigen
// Hier wird für den vorher im Sketch verwendeten Befehl printDay festgelegt, was er tut.
void printDay()
{
int wochentag;
wochentag = weekday(); // Der Wochentag ergibt sich aus dem Datum.
if (wochentag == 1) { lcd.print("So, "); } // Tag 1 ist Sonntag,
if (wochentag == 2) { lcd.print("Mo, "); } // Tag 2 ist Montag und so weiter.
if (wochentag == 3) { lcd.print("Di, "); }
if (wochentag == 4) { lcd.print("Mi, "); }
if (wochentag == 5) { lcd.print("Do, "); }
if (wochentag == 6) { lcd.print("Fr, "); }
if (wochentag == 7) { lcd.print("Sa, "); }
}Zwei I²C-Bauteile gleichzeitig: Adresse des LCD ändern
1 / 2
Uhrzeit auf einem I²C-LCD anzeigen
Uhrzeit und Datum auf einem I²C-LCD anzeigen (DS1307)
// Bibliotheken laden
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <time.h>
#include <DS1307RTC.h>
// Das I²C-Display benennen und seine HEX-Adresse eintragen (hier 0x3D).
LiquidCrystal_I2C lcd(0x3D, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup()
{
lcd.begin(16, 2); // Display starten: 16 Zeichen in 2 Zeilen
lcd.backlight(); // Beleuchtung des Displays einschalten
Serial.begin(9600); // Serielle Verbindung mit Baudrate 9600 starten
setSyncProvider(RTC.get); // Daten von der RTC abrufen
}
void loop()
{
// Ausgabe im seriellen Monitor:
// Stunde, Minute, Sekunde, Leerzeichen, Tag, Leerzeichen und so weiter.
Serial.print(hour());
// Bei Minuten und Sekunden wird printDigits verwendet,
// das am Ende des Sketches festgelegt wird.
printDigits(minute());
printDigits(second());
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(month());
Serial.print(" ");
Serial.print(year());
Serial.println();
delay(1000); // eine Sekunde warten
// setCursor gibt an, wo der Text beginnen soll:
// hier beim dritten Zeichen in der ersten Zeile.
lcd.setCursor(2, 0);
lcd.print(hour()); // Die Uhrzeit erscheint im Format
lcd.print(":"); // Stunden:Minuten:Sekunden.
lcd.print(minute());
lcd.print(":");
lcd.print(second());
lcd.print(" ");
lcd.print("Uhr"); // Dahinter erscheint das Wort "Uhr".
lcd.print(" ");
lcd.print(" ");
lcd.print(" ");
// In der zweiten Zeile erscheint das Datum.
lcd.setCursor(1, 1);
lcd.print(day());
lcd.print(".");
lcd.print(month());
lcd.print(".");
lcd.print(year());
}
// Der printDigits-Befehl für den seriellen Monitor
void printDigits(int digits)
{
Serial.print(":");
if (digits < 10)
Serial.print('0');
Serial.print(digits);
}Der DS3231: zusätzlich die Temperatur messen
1 / 2
DS3231: Datum, Zeit und Temperatur im seriellen Monitor
// benötigte Bibliothek einbinden
#include <RTClib.h>
// Name des RTC-Moduls (rtc)
RTC_DS3231 rtc;
void setup()
{
// RTC-Modul starten
rtc.begin();
Serial.begin(9600);
/*
Wenn Datum und Zeit nicht korrekt sind: Datum und Zeit setzen.
Reihenfolge: Jahr, Monat, Tag, Stunde, Minute, Sekunde
Beispiel: 31. August 2022, 10 Uhr 31 Minuten 30 Sekunden
rtc.adjust(DateTime(2022, 8, 31, 10, 31, 30));
*/
}
void loop()
{
// rtc.now() holt die aktuelle Zeit
DateTime aktuell = rtc.now();
/*
Datumsformat festlegen
DD -> Tag mit führender 0
MM -> Monat mit führender 0
YYYY -> vollständige Angabe des Jahres
*/
char Datum[] = "DD.MM.YYYY ";
// Datum in eine Zeichenkette umwandeln und anzeigen
Serial.print(aktuell.toString(Datum));
// Format der Zeitangabe festlegen
char Zeit[] = "hh:mm:ss";
// Zeitangabe in eine Zeichenkette umwandeln und anzeigen
Serial.print(aktuell.toString(Zeit));
// Temperatur ermitteln
String Temperatur = String(rtc.getTemperature());
// Der Wert kommt im angelsächsischen Zahlenformat:
// den Punkt durch ein Komma ersetzen
Temperatur.replace(".", ",");
Serial.println(" Temperatur: " + Temperatur + "°C");
// 1 Sekunde Pause
delay(1000);
}Évaluer le guide