Zeit anzei­gen mit einem RTC-Modul

Lese­zeit: 6 Minu­ten
Lösung
Seite als PDF
Navi­ga­ti­on

RTC-Modul DS 3231

Der Ardui­no kann nur ab dem Zeit­punkt des Ein­schal­tens die Zeit mes­sen. Das aktu­el­le Datum und die Zeit kann nur mit einem RTC-Modul gesetzt und gele­sen wer­den.
Hier soll das Modul DS3231 zum Ein­satz kommen. 

Auf dem LCD soll der Wochen­tag, das Datum und die aktu­el­le Uhr­zeit ange­zeigt werden.

So sieht es auf dem LCD aus:

Anzei­ge im Seri­el­len Monitor:

Download

Zeit im Seri­el­len Moni­tor anzeigen

Schlie­ße das LCD an:

LCD

RTC-Modul

Nor­ma­ler­wei­se wäre eine kom­ple­xe Ver­ka­be­lung zum Betrieb eines LCDs nötig. Der ➨I2C-Bus regelt über einen eige­nen Mikro­pro­zes­sor die Kom­mu­ni­ka­ti­on der Daten­lei­tun­gen unter­ein­an­der. Es wer­den des­halb nur vier Anschlüs­se benötigt.

Die Hel­lig­keit kann mit einem Poten­tio­me­ter auf der Rück­sei­te des LCDs ein­ge­stellt werden.

Benö­tig­te Bauteile:

  • LCD I2C 1602
  • RTC-Modul DS3231
  • Lei­tungs­dräh­te

Baue die Schal­tung auf.
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

Benö­tig­te Bibliotheken:

Sketch → Biblio­thek ein­bin­den → Biblio­the­ken verwalten

Defi­nie­re die Varia­blen und bin­de die benö­tig­ten Biblio­the­ken ein:

# include <RTClib.h>
# include <LiquidCrystal_I2C.h>

// Name des RTC-Moduls
RTC_DS3231 rtc;

// Name des LCD-Moduls
LiquidCrystal_I2C lcd(0x27, 20, 4);

Der setup-Teil:

void setup()
{
  // RTC-Modul starten
  rtc.begin();

  /*
    wenn Datum und Zeit nicht korrekt -> Datum/Zeit setzen
    Jahr, Monat, Tag, Stunde, Minute, Sekunde
    rtc.adjust(DateTime(2020, 12, 13, 13, 31, 30));
  */

  // LCD starten
  lcd.init();
  lcd.backlight();
}

Ver­wen­de die­se Schlüs­sel­wör­ter für die Aus­ga­be auf dem LCD.
rtc -> Name des Moduls
aktu­ell -> aktu­el­le Zeit (DateTime aktu­ell = rtc​.now();)

Schlüs­sel­wortAnzei­ge
adjust(DateTime(Jahr Monat, Tag, Stun­de, Minu­te, Sekunde);Bei­spiel:
rtc.adjust(DateTime(2020, 12, 13, 13, 31, 30));
aktuell.dayOfTheWeek()Num­mer des Wochentages
0 = Sonntag
1 = Montag
. . .
6 = Samstag
aktu​ell​.day()Tag
aktuell.month()Monat
1 = Januar
2 = Februar
...
12 = Dezember
aktuell.year()Jahr
aktuell.hour()Stun­de
aktuell.minute())Minu­te
aktuell.second())Sekun­de
Uhr­zeit als Array definieren:
char Zeit[] = "Uhr­zeit: hh:mm:ss";
print(aktuell.toString(Zeit));
hh = Stunden
mm = Minuten
ss = Sekunden
Datum als Array definieren:
char Datum[] = "DD.MM.YYYY";
print(aktuell.toString(Datum));
DD = Tag
MM = Monat
YYYY = 4-stelliges Jahr
now()aktu­el­le Zeit holen

Der loop-Teil. Beach­te die Kommentare.

void loop()
{
  // aktuelle Zeit holen
  DateTime aktuell = rtc.now();
  lcd.setCursor(0, 0);

  /*
    Wochentag anzeigen
    0 = Sonntag
    1 = Montag
    ...
    6 = Samstag
  */
  switch (aktuell.dayOfTheWeek())
  {
    case 0:
      lcd.print("Sonntag");
      break;
    case 1:
      lcd.print("Montag");
      break;
    case 2:
      lcd.print("Dienstag");
      break;
    case 3:
      lcd.print("Mittwoch");
      break;
    case 4:
      lcd.print("Donnerstag");
      break;
    case 5:
      lcd.print("Freitag");
      break;
    case 6:
      lcd.print("Samstag");
      break;
  }

  // Datum anzeigen
  lcd.setCursor(0, 1);

  char Datum[] = "Datum: DD.MM.YYYY";
  lcd.print(aktuell.toString(Datum));

  // Zeit anzeigen
  lcd.setCursor(0, 2);

  char Zeit[] = "Uhrzeit hh:mm:ss";
  lcd.print(aktuell.toString(Zeit));

  delay(1000);
}

Du kannst auch die Monats­na­men anzei­gen lassen:

void loop()
{
  // aktuelle Zeit holen
  DateTime aktuell = rtc.now();
  lcd.setCursor(0, 0);

  /* 
    Wochentag anzeigen
    0 = Sonntag
    1 = Montag
    ...
    6 = Samstag
  */
  switch (aktuell.dayOfTheWeek())
  {
    case 0:
      lcd.print("Sonntag");
      break;
    case 1:
      lcd.print("Montag");
      break;
    case 2:
      lcd.print("Dienstag");
      break;
    case 3:
      lcd.print("Mittwoch");
      break;
    case 4:
      lcd.print("Donnerstag");
      break;
    case 5:
      lcd.print("Freitag");
      break;
    case 6:
      lcd.print("Samstag");
      break;
  }

  // Leerzeichen hinzufügen
  lcd.print(" ");
  
  // Datum anzeigen -> Tag
  lcd.setCursor(0, 1);
  lcd.print(String(aktuell.day()) + ".");

  /* 
   Monatsnamen anzeigen
   1 = Januar
   2 = Februar
   ...
   12 = Dezember
  */
  lcd.print(" ");

  switch (aktuell.month())
  {
    case 1:
      lcd.print("Januar");
      break;
    case 2:
      lcd.print("Februar");
      break;
    case 3:
      lcd.print("M\341rz");
      break;
    case 4:
      lcd.print("April");
      break;
    case 5:
      lcd.print("Mai");
      break;
    case 6:
      lcd.print("Juni");
      break;
    case 7:
      lcd.print("Juli");
      break;
    case 8:
      lcd.print("August");
      break;
    case 9:
      lcd.print("September");
      break;
    case 10:
      lcd.print("Oktober");
      break;
    case 11:
      lcd.print("November");
      break;
    case 12:
      lcd.print("Dezember");
      break;
  }
  lcd.print(" ");

  // Jahr anzeigen
  lcd.print(String(aktuell.year()));

  // Zeit anzeigen
  lcd.setCursor(0, 2);

  char Zeit[] = "Uhrzeit: hh:mm:ss";
  lcd.print(aktuell.toString(Zeit));

  delay(1000);
}

Eine wei­te­re Alter­na­ti­ve: Zeit mit den Metho­den hour(), minu­te() und second() anzeigen:

void loop()
{
  // aktuelle Zeit lesen
  DateTime aktuell = rtc.now();

  // Wochentag, Datum und Zeit anzeigen
  lcd.setCursor(0, 0);

  /*
    Wochentag anzeigen
    0 = Sonntag
    1 = Montag
    ...
    6 = Samstag
  */
  switch (aktuell.dayOfTheWeek())
  {
    case 0:
      lcd.print("Sonntag");
      break;
    case 1:
      lcd.print("Montag");
      break;
    case 2:
      lcd.print("Dienstag");
      break;
    case 3:
      lcd.print("Mittwoch");
      break;
    case 4:
      lcd.print("Donnerstag");
      break;
    case 5:
      lcd.print("Freitag");
      break;
    case 6:
      lcd.print("Samstag");
      break;
  }

  lcd.setCursor(0, 1);
  lcd.print(aktuell.day());
  lcd.print(".");

  // Monatsnamen anzeigen
  lcd.print(" ");

  switch (aktuell.month())
  {
    case 1:
      lcd.print("Januar");
      break;
    case 2:
      lcd.print("Februar");
      break;
    case 3:
      lcd.print("M\341rz");
      break;
    case 4:
      lcd.print("April");
      break;
    case 5:
      lcd.print("Mai");
      break;
    case 6:
      lcd.print("Juni");
      break;
    case 7:
      lcd.print("Juli");
      break;
    case 8:
      lcd.print("August");
      break;
    case 9:
      lcd.print("September");
      break;
    case 10:
      lcd.print("Oktober");
      break;
    case 11:
      lcd.print("November");
      break;
    case 12:
      lcd.print("Dezember");
      break;
  }
  lcd.print(" ");

  lcd.print(aktuell.year());
  lcd.setCursor(0, 2);
  
  // wenn Stunden < 10 -> führende 0 setzen
  if (aktuell.hour() < 10) lcd.print("0");
  lcd.print(aktuell.hour());
  lcd.print(':');
 
  // wenn Minuten < 10 -> führende 0 setzen
  if (aktuell.minute() < 10) lcd.print("0");
  lcd.print(aktuell.minute());
  lcd.print(':');
 
  // wenn Sekunden < 10 -> führende 0 setzen
  if (aktuell.second() < 10) lcd.print("0");
  lcd.print(aktuell.second());
 }

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 16. Jul 2021 @ 10:39