Wecker mit einem RTC-Modul

Lese­zeit: 6 Minu­ten
Navi­ga­ti­on

Benö­tig­te Bau­tei­le:

  • 2 Tas­ter
  • LCD 1602
  • RTC-Modul DS3231
  • Laut­spre­cher
  • 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)

Die Weck­zeit wird zusam­men mit Wochen­tag, Datum und Uhr­zeit auf dem LCD-Display ange­zeigt.

Der lin­ke Tas­ter soll die Stun­den, der rech­te Tas­ter soll die Minu­ten ein­stel­len.
Ein Tas­ter­druck → eine Stunde/eine Minu­te vor­wärts

Benö­tig­te Biblio­the­ken:
Sketch → Biblio­thek ein­bin­den → Biblio­the­ken ver­wal­ten

Bin­de die Biblio­the­ken RTC­lib und LiquidCrystal_I2C ein und defi­nie­re die Varia­blen.

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

// Name des RTC-Moduls 
RTC_DS3231 rtc; 

// Wochentage char daysOfTheWeek[7][12] = {"Sonntag", "Montag", "Dienstag", "Mittwoch",  "Donnerstag", "Freitag", "Samstag"}; 

LiquidCrystal_I2C lcd(0x27, 20, 4); 

int LAUTSPRECHER = 3;
int TASTERLINKS = 7;
int TASTERRECHTS = 8;
int TasterLesenLinks;
int TasterLesenRechts;

// Beginn der Weckzeit
int StundeWeckzeit = 6;
int MinuteWeckzeit = 0;

// Dauer des Signal
int DauerWecksignal = 3;

// Zeit messen für Ticken der Uhr
long Startzeit;
long ZeitJetzt;

Der setup-Teil. Beach­te die Kom­men­ta­re.

void setup()
{
  pinMode(TASTERLINKS, INPUT_PULLUP);
  pinMode(TASTERRECHTS, INPUT_PULLUP);
  Serial.begin(9600);
  rtc.begin();
  /*
    wenn Datum und Zeit nicht korrekt -> Datum/Zeit setzen
    Jahr, Monat, Tag, Stunde, Minute, Sekunde
    keine führende 0 setzen
    Beispiel:
    rtc.adjust(DateTime(2018, 10, 25, 7, 2, 30));
  */
  // rtc.adjust(DateTime(2018, 10, 28, 13, 26, 30));

  // LCD initialisieren
  lcd.init();
  lcd.backlight();

  Serial.println("Bitte die Weckzeit eingeben:");
  Serial.println("Taster links -> Stunde +/Taster rechts ->     
  Minute +");
  Startzeit = millis();
}

Der loop-Teil. Beach­te die Kom­men­ta­re.

void loop()
{
  String Stunde, Minute, Weckzeit;

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

  // Stunde einstellen
  TasterLesenLinks = digitalRead(TASTERLINKS);
  
  // Minute einstellen
  if (TasterLesenLinks == LOW)
  {
    delay(200);
    if (StundeWeckzeit >= 24) StundeWeckzeit = 1;
    else StundeWeckzeit ++;
  }
  
  TasterLesenRechts = digitalRead(TASTERRECHTS);
  if (TasterLesenRechts == LOW)
  {
    delay(200);
    if (MinuteWeckzeit >= 59) MinuteWeckzeit = 0;
    else MinuteWeckzeit ++;
  }

  // Wochentag, Datum und Zeit anzeigen
  lcd.setCursor(0, 0);
  lcd.print(daysOfTheWeek[aktuell.dayOfTheWeek()]);
  lcd.setCursor(0, 1);
  lcd.print(aktuell.day());
  lcd.print(".");
  lcd.print(aktuell.month());
  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());
  
  /*
    Weckzeit formatieren -> führende 0 ergänzen
    4 mögliche Fälle
    Stunde < 10 Minute < 10    
    Stunde < 10 Minute > 9
    Stunde > 10 Minute < 10    
    Stunde > 10 Minute > 9 
  */
  if (StundeWeckzeit < 10 && MinuteWeckzeit < 10) Weckzeit = "0"    
+ String(StundeWeckzeit) + ":0" + String(MinuteWeckzeit);   
  
  if (StundeWeckzeit < 10 && MinuteWeckzeit > 9) Weckzeit = "0" + String(StundeWeckzeit) + ":" + String(MinuteWeckzeit);

  if (StundeWeckzeit > 9 && MinuteWeckzeit < 10) Weckzeit = String(StundeWeckzeit) + ":0" + String(MinuteWeckzeit);

  if (StundeWeckzeit > 9 && MinuteWeckzeit > 9) Weckzeit = String(StundeWeckzeit) + ":" + String(MinuteWeckzeit);

  lcd.setCursor(0, 3);
  lcd.print("Weckzeit: " + Weckzeit);

  // führende 0 setzen
  if (aktuell.hour() < 10) Stunde = "0" + String(aktuell.hour());
  else Stunde = String(aktuell.hour());

  // führende 0 setzen
  if (aktuell.minute() < 10) Minute = "0" + 
  String(aktuell.minute());
  else Minute = String(aktuell.minute());

  // String zusammensetzen
  String aktuelleZeit = Stunde + ":" + Minute;
  if (aktuelleZeit == Weckzeit && aktuell.second() <  DauerWecksignal)
  {
    tone(LAUTSPRECHER, 1000, 500);
  }

  /* 
    Ticken der Uhr
    aktuelle Zeit (ZeitJetzt) messen
    millis() -> Zeit, die seit dem Start des Programms 
    vergangen ist
    wenn die Differenz zwischen der gerade gemessenen Zeit
    und der im setup gemessenen Startzeit >= 1000 (1 Sekunde) ist
    -> kurzen Ton wiedergeben
    Startzeit muss anschließend auf die aktuelle Zeit gesetzt werden
   */
   ZeitJetzt = millis();

   if (ZeitJetzt - Startzeit >= 1000)
   {
     tone(LAUTSPRECHER, 1000, 2);
     Startzeit = ZeitJetzt;
   }
 }


Ver­wand­te Auf­ga­ben:


Letzte Aktualisierung: 12. Jul 2020 @ 11:33