#!/usr/bin/python3 import time import RPi.GPIO as gpio # dcf77.py ### Pins vorbereiten # Mit Pinnummern arbeiten gpio.setmode(gpio.BOARD) # Warnungen ignorieren gpio.setwarnings(False) # Pin 16 als DCF77-Ausgang nehmen gpio.setup(16, gpio.OUT) # Invertier zu 16 gpio.setup(18, gpio.OUT) #Bitzähler vorbereiten pulsenr=0 # Zeitkorrektur setzen korrektur = 0 print("DCF77-Generator Version 1.3") print("19.Januar 2017 Michael Schober") print("23.02.17") print() print("Erzeugt den Datenstrom des Zeitsenders Frankfurt DCF77.") print("Gibt diesen an Pin 16 aus (pin 18 invertiert).") print() ## Unterprogramme def pulse100(): global pulsenr global korrektur print("0",pulsenr) gpio.output(16, gpio.HIGH) gpio.output(18, gpio.LOW) time.sleep(0.1) gpio.output(16, gpio.LOW) gpio.output(18, gpio.HIGH) time.sleep(0.8 + korrektur) pulsenr +=1 def pulse200(): global pulsenr global korrektur print("1",pulsenr) gpio.output(16, gpio.HIGH) gpio.output(18, gpio.LOW) time.sleep(0.2) gpio.output(16, gpio.LOW) gpio.output(18, gpio.HIGH) time.sleep(0.7 + korrektur) pulsenr +=1 def pulse0(): global pulsenr global korrektur print("kein 1-0-Wechsel") print("_") gpio.output(16, gpio.LOW) gpio.output(18, gpio.HIGH) time.sleep(0.9 + korrektur) pulsenr=0 ## Hauptprogramm while 1==1: t = time.time() # Eine Minute hinzu, weil der Timestamp eine Minute Übertragungszeit benötigt. #.."Jetzt" würde immer eine Minute später angezeigt, #..darum wird eine Minute "vorgedreht". g= time.localtime(t+60) jahre=(g.tm_year) monate=(g.tm_mon) tage=(g.tm_mday) wday=(g.tm_wday) stunden=g.tm_hour minuten=g.tm_min sekunde=g.tm_sec zeitzone=g.tm_zone sommerzeit=g.tm_isdst print(jahre,monate,tage,stunden,minuten,sekunde,wday,zeitzone,sommerzeit) #Warten bis Minuten=0, dann starten print(sekunde,"Sekunden, warte auf 60") while g.tm_sec > 0: t = time.time() g = time.localtime(t+60) time.sleep(0.25) print("..los gehts") t = time.time() anfang = t # Eine Minute hinzu, weil der Timestamp eine Minute Übertragungszeit benötigt. #.."Jetzt" würde immer eine Minute später angezeigt, #..darum wird eine Minute "vorgedreht". g= time.localtime(t+60) jahre=(g.tm_year) monate=(g.tm_mon) tage=(g.tm_mday) wday=(g.tm_wday) stunden=g.tm_hour minuten=g.tm_min sekunde=g.tm_sec zeitzone=g.tm_zone sommerzeit=g.tm_isdst print(jahre,monate,tage,stunden,minuten,sekunde,wday,zeitzone,sommerzeit) ### Bit 0 immer 0 print("Start=0") pulse100() ### 14 mal 0 - Wetterdaten print("14Bit Wetterdaten (immer 0)") for i in range(0,14): pulse100() ### Alarm = nein = 0 print("Alarmbit (immer 0)") pulse100() ### SZ/WZ-Änderung steht bevor print("SZ/WZ steht bevor (immer 0)") pulse100() ### Sommerzeit/Winterzeit = 1,0; 0,1 print("Sommer/Winter = 1 0;0 1") if sommerzeit == 1: pulse200() pulse100() else: pulse100() pulse200() ### Schaltsekunde steht bevor - nein =0 print ("Schaltsekunde kommt nicht = 0") pulse100() ### Beginn der Zeitinfos print("Beginn der Zeitinformationen (immer 1)") pulse200() ###Minuten-Einer in Bits zerlegen### ## Minutenparität pari=0 #Wandeln in String minute = str(minuten) #Einer-Minuten herauslösen und zurück in Zahlenformat if len(minute) >1: minute = int(minute[1]) else: minute = int(minute) print("Minuten Low") for i in range(0,4): # Bit ermitteln und rechts schieben minbit = minute & 1 if minbit == 0: pulse100() else: pulse200() pari +=1 minute = minute >> 1 ###Minuten-Zehner in Bits zerlegen###### #Wandeln in String #Zehner-Minuten herauslösen und zurück in Zahlenformat minute = str(minuten) if len(minute) > 1: minute = int(minute[0]) else: minute = 0 print("Minuten High") for i in range(0,3): # Bit0-2 =10,20,40 Minuten maxbit = minute & 1 if maxbit == 0: pulse100() else: pulse200() pari +=1 minute = minute >> 1 # Minutenparität schreiben print("Minutenbitparität") if pari % 2 == 0: # gerade Parität pulse100() else: # ungerade Parität pulse200() ###### Stundenblock pari=0 stunde = str(stunden) print("Stunde",stunde,"-Einer") if len(stunde) > 1: stunde = int(stunde[1]) else: stunde = int(stunde) for i in range(0,4): minbit = stunde & 1 if minbit == 0: pulse100() else: pulse200() pari +=1 stunde = stunde >> 1 print("Stunde-Zehner") stunde = str(stunden) if len(stunde) > 1: stunde = int(stunde[0]) else: stunde = 0 for i in range(0,2): minbit = stunde & 1 if minbit == 0: pulse100() else: pulse200() pari +=1 stunde = stunde >> 1 # Stundenparität schreiben print("Stundenbitparität") if pari % 2 == 0: # gerade Parität pulse100() else: # ungerade Parität pulse200() ####Datumsblock pari=0 print("Tage-Einer") tag = str(tage) if len(tag) > 1: tag = int(tag[1]) else: tag = int(tag) for i in range(0,4): minbit = tag & 1 if minbit == 0: pulse100() else: pulse200() pari +=1 tag = tag >> 1 print("Tage-Zehner") tag = str(tage) if len(tag) > 1: tag = int(tag[0]) else: tag = 0 for i in range(0,2): minbit = tag & 1 if minbit == 0: pulse100() else: pulse200() pari +=1 tag = tag >> 1 ##Wochentag 0-6 = Mo-So 3-Bit print("Wochentag Mo = 0, So = 6") wtag=str(wday) wtag=int(wday) for i in range(0,3): maxbit = wtag & 1 if maxbit == 0: pulse100() else: pulse200() pari +=1 wtag = wtag >> 1 ##Monate monat=str(monate) print("Monat-Einer") if len(monat) > 1: monat = int(monat[0]) else: monat = int(monat) for i in range(0,4): minbit = monat & 1 if minbit == 0: pulse100() else: pulse200() pari +=1 monat = monat >> 1 monat=str(monate) print("Monat-Zehner") if len(monat) > 1: monat = int(monat[1]) else: monat = 0 for i in range(0,1): minbit = monat & 1 if minbit == 0: pulse100() else: pulse200() pari +=1 monat = monat >> 1 ###Jahr jahr=str(jahre) print("Jahr-Einer") jahr = jahr[3] jahr = int(jahr) for i in range(0,4): minbit = jahr & 1 if minbit == 0: pulse100() else: pulse200() pari +=1 jahr = jahr >> 1 #Zehner jahr=str(jahre) print("Jahr-Zehner") jahr = jahr[2] jahr = int(jahr) for i in range(0,4): minbit = jahr & 1 if minbit == 0: pulse100() else: pulse200() pari +=1 jahr = jahr >> 1 # Datumsparität schreiben print("Jahresbitparität") if pari % 2 == 0: # gerade Parität pulse100() else: # ungerade Parität pulse200() ###Neue Minute pulse0() ### Zeitkorrektur berechnen ## Sollzeit < 60.0 sec ## Ist-Zeitbedarf ermitteln: ende = time.time() scriptzeit = ende - anfang print("Zeitbedarf (s) =",scriptzeit) ## Autokorrektur berechnen if scriptzeit < 59.85: differenz = 59.95 - scriptzeit korrektur = korrektur + differenz / 60 if scriptzeit > 59.99: differenz = scriptzeit - 59.93 korrektur = korrektur - differenz / 60 print("Autokorrektur =",korrektur)