Nyob zoo Habr.
Tej zaum muaj coob tus uas yuav lub moos lossis chaw nres tsheb huab cua tau pom Xov Tooj Cua Tswj Clock lossis txawm tias Atomic Clock logo ntawm lub ntim. Qhov no yooj yim heev, vim tias koj tsuas yog yuav tsum tau muab lub moos tso rau ntawm lub rooj, thiab tom qab ib ntus nws yuav hloov kho raws li lub sijhawm.

Cia peb xyuas seb nws ua haujlwm li cas thiab sau tus decoder hauv Python.
Muaj ntau lub sijhawm synchronization tshuab. Qhov nrov tshaj plaws hauv Tebchaws Europe yog German system , Nyiv muaj nws tus kheej system , nyob USA muaj ib qhov system , thiab lwm yam. Tom ntej no, zaj dab neeg yuav hais txog DCF77, raws li qhov tseem ceeb tshaj plaws thiab siv tau rau kev txais tos hauv qee qhov chaw nyob sab Europe ntawm Russia thiab cov tebchaws nyob sib ze (cov neeg nyob hauv Far East tej zaum yuav muaj kev xav tsis zoo, txawm li cas los xij, lawv tuaj yeem tau txais. thiab txheeb xyuas cov teeb liab Japanese;).
Txhua yam sau hauv qab no yuav hais txog DCF77.
Teeb liab txais
DCF77 yog qhov chaw nres tsheb ntev nthwv dej ua haujlwm ntawm qhov zaus ntawm 77.5 kHz thiab xa cov teeb liab hauv amplitude modulation. Qhov chaw nres tsheb 50KW nyob ntawm 25 km ntawm Frankfurt, nws pib ua haujlwm hauv xyoo 1959, thiab xyoo 1973 cov ntaub ntawv tau muab ntxiv rau lub sijhawm. Lub wavelength ntawm ib zaus ntawm 77 KHz yog ntev heev, yog li qhov ntev ntawm lub kav hlau txais xov teb kuj zoo heev (duab los ntawm Wikipedia):

Nrog xws li ib tug kav hlau txais xov thiab lub hwj chim input, lub txais tos cheeb tsam npog yuav luag tag nrho cov teb chaws Europe, Belarus, Ukraine thiab ib feem ntawm Russia.

Leej twg tuaj yeem kaw lub teeb liab. Txhawm rau ua qhov no, tsuas yog mus rau tus txais online , xaiv qhov zaus 76.5KHz thiab USB hloov kho muaj. Ib daim duab yuav tsum qhib uas zoo li no:

Nyob ntawd peb nias lub download khawm thiab sau ib feem ob peb feeb ntev. Tau kawg, yog tias koj muaj "tiag tiag" receiver muaj peev xwm sau tau 77.5KHz zaus, koj tuaj yeem siv qhov ntawd.
Tau kawg, los ntawm kev tau txais xov tooj cua lub sijhawm teeb liab ntawm Is Taws Nem, peb yuav tsis tau txais lub sijhawm tiag tiag - lub teeb liab kis tau nrog kev ncua. Tab sis peb lub hom phiaj tsuas yog kom nkag siab txog cov qauv ntawm lub teeb liab; rau qhov no, kev kaw hauv Internet yog ntau tshaj li txaus. Hauv lub neej tiag tiag, tau kawg, cov cuab yeej tshwj xeeb yog siv rau kev txais thiab kev txiav txim siab; lawv yuav tau tham hauv qab no.
Yog li, peb tau txais cov ntaubntawv povthawj siv, cia peb pib ua nws.
Teeb liab decoding
Cia peb thauj cov ntaub ntawv siv Python thiab saib nws cov qauv:
from scipy.io import wavfile
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
sample_rate, data = wavfile.read("dcf_websdr_2019-03-26T20_25_34Z_76.6kHz.wav")
plt.plot(data[:100000])
plt.show()
Peb pom amplitude modulation:

Txhawm rau kom yooj yim txiav txim siab, cia peb nqa lub hnab ntawv teeb liab siv Hilbert hloov pauv:
analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])
Cov txiaj ntsig loj:

Cia peb ua kom cov suab nrov emissions siv lub lim dej qis, thiab tib lub sijhawm suav cov nqi nruab nrab, uas yuav muaj txiaj ntsig tom qab rau kev txheeb xyuas.
b, a = signal.butter(2, 20.0/sample_rate)
zi = signal.lfilter_zi(b, a)
A, _ = signal.lfilter(b, a, A, zi=zi*A[0])
avg = (np.amax(A) + np.amin(A))/2
Qhov tshwm sim (kab daj): yuav luag square yoj teeb liab uas yooj yim heev rau kev txheeb xyuas.

Parsing
Ua ntej koj yuav tsum tau txais qhov me ntsis ib ntus. Lub teeb liab qauv nws tus kheej yog yooj yim heev.

Cov pulses muab faib ua ob ntu. Yog hais tias qhov kev ncua deb ntawm pulses yog 0.1s (piv txwv li qhov ntev ntawm lub mem tes nws tus kheej yog 0.9s), ntxiv "0" rau qhov sib lawv liag me ntsis; yog tias qhov kev ncua deb yog 0.2s (piv txwv li qhov ntev yog 0.8s), ntxiv "1". Qhov kawg ntawm txhua feeb yog qhia los ntawm "ntev" mem tes, 2s ntev, qhov me ntsis ib ntus rov pib dua xoom, thiab rov pib dua.
Cov saum toj no yooj yim sau hauv Python.
sig_start, sig_stop = 0, 0
pos = 0
bits_str = ""
while pos < cnt - 4:
if A[pos] < avg and A[pos+1] > avg:
# Signal begin
sig_start = pos
if A[pos] > avg and A[pos+1] < avg:
# Signal end
sig_stop = pos
diff = sig_stop - sig_start
if diff < 0.85*sample_rate:
bits_str += "1"
if diff > 0.85*sample_rate and diff < 1.25*sample_rate:
bits_str += "0"
if diff > 1.5*sample_rate:
print(bits_str)
bits_str = ""
pos += 1
Yog li ntawd, peb tau txais ib ntu ntawm cov khoom, hauv peb qhov piv txwv rau ob vib nas this nws zoo li no:
0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000
Los ntawm txoj kev, nws yog qhov nthuav tias lub teeb liab kuj muaj "thib ob" ntawm cov ntaub ntawv. Lub ntsis ib theem kuj yog encoded siv . Hauv txoj kev xav, qhov no yuav tsum muab kev txiav txim siab zoo dua txawm tias muaj teeb meem tsis muaj zog.
Peb cov kauj ruam kawg: tau txais cov ntaub ntawv tiag tiag. Cov khoom raug xa mus ib zaug hauv ib ob, yog li peb muaj tag nrho ntawm 59 cov khoom, uas muaj ntau cov ntaub ntawv tau nkag mus:

Cov khoom tau piav qhia hauv , thiab lawv kuj xav paub heev. Thawj 15 cov khoom siv tsis siv, txawm hais tias muaj kev npaj siv lawv rau kev ceeb toom thiab kev tiv thaiv pej xeem. Bit A1 qhia tias lub moos yuav hloov mus rau hnub ci txuag lub sijhawm nyob rau ib teev tom ntej. Bit A2 qhia tias ib qho ntxiv , uas yog qee zaum siv los kho lub sijhawm raws li lub ntiaj teb kev sib hloov. Cov khoom seem encode teev, feeb, vib nas this thiab hnub tim.

Rau cov neeg uas xav sim ntawm lawv tus kheej, tus lej txiav txim siab tau muab rau hauv qab tus spoiler.
Qhov chaws code
def decode(bits):
if bits[0] != '0' or bits[20] != '1':
return
minutes, hours, day_of_month, weekday, month, year = map(convert_block,
(bits[21:28], bits[29:35], bits[36:42], bits[42:45],
bits[45:50], bits[50:58]))
days = ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')
print('{dow}, {dom:02}.{mon:02}.{y}, {h:02}:{m:02}'.format(h=hours, m=minutes, dow=days[weekday],
dom=day_of_month, mon=month, y=year))
def convert_ones(bits):
return sum(2**i for i, bit in enumerate(bits) if bit == '1')
def convert_tens(bits):
return 10*convert_ones(bits)
def right_parity(bits, parity_bit):
num_of_ones = sum(int(bit) for bit in bits)
return num_of_ones % 2 == int(parity_bit)
def convert_block(bits, parity=False):
if parity and not right_parity(bits[:-1], bits[-1]):
return -1
ones = bits[:4]
tens = bits[4:]
return convert_tens(tens) + convert_ones(ones)
Thaum peb khiav qhov program, peb yuav pom cov zis zoo ib yam li qhov no:
0011110110111000001011000001010000100110010101100010011000
Tuesday, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Tuesday, 26.03.19, 21:42
Qhov tseeb, qhov ntawd yog txhua yam khawv koob. Qhov zoo ntawm xws li ib qho system yog tias kev txiav txim siab yog qhov yooj yim heev thiab tuaj yeem ua tiav ntawm ib qho, txawm tias qhov yooj yim tshaj plaws microcontroller. Peb tsuas suav qhov ntev ntawm cov pulses, sau 60 khoom, thiab thaum kawg ntawm txhua feeb peb tau txais lub sijhawm. Piv nrog rau lwm txoj hauv kev synchronization ntawm lub sijhawm (GPS, piv txwv li, lossis Vajtswv txwv, Is Taws Nem:), xws li xov tooj cua synchronization yuav tsum tsis muaj hluav taws xob - piv txwv li, lub chaw nres tsheb huab cua hauv tsev ua haujlwm li ib xyoos ntawm 2 AA roj teeb. Yog li ntawd, txawm lub wristwatches yog tsim nrog xov tooj cua synchronization, tsis hais, ntawm chav kawm, phab ntsa watches los yog txoj kev chaw nres tsheb watches.
Qhov yooj yim thiab yooj yim ntawm DCF kuj nyiam DIY enthusiasts. Tsuas yog $ 10-20 koj tuaj yeem yuav ib lub kav hlau txais xov npaj tau nrog lub txais tos thiab TTL tso tawm, uas tuaj yeem txuas nrog Arduino lossis lwm yam khoom siv.

Twb tau sau rau Arduino . Txawm li cas los xij, nws twb paub lawm tias txawm koj ua dab tsi ntawm lub microcontroller, koj yuav xaus nrog lub moos lossis chaw nres tsheb huab cua. Nrog rau cov cuab yeej zoo li no, tau txais lub sijhawm tiag tiag yog qhov yooj yim heev, muab, tau kawg, tias koj nyob hauv thaj chaw txais tos. Zoo, koj tuaj yeem dai cov ntawv sau "Atomic Clock" ntawm koj lub moos, thiab tib lub sijhawm piav qhia rau txhua tus neeg tias lub cuab yeej yeej synchronized siv lub moos atomic.
Cov neeg uas xav tuaj yeem hloov kho lawv cov pog laus saib los ntawm kev txhim kho lub tshuab tshiab nrog xov tooj cua synchronization:

Koj tuaj yeem nrhiav tau ib qho ntawm ebay siv cov lus tseem ceeb "Xov tooj cua tswj kev txav".
Thiab thaum kawg, ib qho kev pab rau cov neeg uas tau nyeem txog qhov no. Txawm tias tsis muaj ib lub xov tooj cua xa xov tooj cua nyob hauv ob peb txhiab mais, nws yooj yim los tsim ib qho koj tus kheej. Muaj ib qho app hauv Google Play hu ua "DCF77 Emulator" uas tso tawm lub teeb liab rau lub mloog pob ntseg. Tus sau hais tias yog koj qhwv lub xov tooj cua ncig lub moos, nws yuav khaws lub teeb liab (Kuv xav paub tias yuav ua li cas, vim tias lub mloog pob ntseg ib txwm yuav tsis tsim lub teeb liab 77 kHz, tab sis nws tej zaum yog vim muaj harmonics). Ntawm kuv lub moos... Android Qhov kev pab cuam 9 tsis ua haujlwm li - tsuas yog tsis muaj suab (lossis tej zaum kuv tsuas yog tsis hnov ββββnws - nws yog 77 kHz, tom qab tag nrho. :)), tab sis tej zaum lwm tus yuav muaj hmoo zoo dua. Txawm li cas los xij, qee tus neeg tsim lawv tus kheej lub tshuab hluav taws xob DCF puv ntoob, uas yooj yim ua siv Arduino lossis ESP32:

(qhov chaw )
xaus
Lub DCF system tau ua kom yooj yim heev thiab yooj yim. Nrog kev pab los ntawm ib tug yooj yim thiab pheej yig receiver, koj muaj peev xwm muaj lub caij nyoog lub sij hawm ib txwm thiab nyob txhua qhov chaw, ntawm chav kawm nyob rau hauv lub txais tos. Nws zoo nkaus li tias txawm hais tias muaj ntau qhov digitalization thiab Internet ntawm Yam, cov kev daws teeb meem yooj yim no yuav xav tau ntev.
Tau qhov twg los: www.hab.com
