Hallo Horst Schinkel,
eine ausgezeichnete Beschreibung des DCF77-Protokolls findet man unter
www.netzmafia.de/skripten/hardware/RasPi/Projekt-DCF77 .
Als Empfänger kann auch ich nur ein hochwertiges Modul empfehlen.
Ich hatte eine Schaltung mit einem DCF-Empfänger von Conrad-Electronics aufgebaut. Obwohl ich nur 15 km vom Sender Mainflingen entfernt wohne, hatte ich laufend Übertragungsfehler.
Nachfolgend ist das Programm. Es läuft auf einem Raspberry-Pi und schreibt aktuell Datum und
Uhrzeit in das System. Das Betriebssystem des Raspberry ist praktisch Linux-Ubuntu.
# dcf775.py
# Author Joachim Brommund
# This program works on a Raspberry Pi 3B.
# It decodes the DCF77 signal with the receiver board
# from Conrad Electronics and updates the systemtime
# every minute.
from RPi import GPIO
from time import sleep, time
from datetime import datetime
import sys
import os
GPIO.setmode (GPIO.BOARD)
GPIO.setup (40, GPIO.IN)
while True:
dtstart = time()
GPIO.wait_for_edge(40, GPIO.RISING)
sleep (0.2)
dtnext = time()
dtsync = dtnext - dtstart
if (dtsync > 1.2): # sync found
# print("sync found")
break
count = 1
bitarr = list() # create stringarray
for i in range(60):
bitarr.append(0)
while True:
GPIO.wait_for_edge(40, GPIO.RISING)
sleep (0.05)
dtup = time()
GPIO.wait_for_edge(40, GPIO.FALLING)
sleep (0.05)
dtdown = time()
dtdiff = dtdown - dtup
if count > 58: # cycle finished
# print("cycle finished")
break
if dtdiff > 0.15:
bitarr[count] = '1'
else:
bitarr[count] = '0'
count = count + 1
def checkparity(xsource): # check even parity
xpc=(xsource.count('1'))%2
return xpc
def getvalue(xslice): # convert integer to string value
xval = 0
for i in range(len(xslice)):
xval = xval + (int(xslice
) * 2**i)
return xval
xmin = bitarr[21:25]
xminz = bitarr[25:28]
xminp = bitarr[28]
xhour = bitarr[29:33]
xhourz = bitarr[33:35]
xhourp = bitarr[35]
xday = bitarr[36:40]
xdayz = bitarr[40:42]
xwday = bitarr[42:45]
xmonth = bitarr[45:49]
xmonthz = bitarr[49]
xyear = bitarr[50:54]
xyearz = bitarr[54:58]
xyearp = bitarr[58]
xnum1 = getvalue(xmin)
xnum2 = getvalue(xminz)
minx = str(xnum2)+str(xnum1)
xnum1 = getvalue(xhour)
xnum2 = getvalue(xhourz)
hourx = str(xnum2)+str(xnum1)
xnum1 = getvalue(xday)
xnum2 = getvalue(xdayz)
dayx = str(xnum2)+str(xnum1)
xnum1 = getvalue(xmonth)
xnum2 = getvalue(xmonthz)
monthx = str(xnum2)+str(xnum1)
xnum1 = getvalue(xyear)
xnum2 = getvalue(xyearz)
yearx = str(xnum2)+str(xnum1)
parerror = 0
xpc = checkparity(bitarr[21:28])
if (str(xpc) != bitarr[28]):
# print("Parity minute ")
parerror = 1
xpc = checkparity(bitarr[29:35])
if (str(xpc) != bitarr[35]):
# print("Parity hour")
parerror = 1
xpc = checkparity(bitarr[36:58])
if (str(xpc) != bitarr[58]):
# print("Parity date")
parerror = 1
datenow = monthx+dayx+hourx+minx+yearx
sysstat = 0
if (parerror == 0):
datecmd ="sudo date "+datenow
# print(datenow)
sysstat = os.system(datecmd) # set system date
if ((parerror != 0) or (sysstat != 0)):
# print(datenow)
os.system("echo >xxnext 'sleep 1'")
os.system ("echo >>xxnext 'python3 dcf775.py &'")
os.system("chmod u+x xxnext")
os.system("./xxnext")