- Wochenplaner -
oder der Killer der Langeweile
(Eine Schaltung mit DS1302)
Aus den Komponenten Arduino Nano, LCD-Display und einem RTC-Baustein lässt sich schnell eine weitere einfache Schaltung
konstruieren, die auch gleich praktisch anwendbar ist. Es wird auf dem Display nicht nur das aktuelle Datum mit Uhrzeit angezeigt. Für
jeden Tag der Woche, der ebenfalls ermittelt und angezeigt wird, werden diverse Beschäftigungsvorschläge unterbreitet, um so der eventuell
aufkommenden Langeweile entgegenzuwirken. Eine Schaltung, die sich gegenwärtig für viele als äußerst nützlich erweisen kann. Schließlich
schreiben wir heute das Jahr 2020, eine Zeit der Corona-Pandemie, Ausgangsverbote und Zwangsquarantäne.
DS1302
Der DS1302 ist eine Echtzeituhr (RTC - Real Time Clock) mit eingebautem Kalender. Der Baustein korrespondiert mit einem
Mikroprozessor über drei Leitungen: DAT, LCLK und RST. Als Hauptinformationen stehen Sekunden, Minuten, Stunden, Tag der Woche, Tag des
Monats und das Jahr zur Verfügung. Eine Umschaltung von 24 Stunden Betrieb auf 12 Stunden ist möglich. Anpassung an Schaltjahr erfolgt
automatisch. Der Stromverbrauch ist äußerst gering (~1µW).
In der folgenden Schaltung kommt ein fertiges Modul mit dem IC-DS1302 zum Einsatz. Das Modul verfügt über einen
Taktgeber (Quarz-Oszillator) und einem Batteriefach. Mit einer Batterie können die Einstellungen der Uhr beim Ausfall der Spannungsversorgung
festgehalten werden.
LCD
Als Anzeige dient in der Schaltung ein LCD-Display mit vier Zeilen je 20 Zeichen. Das Display korrespondiert mit dem
Mikroprozessor über I2C-Bus. Hierzu wird ein I2C-Interface mit dem Chip PCF8574T verwendet.
Die erste Geige in der Schaltung spielt der kleine Vertreter der Arduino-Familie: Arduino Nano. Es werden insgesamt fünf seiner
Pins in Anspruch genommen. Die Einspeisung erfolgt mit 9 VDC. Das Display und RTC werden mit separaten
5 VDC versorgt.
Arduino Nano (Nachbau)
Schaltplan
Testschaltung
Das Programm (Sketch)
Das Programm liest aus dem Echtzeituhrbaustein (DS1302) die aktuelle Zeit und gibt sie auf dem Display aus. Zusätzlich wird
der aktuelle Tag der Woche ermittelt und ebenfalls angezeigt. Zu jedem Tag wird darüber hinaus ein Beschäftigungsvorschlag unterbreitet.
Der Satz mit dem Vorschlag wird in der letzten Zeile des Displays als Scrolltext angezeigt. In dem Beispiel wird jedem Tag zu
Demonstrationszwecken nur eine Beschäftigungsidee zugeordnet. Bei Bedarf kann die Liste der Vorschläge beliebig erweitert werden.
Die Vorschläge könnten dann z.B. mithilfe einer Zufallszahl ausgewählt werden. So für das Display als auch für die Echtzeituhr wird
eine Bibliothek verwendet. Für das Display „LiquidCrystal_I2C.h“ (Internet: https://github.com/johnrickman/LiquidCrystal_I2C) und für
RTC „RtcDS1302.h“ (Internet: https://github.com/Makuna/Rtc). Beide Bibliotheken, damit das Programm funktioniert, müssen installiert
werden.
// --------------------------------------------------------
// Wochenplaner
// (Der Killer der Langeweile)
// Mit RTC DS1302 und LCD 20x4 (I2C)
// Arduino Nano, IDE 1.8.12
// --------------------------------------------------------
#include<LiquidCrystal_I2C.h>#include<ThreeWire.h>#include<RtcDS1302.h>
ThreeWire myWire(3,2,4); // Schnittstelle RTC: IO, SCLK, CE
RtcDS1302<ThreeWire> Rtc(myWire); // Schnittstelle RTC
LiquidCrystal_I2C lcd(0x27,20,4); // LCD: Adresse, Zeichen, Zeilen
int TagNr = 0;
String Tag = "";
String Aufgaben [] { "Rufe Mutti an! ",
"30km Fahrradtour. ",
"Lerne neue Yogafigur und probiere sie aus. ",
"Koche ohne Rezept ein leckeres Mittagessen. ",
"Pflanze einen Baum ein. ",
"Lerne ein Gedicht und rezitiere es vor einem Spiegel. ",
"Heute ist Shopping-Zeit. ", };
void setup () {
lcd.init(); // Display initialisieren
lcd.backlight(); // Hintergrundbeleuchtung
Rtc.Begin();
RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
if (!Rtc.IsDateTimeValid()) { Rtc.SetDateTime(compiled); }
if (Rtc.GetIsWriteProtected()) { Rtc.SetIsWriteProtected(false); }
if (!Rtc.GetIsRunning()) { Rtc.SetIsRunning(true); }
RtcDateTime now = Rtc.GetDateTime();
if (now < compiled) { Rtc.SetDateTime(compiled); }
}
#define countof(a) (sizeof(a) / sizeof(a[0]))
void loop () {
delay(1000);
RtcDateTime now = Rtc.GetDateTime();
const RtcDateTime& dt = now;
char datestring[20];
snprintf_P(datestring,
countof(datestring),
PSTR("%02u/%02u/%04u %02u:%02u"),
dt.Day(), dt.Month(), dt.Year(), dt.Hour(), dt.Minute() );
TagNr = dt.DayOfWeek();
switch (TagNr) {
case 0: Tag = " Sonntag "; break;
case 1: Tag = " Montag "; break;
case 2: Tag = " Dienstag "; break;
case 3: Tag = " Mittwoch "; break;
case 4: Tag = "Donnerstag"; break;
case 5: Tag = " Freitag "; break;
case 6: Tag = " Samstag "; break; }
lcd.setCursor(2,0);
lcd.print (datestring); // aktuelles Datum
lcd.setCursor(5,1);
lcd.print (Tag); // Tag der Woche
lcd.setCursor(0,2);
lcd.print ("Die Aufgabe:");
delay(2000);
lcd.setCursor(0,3);
String Heutige_Aufgabe = Aufgaben [TagNr];
int Satz_Laenge = Heutige_Aufgabe.length();
String Ausgabe_Text = " ";
for (int i=0; i<Satz_Laenge; i++) {
for (int j=0; j<19; j++) {
Ausgabe_Text [j] = Ausgabe_Text [j+1]; }
Ausgabe_Text [19] = Heutige_Aufgabe [i];
lcd.setCursor(0,3);
lcd.print(Ausgabe_Text);
delay(500); }
}
// ----------------------------------------------------------