Nr.05 – Arduino-RTC

Inhaltsverzeichnis

Uhrzeitmodul für Arduino: RTC – Real Time Clock

RTC Modul am Arduino Mikrocontroller
RTC Modul am Funduino UNO R3 Mikrocontroller (alte Version)

Mit der Arduino kompatiblen DS1307 I²C Realtime-Clock kann man Uhrzeit und Datum nahezu in Echtzeit anzeigen lassen.

Der Schaltplan - Hinweise zur Anwendung am MEGA2560 R3

Das LCD-Display wird im Prinzip wie in der Anleitung Nr. 13 verkabelt. Dazu kommt dann noch die RTC, welche einmal mit 5V und GND verbunden wird, der SDA-Kontakt an den analogen Eingang A4 und der SCL-Kontakt an den analogen Eingang A5.

Der Schaltplan

RTC Modul am UNO R3 Mikrocontroller

Installation der Bibliothek - DS1307RTC Library

Wenn alles richtig verkabelt ist, kann auch schon fast mit dem Programmieren begonnen werden. Vorher müssen für die Programmierung notwendige Libraries heruntergeladen und in der Arduino Software hinzugefügt werden.

Bei den benötigten Libraries handelt es sich einmal um die Time Library, die hier heruntergeladen werden kann und um die DS1307RTC Library, die hier heruntergeladen werden kann.

Wenn man beide Libraries heruntergeladen hat, muss man diese noch in der Arduino Software zu den bereits vorhandenen Libraries hinzufügen. Dazu öffnet man die Arduino Software und wählt unter dem Punkt „Sketch“ das Feld „Include Libraby“ aus. Danach kann man „Add .ZIP Library“ auswählen und die vorher heruntergeladenen Time und DS1307RTC Library hinzufügen.

Auf diese kann jetzt in einem Code zurückgegriffen werden.

Als Nächstes muss man den sogenannten „Set-Time“ Sketch hochladen, um die Zeit und das Datum vom Gerät (Computer, Laptop etc.), an dem der Mikrocontroller angeschlossen ist, auf der Realtime-Clock einzustellen.

Dies macht man, indem man unter „Datei“ auf „Beispiele“ dann „DS1307RTC“ den Punkt „Set Time“ auswählt. Es öffnet sich der entsprechende Sketch, welchen man nun auf den UNO R3 hochlädt.

Wenn man das alles erledigt hat, kann man zum eigentlichen Code kommen.

Der Programmcode

#include  Bibliotheken laden
#include <Wire.h>
#include 
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //In dieser Zeile wird festgelegt, welche Pins des Mikrocontrollerboards für das LCD verwendet wird

void setup() 
{
lcd.begin(16, 2); //Im Setup wird angegeben, wie viele Zeichen und Zeilen werwendet werden.
Serial.begin(9600); //Öffnet den seriellen Port und legt die Baud Rate (9600) für die serielle Übertragung fest.
setSyncProvider(RTC.get); //Dies ist die Funktion um die Zeit- und Datumsangabe von der RTC zu bekommen
}

void loop() 
{
Serial.print(hour()); //Serial.print ist der Befehl etwas im seriellen Monitor anzuzeigen (Stunde, Minute, Sekunde, Leerzeichen, Tag, Leerzeichen, usw.)
printDigits(minute()); //bei den Minuten und Sekunden wird der Befehl
printDigits(second()); //printDigits angegeben welcher am Ende des Codes noch festgelegt wird.
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(month());
Serial.print(" ");
Serial.print(year());
Serial.println();
delay(1000); //warte eine Sekunde
lcd.setCursor(2, 0); //setCursor gibt an wo der Text beginnen soll. In diesem Fall beim dritten Zeichen in der ersten Reihe.
lcd.print(hour()); //Hier soll jetzt die Uhrzeit angezeigt werden, also „hour“ „:“ „minute“ usw..
lcd.print(":");
lcd.print (minute());
lcd.print(":");
lcd.print(second());
lcd.print(" ");
lcd.print("Uhr"); //Hier soll nach der Uhrzeit noch das Wort „Uhr“ angezeigt werden, dazu müssen noch3 Leerzeichen folgen, sonst würde bei Zahlen <10 immer ein weiteres „r“ hinter Uhr angezeigt werden. Das liegt daran, dass in der LCD Library der Befehl eine 0 vor Zahlen <10 anzuzeigen nicht vorhanden ist.
lcd.print(" ");
lcd.print(" ");
lcd.print(" "); 
lcd.setCursor(1, 1); // Der nächste „Text“ soll nun beim zweiten Zeichen in der zweiten Reihe beginnen.
lcd.print(day()); // Das Datum soll nun als
lcd.print("."); // „Tag“, „.“ „Monat“ usw. angegeben werden.
lcd.print(month());
lcd.print(".");
lcd.print(year());
}

void printDigits(int digits) //In diesem Abschnitt wird festgelgt, dass bei Zahlen <10 im seriellen Monitor automatisch eine 0 vor den Ziffern angezeigt wird. Das gilt nur für den seriellen Monitor und nicht für LCD Display.
{ 
Serial.print(":"); 
if(digits < 10) 
Serial.print('0'); 
Serial.print(digits); 
}

Der Programmcode - Erweiterung: Anzeige von Wochentagen

Zusätzlich kann man vor dem Datum noch den Wochentag anzeigen lassen. Hierzu muss vor dem Datum im lcd.print Abschnitt der Befehl printDay(); gegeben und nach dem Loop folgender Code eingefügt werden:

void printDay() // Hier wird wird für den vorher im Code schon verwendeten Befehl printDay eine Bedeutung festgelegt
{	
int day;
day = weekday(); // Die Wochentage sollen abhängig vom Datum angezeigt werden.
if(day == 1){lcd.print("So, ");} // Wenn es sich um Tag 1 handelt soll „So“ usw. angezeigt werden.
if(day == 2){lcd.print("Mo, ");}	
if(day == 3){lcd.print("Di, ");}
if(day == 4){lcd.print("Mi, ");}
if(day == 5){lcd.print("Do, ");}
if(day == 6){lcd.print("Fr, ");}
if(day == 7){lcd.print("Sa, ");}
}

Erweiterung: Zwei I²C Bauteile gleichzeitig ansteuern: Uhrzeit und Datum mit einer Realtime-Clock mit I²C Bus auf einem I²C LCD anzeigen lassen

Um zwei I²C Komponenten gleichzeitig ansteuern zu können, muss eins der Bauteile eine andere I²C Adresse haben, als das andere. In unserem Fall können wir nur die Adresse des LCDs ändern. Sofern es die drei Lötstellen A0, A1 und A2 auf der Rückseite des I²C Moduls hat (siehe Bild).

HEX-Code-Brücke auf I2C LCD

Die I²C Adresse der Realtime-Clock ist festgelegt und kann nicht geändert werden.

Um die Adresse des LCDs zu ändern, müssen die Lötstellen anders verbunden sein, als zu Beginn (alle drei Lötstellen getrennt). So ändert sich die HEX Adresse des LCDs (s. Tabelle) (I = verbunden, := nicht verbunden):

I2C HEX Code Brücken Übersicht

Der Schaltplan

Installation der Bibliothek: LiquidCrystal

Zum Programmieren werden, wie oben schon erwähnt, die Time und die DS1307RTC Library benötigt. Außerdem wird für das I²C LCD die NewliquidCrystal_1.3.4 Library benötigt, welche hier heruntergeladen werden kann.

Alle Bibliotheken müssen der Arduino Software hinzugefügt werden:

Sketch > Include Library > Add ZIP library > vorher heruntergeladene Datei auswählen

Als Nächstes muss man den sogenannten „Set-Time“ Sketch hochladen, um die Zeit und das Datum vom Gerät (Computer, Laptop etc.), an dem der Mikrocontroller angeschlossen ist, auf der Realtime-Clock einzustellen.
Dies macht man, indem man unter „Datei“ auf „Beispiele“ dann „DS1307RTC“ den Punkt „Set Time“ auswählt. Es öffnet sich der entsprechende Sketch, welchen man nun auf den UNO R3 hochlädt.
Wenn man das alles erledigt hat, kann man zum eigentlichen Code kommen.

Der Programmcode

#include <Wire.h>

#include <LiquidCrystal_I2C.h> //Bibliotheken laden

LiquidCrystal_I2C lcd(0x3D, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //Das I²C Display bennen und die HEX Adresse //eingeben (bei uns 0x3D)

void setup() {

lcd.begin(16, 2); //Das Display starten, festlegen dass es sich um ein Display mit 16 Zeichen in 2 Zeilen //handelt

lcd.backlight(); //Beleuchtung des Displays einschalten

Serial.begin(9600); //Seriellen Verbindung mit Baudrate 9600 starten

setSyncProvider(RTC.get); //Daten von der RTC abrufen

}

void loop() {

Serial.print(hour()); //Serial.print ist der Befehl etwas im seriellen Monitor anzuzeigen (Stunde, Minute, //Sekunde,Leerzeichen, Tag, Leerzeichen, usw.)

printDigits(minute()); //bei den Minuten und Sekunden wird der Befehl

printDigits(second()); //printDigits verwendet, welcher am Ende des Codes noch festgelegt wird

Serial.print(“ „);

Serial.print(day());

Serial.print(“ „);

Serial.print(month());

Serial.print(“ „);

Serial.print(year());

Serial.println();

delay(1000); //eine Sekunde warten

lcd.setCursor(2, 0); // setCursor gibt an wo der Text beginnen soll. In diesem Fall beim dritten Zeichen in //der ersten Reihe.

lcd.print(hour()); //Die Uhrzeit soll angezeigt werden im Format:

lcd.print(„:“); //Stunden:minuten:sekunden

lcd.print (minute());

lcd.print(„:“);

lcd.print(second());

lcd.print(“ „);

lcd.print(„Uhr“); //Dahinter soll das Wort „Uhr“ angezeigt werden

lcd.print(“ „);

lcd.print(“ „);

lcd.print(“ „);

lcd.setCursor(1, 1); //In der zweiten Zeile soll das Datum angezeigt //werden

lcd.print(day());

lcd.print(„.“);

lcd.print(month());

lcd.print(„.“);

lcd.print(year());

}

void printDigits(int digits){ //Der printDigits Befehl für den seriellen Monitor

Serial.print(„:“);

if(digits < 10)

Serial.print(‚0‘);

Serial.print(digits);

}

Funduino - Dein Onlineshop für Mikroelektronik

  • Dauerhaft 10% Rabatt für Schüler, Studenten und Lehrkräfte
  • Mehr als 3.500 Artikel sofort verfügbar!
  • Über 8 Jahre Erfahrung mit Arduino, 3D-Druck und co.
SALE