Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Über mich
  • Deutsch
  • English
Menu

Franzis Adventskalender für Arduino – Tag 14

Posted on 14. Dezember 202226. Mai 2023 by Stefan Draeger

In diesem Beitrag möchte ich mit dir das vierzehnte Türchen des Franzis Adventskalender für Arduino öffnen.

Franzis Adventskalender für Arduino - Tag 14
Franzis Adventskalender für Arduino – Tag 14

Wenn wir nun das vierte Türchen öffnen, finden wir wieder einmal zwei kleine 10 cm Breadboardkabel mit Buchse & Stecker.

Da man auch wieder mit diesen beiden Bauteilen nicht viel machen kann, möchte ich dir heute eine nützliche Funktion zeigen, wie du das aktuelle Datum und die Uhrzeit ermitteln kannst.

Tage bis Weihnachten berechnen

Im heutigen Beispiel möchte ich dir zeigen, wie du die Tage bis Weihnachten berechnen kannst.

Da ich diese Beiträge für den Monat Dezember vorproduziert habe, ist mein Datum noch im Monat November.

Eigentlich benötigen wir für Datum & Uhrzeit eine RealTimeClock oder einen NTP-Server Zugriff. Da wir aber beides am Arduino Nano nicht haben (und auch nicht im Bausatz enthalten ist) müssen wir uns anders behelfen.

Nachfolgend zeige ich dir zwei kleine RTCs vom Typ DS3221, auf diesen kannst du einmalig einen Zeitstempel speichern und die Zeit läuft quasi auf diesen weiter, durch die enthaltene Batterie geht dieser Wert auch nicht so schnell verloren.

Aber wir haben in diesem Adventskalender keine RTC daher benötigen wir eine andere Lösung.

Eingabe des Datums per serieller Schnittstelle

Man kann im seriellen Monitor nicht nur Daten lesen, sondern kann auch Daten an den Mikrocontroller senden, welche wir auswerten / verarbeiten können.

Zunächst müssen wir prüfen, ob Daten an der Schnittstelle anliegen und wenn dieses der Fall ist, möchten wir diese auslesen und wiederum auf der seriellen Schnittstelle ausgeben, somit werden diese im seriellen Monitor sichtbar.

void setup() {
  // beginn der seriellen Kommunikation mit 9600 baud
  Serial.begin(9600);
}

void loop() {
  // Wenn Daten anliegen, dann...
  if (Serial.available() > 0) {
    // auslesen der Daten von der seriellen Schnittstelle
    // als String
    String text = Serial.readString();
    // Ausgeben der empfangenen Daten im seriellen Monitor
    Serial.print("Empfangen:"+text);
  }
}

Parsen eines Datums

Nun können wir statt einem Text auch ein Datum im Format dd.MM.YYYY (Tag.Monat.Jahr) absenden verarbeiten.

void setup() {
  // beginn der seriellen Kommunikation mit 9600 baud
  Serial.begin(9600);
}

void loop() {
  // Wenn Daten anliegen, dann...
  if (Serial.available() > 0) {
    // auslesen der Daten von der seriellen Schnittstelle
    // als String
    String text = Serial.readString();
    // Ausgeben der empfangenen Daten im seriellen Monitor
    Serial.print("Empfangen:" + text);
    //Es wird ein Datum im Format TagTag.MonatMonat.Jahrvoid setup() {
    // beginn der seriellen Kommunikation mit 9600 baud
    Serial.begin(9600);
  }

  void loop() {
    // Wenn Daten anliegen, dann...
    if (Serial.available() > 0) {
      // auslesen der Daten von der seriellen Schnittstelle
      // als String
      String text = Serial.readString();
      // Ausgeben der empfangenen Daten im seriellen Monitor
      Serial.print("Empfangen:" + text);

      // Es wird fest gelegt das ein Datum im
      // Format Tag.Monat.Jahr gesendet / empfangen wird.
      // zbsp. 01.12.2022 für den ersten Dezember im Jahr 2022

      // Funktion substring liefert einen Teil eines Strings
      // mit einer festen länge. Das erste Zeichen hat den Index 0!
      // Wobei der letzte Index nicht mitgeliefert wird.

      // der Tag von Zeichen 0 bis 2 (die Zeichen von 01 aus dem Beispiel)
      int tag = text.substring(0, 2).toInt();
      // der Monat von Zeichen 3 bis 5 (ohne den Punkt, die Zeichen 12 aus dem Beispiel)
      int monat = text.substring(3, 5).toInt();
      // das Jahr von Zeichen 6 bis 10 (ohne den Punkt, die Zeichen 2022 aus dem Beispiel)
      int jahr = text.substring(6, 10).toInt();

      //Ausgeben der Daten auf der seriellen Schnittstelle
      Serial.println("Tag:" + String(tag, DEC));
      Serial.println("Monat:" + String(monat, DEC));
      Serial.println("Jahr:" + String(jahr, DEC));
    }
  }

Was in dem Code noch fehlt, ist die Prüfung, ob der empfange, Text nur Zahlen enthält und ob es sich um ein gültiges Datumsformat handelt.

Dieses Datum können wir zbsp. mit einem regulären Ausdruck prüfen, wie du dieses machst, habe ich dir im Beitrag Arduino – reguläre Ausdrücke verwenden gezeigt. In diesem Beitrag möchte ich jedoch dieses auslassen.

Damit wir nun die Tage bis Weihnachten, also den 24. Dezember berechnen können, müssen wir einiges über Zeit erfahren, denn auf dem Computer läuft die Zeit erst ab dem 01.01.1970. Ab da zählt ein Timer die Millisekunden hoch, dieses nennt man auch den Unix Timestamp.

Wir haben also jetzt einen gemeinsamen Ausgangspunkt (den 01.01.1970) somit müssen wir nur die Millisekunden seit diesem zu heute und bis zum Heiligabend berechnen und der Rest ist einfache Subtraktion. Dann wiederum das Ergebnis von Millisekunden in Tage oder Stunden umrechnen.

Um uns die Berechnung des Unix Timestamp einfacher zu machen, gibt es auch hier wieder eine Bibliothek, welche wir einbinden und einfach verwenden können. Es gibt zwei wege diese einzubinden, zum einen ladet man sich eine ZIP-Datei vom GitHub Repository https://github.com/PaulStoffregen/Time herunter oder man sucht in dem Bibliotheksverwalter der Arduino IDE danach. In diesem Fall war es einfacher, die ZIP-Datei herunterzuladen.

GitHub Repo von Paul Stoffregen für die Time Bibliothek
GitHub Repo von Paul Stoffregen für die Time Bibliothek

Diese ZIP-Datei binden wir nun über das Hauptmenü „Sketch“ > „Include Library“ > „Add .ZIP Library…“ ein.

einbinden einer ZIP-Datei als Bibliothek in der Arduino IDE 2.0
einbinden einer ZIP-Datei als Bibliothek in der Arduino IDE 2.0

Einbinden der Time Bibliothek in den bestehenden Code

Da nun die Bibliothek zur Arduino IDE hinzugefügt wurde, müssen wir diese noch mit einem Include Befehl einbinden und ein Objekt initialisieren.

#include <TimeLib.h>

void setup() {
  // beginn der seriellen Kommunikation mit 9600 baud
  Serial.begin(9600);
}


void loop() {
  // Wenn Daten anliegen, dann...
  if (Serial.available() > 0) {
    // auslesen der Daten von der seriellen Schnittstelle
    // als String
    String text = Serial.readString();
    // Ausgeben der empfangenen Daten im seriellen Monitor
    Serial.print("Empfangen:" + text);

    // Es wird fest gelegt das ein Datum im
    // Format Tag.Monat.Jahr gesendet / empfangen wird.
    // zbsp. 01.12.2022 für den ersten Dezember im Jahr 2022

    // Funktion substring liefert einen Teil eines Strings
    // mit einer festen länge. Das erste Zeichen hat den Index 0!
    // Wobei der letzte Index nicht mitgeliefert wird.

    // der Tag von Zeichen 0 bis 2 (die Zeichen von 01 aus dem Beispiel)
    int tag = text.substring(0, 2).toInt();
    // der Monat von Zeichen 3 bis 5 (ohne den Punkt, die Zeichen 12 aus dem Beispiel)
    int monat = text.substring(3, 5).toInt();
    // das Jahr von Zeichen 6 bis 10 (ohne den Punkt, die Zeichen 2022 aus dem Beispiel)
    int jahr = text.substring(6, 10).toInt();

    //Ausgeben der Daten auf der seriellen Schnittstelle
    Serial.println("Tag:" + String(tag, DEC));
    Serial.println("Monat:" + String(monat, DEC));
    Serial.println("Jahr:" + String(jahr, DEC));

    //Befüllen eines tmElements mit den ermittelten Werten
    tmElements_t current_time;

    current_time.Second = 0;
    current_time.Hour = 0;
    current_time.Minute = 0;
    current_time.Day = tag;
    current_time.Month = monat;
    current_time.Year = jahr - 1970;

    time_t unix_timestamp;
    unix_timestamp = makeTime(current_time);
    //Ausgeben des Unix Timestamps auf der seriellen Schnittstelle
    Serial.print("Unix Timestamp:");
    Serial.println(unix_timestamp);
  }
}

Wenn man nun wie zuvor in dem seriellen Monitor ein valides Datum eingibt, dann erhält man einen Unix Timestamp welchen man wiederum auf der Webseite https://www.unixtimestamp.com/ eingeben kann.

Berechnen der Tage bis Heiligabend

Mit diesem ermittelten Zeitstempel können wir jetzt die Tage, Stunden, Minuten, Sekunden bis Heiligabend ermitteln.

//Befüllen eines tmElements mit den ermittelten Werten
tmElements_t current_time;

current_time.Second = 0;
current_time.Hour = 0;
current_time.Minute = 0;
current_time.Day = tag;
current_time.Month = monat;
current_time.Year = jahr - 1970;

time_t current_unix_timestamp;
current_unix_timestamp = makeTime(current_time);

tmElements_t xmas_time;

xmas_time.Second = 0;
xmas_time.Hour = 0;
xmas_time.Minute = 0;
xmas_time.Day = 24;
xmas_time.Month = 12;
xmas_time.Year = jahr - 1970;

time_t xmas_unix_timestamp;
xmas_unix_timestamp = makeTime(xmas_time);

//Ausgeben des Unix Timestamps auf der seriellen Schnittstelle
Serial.print("aktueller Unix Timestamp:");
Serial.println(current_unix_timestamp);

Serial.print("xmas Unix Timestamp:");
Serial.println(xmas_unix_timestamp);

long differenzInSekunden = xmas_unix_timestamp - current_unix_timestamp;
Serial.print("differenz in Sekunden:");
Serial.println(differenzInSekunden);

Serial.print("Tage bis Heiligabend:");
Serial.print(differenzInSekunden / 60 / 60 / 24);
Serial.println(" d");

Serial.print("Stunden bis Heiligabend:");
Serial.print(differenzInSekunden / 60 / 60);
Serial.println(" h");

Serial.print("Minuten bis Heiligabend:");
Serial.print(differenzInSekunden / 60);
Serial.println(" min.");

Serial.print("Sekunden bis Heiligabend:");
Serial.print(differenzInSekunden);
Serial.println(" sek.");

Wenn wir jetzt das heutige Datum im seriellen Monitor an den Mikrocontroller senden, dann werden die Tage, Stunden, Minuten und Sekunden bis Heiligabend berechnet.

Der nächste Schritt könnte nun sein auch die Uhrzeit mit einzubinden um somit einen etwas genaueren Wert zu erhalten.

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen

Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}