Digitalwecker mit Arduino, DS3231 & MP3-Modul bauen: Weckzeit, OLED-Anzeige & eigener Sound

Jeden Morgen dasselbe nervige Piepen? Bau dir lieber deinen eigenen Wecker – der dich mit deinem Lieblingssong weckt. Das Herzstück ist die DS3231-Echtzeituhr, die die Zeit auf wenige Sekunden im Jahr genau hält – sogar bei gezogenem Stecker dank Knopfzelle. Ein OLED zeigt die Uhrzeit, ein MP3-Modul spielt zur Weckzeit echte Musik statt Gepiepe, und mit einem Drehregler stellst du den Alarm ein. In diesem Tutorial baust du den kompletten Wecker Schritt für Schritt auf.

Warum einen Wecker selbst bauen?

Ein gekaufter Wecker kann eins: klingeln. Deiner kann alles, was du willst. Eigener Wecksound aus MP3-Dateien, sanftes Lauterwerden statt Schock am Morgen, eine Snooze-Taste mit frei wählbarer Länge, mehrere Weckzeiten für Wochentage – und ganz nebenbei lernst du dabei, wie Zeit, Anzeige und Sound in einem Mikrocontroller-Projekt zusammenspielen. Das Beste: Jedes der drei Module ist für sich einfach, erst die Kombination macht das Gerät.

ℹ️ Warum eine extra Uhr, wo der Arduino doch Zeit kennt? Der Arduino misst mit millis() nur die Zeit seit dem Einschalten – und ungenau. Nach einem Stromausfall ist sie weg. Die DS3231 dagegen läuft mit eigener Knopfzelle weiter, korrigiert Temperaturdrift automatisch und weiß auch nach Wochen ohne Strom noch, wie spät es ist. Genau das braucht ein Wecker.

So funktioniert der Wecker

Drei Bausteine teilen sich die Arbeit. Die DS3231 hält über den I2C-Bus die genaue Uhrzeit bereit. Das OLED-Display hängt am selben I2C-Bus und zeigt Zeit und Weckstatus. Das MP3-Modul bekommt seine Befehle über eine serielle Verbindung und spielt Titel von seiner eigenen Micro-SD-Karte über einen Lautsprecher ab. Der Arduino ist der Dirigent: Er liest die Zeit, zeichnet die Anzeige und startet den Song, sobald die aktuelle Zeit die Weckzeit erreicht.

Das brauchst du

DS3231 Echtzeituhr (RTC) – hält die Zeit genau, läuft mit Knopfzelle weiter
MP3-Player-Modul mit Verstärker – spielt deinen Wecksong von Micro-SD, treibt einen Lautsprecher direkt
1,3 Zoll OLED-Display (I2C) – zeigt Uhrzeit, Datum und Weckstatus
UNO R3 Entwicklungsboard (USB-C) – dirigiert Uhr, Anzeige und Sound
Rotary Encoder (Drehgeber) – Weckzeit einstellen und mit Druck bestätigen
Breadboard 400 Kontakte und Dupont-Jumperkabel – für die Verbindungen

1Verkabelung

DS3231 und OLED teilen sich den I2C-Bus (SDA an A4, SCL an A5) – das ist das Schöne an I2C: mehrere Geräte an denselben zwei Leitungen. Das MP3-Modul bekommt eine eigene serielle Verbindung über zwei Digitalpins.

Modul / Pin Arduino UNO Hinweis
DS3231 VCC 5V Versorgung
DS3231 GND GND Masse
DS3231 SDA A4 I2C-Daten
DS3231 SCL A5 I2C-Takt
OLED VCC / GND 5V / GND gleicher I2C-Bus
OLED SDA / SCL A4 / A5 parallel zur RTC
MP3 VCC 5V Versorgung
MP3 RX D6 (über 1kΩ) Befehle vom Arduino
MP3 TX D5 Rückmeldung
MP3 SPK+/SPK- Lautsprecher direkt am Verstärker
Encoder CLK / DT D2 / D3 Drehimpulse
Encoder SW D4 Taster (Bestätigen)

⚠️ Serien-RX vor 5 V schützen: Der Eingang (RX) vieler MP3-Module verträgt am liebsten 3,3-V-Signale. Ein einfacher 1-kΩ-Widerstand in der Leitung von D6 zum MP3-RX begrenzt den Strom und schont das Modul. TX zum Arduino ist unkritisch.

2Die Uhr stellen und auslesen

Installiere über den Bibliotheksverwalter die RTClib von Adafruit. Der folgende Sketch stellt die DS3231 einmalig auf die Compile-Zeit deines PCs und gibt danach die Zeit aus. Wichtig: Nach dem ersten Hochladen die Zeile zum Stellen wieder auskommentieren, sonst wird die Uhr bei jedem Reset zurückgesetzt.

#include <Wire.h>
#include <RTClib.h>

RTC_DS3231 rtc;

void setup() {
  Serial.begin(115200);
  if (!rtc.begin()) {
    Serial.println("DS3231 nicht gefunden!");
    while (1);
  }

  // Nur beim ERSTEN Upload aktiv lassen, dann auskommentieren:
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}

void loop() {
  DateTime jetzt = rtc.now();
  Serial.print(jetzt.hour());   Serial.print(":");
  Serial.print(jetzt.minute()); Serial.print(":");
  Serial.println(jetzt.second());
  delay(1000);
}

Alles rund um Batteriepufferung, Weckalarme und Zeitstempel vertieft der Guide zum DS3231-Modul.

3Uhrzeit auf dem OLED anzeigen

Jetzt bringen wir die Zeit auf das OLED-Display. Nötig sind die Bibliotheken Adafruit GFX und Adafruit SSD1306. Wir formatieren Stunden und Minuten mit führender Null, damit „07:05“ sauber aussieht:

#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

RTC_DS3231 rtc;
Adafruit_SSD1306 display(128, 64, &Wire, -1);

void zeigeZeit(DateTime t) {
  char puffer[9];
  sprintf(puffer, "%02d:%02d:%02d", t.hour(), t.minute(), t.second());

  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(2);
  display.setCursor(10, 20);
  display.print(puffer);

  // Datum kleiner darunter
  char datum[11];
  sprintf(datum, "%02d.%02d.%04d", t.day(), t.month(), t.year());
  display.setTextSize(1);
  display.setCursor(28, 48);
  display.print(datum);
  display.display();
}

void setup() {
  rtc.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}

void loop() {
  zeigeZeit(rtc.now());
  delay(1000);
}

Zeigt das Display nichts, ist die I2C-Adresse meist 0x3C statt der voreingestellten – prüfe sie zur Not mit einem I2C-Scanner. Grafik-Grundlagen zum OLED stehen im SSD1306-Tutorial.

4Das MP3-Modul zum Klingen bringen

Lege ein paar MP3-Dateien auf die Micro-SD-Karte des Moduls – wichtig: in einen Ordner mp3 und benannt als 0001.mp3, 0002.mp3 und so weiter. Mit der Bibliothek DFRobotDFPlayerMini steuerst du das Modul über eine serielle Software-Verbindung an:

#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>

SoftwareSerial mp3Serial(5, 6);   // RX, TX (zum Modul)
DFRobotDFPlayerMini player;

void setup() {
  Serial.begin(115200);
  mp3Serial.begin(9600);          // MP3-Module sprechen 9600 Baud

  if (!player.begin(mp3Serial)) {
    Serial.println("MP3-Modul nicht erreichbar");
    while (1);
  }
  player.volume(20);              // Lautstaerke 0..30
  player.play(1);                 // spielt 0001.mp3
}

void loop() {}

Mehr Befehle – nächster/vorheriger Titel, Wiederholung, einzelne Ordner – findest du im MP3-Modul-Tutorial.

5Alles zusammen: der Weck-Sketch mit Snooze

Jetzt verbinden wir die Teile. Wir hinterlegen eine Weckzeit, vergleichen sie jede Sekunde mit der aktuellen Zeit und starten bei Treffer den Song. Ein Druck auf den Encoder-Taster stoppt (oder „snoozt“) den Alarm. Damit der Wecker nicht in derselben Minute mehrfach auslöst, merken wir uns mit einem Flag, dass schon geweckt wurde.

#include <Wire.h>
#include <RTClib.h>
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>

RTC_DS3231 rtc;
SoftwareSerial mp3Serial(5, 6);
DFRobotDFPlayerMini player;

const int TASTER = 4;             // Encoder-SW
int weckStunde = 7;
int weckMinute = 0;
bool alarmAktiv = false;
bool schonGeweckt = false;

void setup() {
  pinMode(TASTER, INPUT_PULLUP);
  rtc.begin();
  mp3Serial.begin(9600);
  player.begin(mp3Serial);
  player.volume(15);
}

void loop() {
  DateTime jetzt = rtc.now();

  // Weckzeit erreicht und heute noch nicht geweckt?
  if (jetzt.hour() == weckStunde &&
      jetzt.minute() == weckMinute &&
      !schonGeweckt) {
    alarmAktiv = true;
    schonGeweckt = true;
    player.play(1);               // Wecksong starten
  }

  // Eine Minute spaeter Flag wieder freigeben
  if (jetzt.minute() != weckMinute) {
    schonGeweckt = false;
  }

  // Taster gedrueckt -> Alarm aus
  if (alarmAktiv && digitalRead(TASTER) == LOW) {
    player.stop();
    alarmAktiv = false;
    delay(300);                   // einfaches Entprellen
  }

  delay(200);
}

💡 Sanftes Wecken: Statt sofort voller Lautstärke kannst du beim Auslösen bei player.volume(5) starten und die Lautstärke über eine Minute schrittweise auf 25 erhöhen. Das Aufwachen wird dadurch deutlich angenehmer – ein Feature, das kaum ein günstiger Wecker hat.

ℹ️ Weckzeit per Drehregler: Mit dem Rotary Encoder stellst du weckStunde und weckMinute zur Laufzeit ein: Drehen ändert den Wert, Drücken wechselt zwischen Stunde und Minute. Wie du den Drehgeber sauber ausliest und daraus ein kleines Menü baust, zeigt das OLED-Menü-Tutorial.

Praxistipps für den Alltag

  • Weckzeit im EEPROM speichern: So bleibt sie auch nach dem Ausschalten erhalten und muss nicht neu eingestellt werden.
  • Wochentags-Wecker: Mit jetzt.dayOfTheWeek() weckst du nur Montag bis Freitag – am Wochenende bleibt es still.
  • Snooze statt Aus: Statt den Alarm ganz zu beenden, verschiebst du die Weckzeit beim Tasterdruck um 5 Minuten nach hinten.
  • Nachtabsenkung: Dimme oder deaktiviere das OLED nachts über display.dim(true), damit es im Schlafzimmer nicht blendet.
  • Sanfte Anzeige: Ein blinkender Doppelpunkt im Sekundentakt macht die Uhr lebendiger – einfach jede Sekunde zwischen „:“ und Leerzeichen wechseln.

Troubleshooting

⚠️ Uhr geht nach jedem Reset auf dieselbe Zeit: Die rtc.adjust(...)-Zeile ist noch aktiv. Nach dem ersten Stellen auskommentieren und erneut hochladen. Fehlt die Knopfzelle oder ist leer, vergisst die RTC die Zeit ebenfalls.

⚠️ MP3-Modul reagiert nicht: Baudrate muss 9600 sein, RX und TX nicht vertauschen (der Modul-RX geht an den Arduino-TX D6), und die Dateien müssen als 0001.mp3 im Ordner mp3 liegen.

⚠️ Kein Ton, aber Modul läuft: Lautsprecher direkt an SPK+/SPK−, Lautstärke > 0, und prüfe die Stromversorgung – der Verstärker zieht beim lauten Abspielen ordentlich Strom.

⚠️ OLED bleibt schwarz: Adresse 0x3C im Code prüfen und ob OLED und RTC wirklich beide an A4/A5 hängen.

⚠️ Alarm löst mehrfach aus: Das schonGeweckt-Flag fehlt oder wird zu früh zurückgesetzt. Es darf erst freigegeben werden, wenn die Weckminute vorbei ist.

🚀 Dein Wecker-Starterpaket

Alle Bauteile für den Digitalwecker im Shop:

Fazit

Aus einer genauen Echtzeituhr, einem OLED und einem MP3-Modul entsteht ein Wecker, der jeden gekauften alt aussehen lässt: sekundengenaue Zeit auch nach Stromausfall, eigene Wecksongs statt Piepen und eine Snooze-Funktion nach deinem Geschmack. Du hast gelernt, die DS3231 zu stellen und auszulesen, die Zeit sauber auf dem OLED darzustellen, das MP3-Modul anzusteuern und alles zu einer robusten Alarm-Logik mit Flag und Taster zu verbinden.

Von hier aus ist viel möglich: mehrere Weckzeiten, Wochentagslogik, sanftes Lauterwerden, Temperaturanzeige (die DS3231 hat einen Sensor eingebaut!) oder eine schöne Analoguhr auf einem runden Display. Viel Spass beim Bauen – und guten Morgen!

Zurück zum Blog