Datum, Uhr­zeit und Tem­pe­ra­tur auf einem LCD mit einem RTC-Modul anzeigen

Lese­zeit: 6 Minu­ten

Lösung
Seite als PDF

Der Ardui­no kann nur ab dem Zeit­punkt des Ein­schal­tens mit ➨mil­lis() die Zeit mes­sen. Das aktu­el­le Datum und die Uhr­zeit kann nur mit einem RTC-Modul gesetzt und gele­sen wer­den.
Hier soll das Modul DS3231 zum Ein­satz kom­men. Zusätz­lich zur Zeit misst das Modul auch die Temperatur.

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

So sieht es auf dem LCD aus:

Download

Zeit im Seri­el­len Moni­tor anzeigen

Download

Zeit im Seri­el­len Moni­tor mit Wochen­tag und Monats­na­men 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:

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 set­up-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(2023, 8, 4, 10, 30, 30));
    nach erfolgreichem Hochladen Kommentarzeichen hinzufügen
  */

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

Funk­tio­nen der Biblio­thek RTC­lib Adafruit

Schlüs­sel­wortAnzeige/Parameter
adjust(DateTime(Jahr Monat, Tag, Stun­de, Minu­te, Sekunde)Bei­spiel:
rtc.adjust(DateTime(2022, 12, 13, 13, 31, 30));
now()aktu­el­le Zeit holen
day­OfT­he­Week()Num­mer des Wochentages
0 = Sonntag
1 = Montag
. . .
6 = Samstag
day()Tag
month()Monat
1 = Januar
2 = Februar
...
12 = Dezember
year()Jahr
hour()Stun­de
minu­te())Minu­te
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-stel­li­ges Jahr
get­Tem­pe­ra­tu­re()Tem­pe­ra­tur ermitteln

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));

  // gemessene Temperatur in String umwandeln
  String Temperatur = String(rtc.getTemperature());

  // angelsächsische Schreibweise der Temperatur
  // . durch , ersetzen
  Temperatur.replace(".", ",");
  lcd.setCursor(0, 3);

  // Sonderzeichen für ° = \337
  // Temperatur anzeigen
  lcd.print("Temperatur: " + Temperatur + "\337C");

  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));

  // gemessene Temperatur in String umwandeln
  String Temperatur = String(rtc.getTemperature());

  // angelsächsische Schreibweise der Temperatur
  // . durch , ersetzen
  Temperatur.replace(".", ",");
  lcd.setCursor(0, 3);

  // Sonderzeichen für ° = \337
  // Temperatur anzeigen
  lcd.print("Temperatur: " + Temperatur + "\337C");

  delay(1000);
}

Eine wei­te­re Alter­na­ti­ve: Zeit mit den Funk­tio­nen 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());
  // gemessene Temperatur in String umwandeln
  String Temperatur = String(rtc.getTemperature());
  // angelsächsische Schreibweise der Temperatur
  // . durch , ersetzen
  Temperatur.replace(".", ",");
  lcd.setCursor(0, 3);
  // Sonderzeichen für ° = \337
  // Temperatur anzeigen
  lcd.print("Temperatur: " + Temperatur + "\337C");
 }

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 24. Okt 2023 @ 13:45