DCF77 Funkuhr & Analyzer v2.0 – Arduino Mega/UNO Projekt
Komponenten und Zubehör
| Komponente | Menge |
|---|---|
| Arduino Mega 2560 | 1 |
| Arduino UNO (für DCF77 Superfilter) | 1 |
Projektbeschreibung
Nach der Entdeckung der Arduino-Plattform wurde der Traum vom eigenen Elektronik-Projekt wahr. Als Liebhaber von Funkuhren (die sich mit dem DCF77-Signal aus Deutschland synchronisieren) wollte ich nicht nur eine Uhr bauen, die die Zeit anzeigt, sondern eine, die zeigt, was gerade passiert.
Nach hunderten Stunden Tüftelei und unzähligen Fehlern entstand eine funktionierende Uhr mit eigenem Code und eigener PCB.
Später entdeckte ich den DCF77 Superfilter von Udo Klein, der ein sauberes Signal liefert, wenn das Funksignal schwach ist. Dieser läuft auf einem separaten Arduino Uno als "Black Box" zwischen DCF77-Antenne und dem Arduino Mega mit der Hauptsoftware.
Version 2.0 – Neuerungen
- Vollständig neu geschriebener, umfangreich kommentierter Code
- PIR-Bewegungssensor zur Stromersparnis (Displays aus bei Abwesenheit)
- DCF77 Superfilter integriert
- Zusatzdisplay für Temperatur oder Sonnenauf-/untergang
Design & Gehäuse
Die Frontplatte wurde in Inkscape (Freeware) entworfen. Die Fertigung war der schwierigste Teil: Laserschneiden bei einem lokalen FabLab scheiterte an Toleranzen. Schließlich wurde ein DiBond-Panel bei einem Online-Fotoservice bedruckt (28 € inkl. Versand). Wichtig: Vorab klären, ob 1:1-Druck möglich ist!
Anschließend folgten Bohren, Fräsen und Bestückung – zahlreiche Fotos im Originalprojekt dokumentieren den Prozess.
Programmcode
DCF Analyzer / Clock v2.1 (Arduino Mega)
Hinweis: Der Code ist sehr umfangreich. Hier die Struktur und wichtige Ausschnitte. Vollständiger Code im Originalprojekt zum Download.
/* ================================================================================
DCF77 Analyzer / Clock Version 2
Erik de Ruiter 2014-2020 | GNU LGPL v2.1
================================================================================ */
#include
#include
#include
#include // Speziell für Common-Anode Displays
#include
#include
// Pin-Definitionen (Arduino Mega)
#define DCF77PIN 2 // Interrupt-Eingang DCF-Signal
#define PIRDETECTORPIN 3 // PIR-Bewegungssensor
#define BUZZERSWITCHPIN 4 // Summer Ein/Aus
#define CHIMESWITCHPIN 5 // Stundenschlag Ein/Aus
#define POWERSAVESWITCHPIN 6 // Powersave Ein/Aus
#define TEMPSENSORPIN 8 // DS18B20 Temperatursensor
#define TEMPRESETPIN 9 // Temp Min/Max Reset-Taster
#define MAXIMCCLD 10 // MAX7219 CS/LOAD
#define MAXIMCCCLK 11 // MAX7219 CLK
#define MAXIMCCDATA 12 // MAX7219 DATA
// LEDs an Pins 22-50 (Wochentage, Status, Fehler, etc.)
#define LED_SUNDAY 22 ... #define LED_PIRMOTION 50
// Analog-Pins
#define BUZZER A7
#define SPEAKERVOLPIN A6
#define CHIMEPIN A5
// Einstellungen
#define POWERSAVINGOFFTIME 9 // Displays AN (9 Uhr)
#define POWERSAVINGONTIME 22 // Displays AUS (22 Uhr)
#define POWERSAVE_BY_PIR 1 // PIR-Powersave aktiv
#define PIR_DELAY_TIME 30 // Minuten bis Abschaltung
#define TEMPRESET_MIDNIGHT 1 // Temp-Speicher um Mitternacht zurücksetzen
// ... umfangreiche Variablendefinitionen ...
void setup() {
Serial.begin(9600);
// Pin-Modes, LED-Initialisierung, Interrupt für DCF77 (Pin 2, CHANGE)
// RTC als SyncProvider, Lautstärke einstellen, DS18B20 konfigurieren
// LED-Test beim Start, erste Temp-Messung
}
void loop() {
if (DCFSignalState != previousSignalState) {
previousSignalState = DCFSignalState;
scanSignal(); // DCF-Puls auswerten
}
checkSwitches(); // Schalter prüfen
checkPIR(); // Bewegungssensor
tasksEverySecond();
tasksEveryMinute();
tasksEveryHour();
}
// Wichtige Funktionen:
// scanSignal() - Flankenauswertung, Pulsbreiten-Prüfung (100/200ms)
// processDcfBit() - Bit in Puffer, Parity-Check (3 Paritätsbits)
// finalizeBuffer() - Bei Minutenmarke (2s Lücke): Puffer auswerten
// decodeBufferContents() - DCF77-Bits → Zeit/Datum
// bitDecode() - Hilfsfunktion für Bit-Felder
// displayTemp() - DS18B20 auslesen & anzeigen
// ledTest() - Startup-Test aller LEDs/Displays
// turnDisplaysOff() // Powersave-Funktion
Superfilter Sketch (Arduino Uno – Udo Klein)
Dieser Code läuft auf dem separaten Arduino Uno zwischen Antenne und Mega. Er filtert das rohe DCF77-Signal und gibt bereinigte Signale aus (gefiltert, semi-synthetisiert, synthetisiert).
// DCF77 Superfilter 3.0 - (c) 2015 Udo Klein - www.blinkenlight.net
// GNU GPL v3
#include
// Pin-Belegung (Uno)
const uint8_t dcf77_sample_pin = 19; // A5 - DCF Eingang
const uint8_t dcf77_filtered_pin = 12; // Gefilterter Ausgang
const uint8_t dcf77_semi_synthesized_pin = 16; // A2
const uint8_t dcf77_synthesized_pin = 6; // Voll synthetisiert
const uint8_t dcf77_monitor_pin = 18; // A4 - Monitor LED
const uint8_t dcf77_second_pulse_pin = 10; // 1Hz Puls / Lock LED
const uint8_t dcf77_signal_good_indicator_pin = 13; // Signalqualität LED
// ... Konfiguration für gefilterte / semi-synthetisierte / synthetisierte Ausgänge
// mit Differenz-LEDs zur Signalqualitätsanzeige
void setup() {
setup_serial();
output_splash_screen();
setup_pins();
setup_clock();
}
void loop() {
Clock::time_t now;
DCF77_Clock::get_current_time(now);
if (now.month.val > 0) {
Serial.print("Decoded time: ");
DCF77_Clock::print(now);
Serial.println();
}
Serial.print(DCF77_Clock::get_clock_state());
Serial.print(' ');
DCF77_Clock::debug();
// Scope-Ausgaben für Signalanalyse
}
Die vollständige dcf77.h Library von Udo Klein ist erforderlich (GitHub).
CAD-Dateien (Custom Parts)
- PCB für Zeit- & Datums-Displays (MAX7219, 0,56" 7-Segment)
- PCB für kompakte 7-Segment-Displays (KingBright SC39-11SRWA)
- Sound-Dateien für Tick- & Schlaggeräusche (Großvateruhr)
Schaltpläne
Detaillierte Schaltpläne als ZIP-Download im Originalprojekt: dcf77-analyzer-clock-v2_1_jVZT5sqIwn.zip
Herstellungsprozess
- Kuckucksuhr: Geschichte, Handwerkskunst und moderne Evolution
- Arduino POV-Uhr: Persistence-of-Vision LED-Display selbst bauen
- Retro-Numitron-Uhr mit Arduino bauen: Einfach, zuverlässig & energieeffizient
- Stilvolle Wanduhr mit Adafruit 60-LED Neopixel-Ring & Arduino
- DIY Arduino Word Clock – Elegante Wortuhr mit RTC & Schieberegistern
- Arduino Echtzeituhr für islamische Gebetszeiten bauen
- Bluetooth-gesteuerter Arduino-Spybot bauen – Überwachungsroboter mit IP-Kamera
- FlickMote: Gestensteuerung per Ultraschall & IR für Smart Home (Arduino 101)
- Einen eigenen LED-Master-Clock mit Alarm bauen – aus 12 Metern Entfernung ablesbar
- Zuverlässigen Wecker mit DS1302 RTC und Arduino UNO bauen