Zeitmessung per Funk: DCF77-Empfangsmodul mit Arduino
Mit einem DCF77-Empfangsmodul lassen sich exakte Zeitdaten von einem Funksender wie dem DCF77 empfangen. Diese präzisen Zeitsignale sind ideal für Projekte mit einem Arduino, bei denen eine genaue Uhrzeit erforderlich ist, etwa für zeitgesteuerte Schaltungen oder Datenerfassungssysteme. Das DCF77-Signal wird von der Physikalisch-Technischen Bundesanstalt (PTB) über eine Sendeanlage in Mainflingen ausgestrahlt und stellt eine zuverlässige Quelle für die Mitteleuropäische Zeit (MEZ) sowie die mitteleuropäische Sommerzeit (MESZ) dar. https://www.youtube.com/watch?v=JARqWmHE6Kc&t In diesem Beitrag zeige ich dir, wie du ein DCF77-Empfangsmodul mit dem Arduino verbindest, die empfangenen Daten dekodierst und für dein Projekt weiterverarbeitest. Statt vorgefertigte Bibliotheken zu verwenden, biete ich dir einen einfachen Code, den du direkt in dein eigenes Projekt einfügen kannst. Dadurch behältst du die volle Kontrolle über die Signalverarbeitung und kannst die Daten flexibel an deine spezifischen Anforderungen anpassen. Dieses Projekt eignet sich sowohl für Einsteiger als auch für Fortgeschrittene, die präzise Zeitsteuerungen oder Datenerfassungen umsetzen möchten.
Wozu dient das DCF77-Empfangsmodul?
Das DCF77-Empfangsmodul dient dazu, über Funk genaue Zeit- und Datumsinformationen zu empfangen, die von der DCF77-Sendeanlage ausgestrahlt werden. Diese Informationen werden mit einer hohen Genauigkeit über eine Langwelle (77,5 kHz) gesendet und sind besonders nützlich für Anwendungen, bei denen eine präzise Zeit erforderlich ist, wie etwa bei Funkuhren, Zeiterfassungssystemen oder zeitgesteuerten Schaltungen. In Arduino-Projekten ermöglicht das DCF77-Modul, die empfangenen Zeitdaten in Echtzeit zu verarbeiten, ohne auf externe Zeitserver oder manuelle Einstellungen angewiesen zu sein. Dadurch wird es zu einer idealen Komponente für Automatisierungen, bei denen eine verlässliche Zeitsynchronisierung entscheidend ist. Sender DCF77 in Mainflingen Der Sender DCF77 überträgt die Daten dabei mit einer Frequenz von 77.5kHz und einer Leistung von 50kW.
DCF77 Zeitzeichensender bei Mainflingen (Frankfurt am Main) Zu diesem Sender gibt es einen Ausführlichen Wikipedia Artikel, welchen ich hier nun gerne verlinken möchte: Seite „DCF77“. In: Wikipedia, Die freie Enzyklopädie. Bearbeitungsstand: 6. September 2019, 12:10 UTC. URL: https://de.wikipedia.org/w/index.php?title=DCF77&oldid=192027822 (Abgerufen: 13. September 2019, 19:15 UTC)
Technische Daten vom DCF77 Empfangsmodul
- Betriebsspannung: min. 1,2V - max. 3,3V - Stromaufnahme: - Empfangsfrequenz: min. 40 kHz, max. 100 kHz - Arbeitstemperatur: -40 °C bis +85 °C - Lagertemperatur: -55 °C bis +85 °C - einen - ein - ein - eine - ein - diverse - 10 cm, männlich - weiblich, - 10 cm, männlich - männlich 1500) { bufCounter = 0; currentBuf = 0; } } else { if (dur > 150) { currentBuf |= ((unsigned long long)1 > 50) & 0xFF; byte dcf77Month = (currentBuf >> 45) & 0x1F; byte dcf77DayOfWeek = (currentBuf >> 42) & 0x07; byte dcf77DayOfMonth = (currentBuf >> 36) & 0x3F; byte dcf77Hour = (currentBuf >> 29) & 0x3F; byte dcf77Minute = (currentBuf >> 21) & 0x7F; int jahr = rawByteToInt(dcf77Year); int monat = rawByteToInt(dcf77Month); int tag = rawByteToInt(dcf77DayOfMonth); int wochentag = rawByteToInt(dcf77DayOfWeek); int stunde = rawByteToInt(dcf77Hour); int minute = rawByteToInt(dcf77Minute); if (jahr > 0 && monat > 0) { zeit.isValid = true; zeit.jahr = jahr + 2000; zeit.monat = monat; zeit.tag = tag; zeit.wochentagInt = wochentag; zeit.wochentagStr = (wochentag > 0) ? wochentage : ""; zeit.stunde = stunde; zeit.minute = minute; } else { zeit.isValid = false; } return zeit; } Schritt 7 - Hilfsfunktion zur Konvertierung von BCD nach Dezimal Die Funktion unsigned int rawByteToInt(byte raw) wandelt ein einzelnes Byte, das im binär kodierten Dezimalformat (BCD) vorliegt, in eine dezimale Zahl um. Bei BCD werden die oberen 4 Bits des Bytes als Zehnerstelle und die unteren 4 Bits als Einerstelle interpretiert. Die Funktionsweise im Detail: - Mit raw >> 4 werden die oberen 4 Bits des Bytes nach rechts verschoben, sodass die Zehnerstelle isoliert wird. - raw & 0x0F maskiert die oberen 4 Bits und behält nur die unteren 4 Bits, die die Einerstelle darstellen. - Schließlich wird das Ergebnis als Dezimalzahl berechnet, indem die Zehnerstelle mit 10 multipliziert und die Einerstelle dazuaddiert wird. So ergibt sich aus einem BCD-Wert wie 0x25 (Zehnerstelle 2, Einerstelle 5) die Dezimalzahl 25. unsigned int rawByteToInt(byte raw) { return ((raw >> 4) * 10 + (raw & 0x0F)); } Read the full article













