Hello Habr.
Tingali daghan nga namalit og relo o weather station ang nakakita sa Radio Controlled Clock o bisan Atomic Clock nga logo sa packaging. Kini sayon ββββkaayo, tungod kay kinahanglan nimo nga ibutang ang orasan sa lamesa, ug pagkahuman sa usa ka panahon kini awtomatiko nga mag-adjust sa eksaktong oras.

Atong mahibal-an kung giunsa kini paglihok ug pagsulat usa ka decoder sa Python.
Adunay lainlaing mga sistema sa pag-synchronize sa oras. Ang labing popular sa Europe mao ang German nga sistema , ang Japan adunay kaugalingong sistema , sa USA naay sistema , ug uban pa. Sunod, ang istorya mahitungod sa DCF77, ingon nga ang labing may kalabutan ug accessible alang sa pagdawat sa pipila ka mga dapit sa European nga bahin sa Russia ug silingang mga nasud (mga residente sa Far East mahimong adunay kaatbang nga opinyon, bisan pa niana, sila, sa baylo, makadawat ug analisa ang Japanese signal;).
Ang tanan nga gisulat sa ubos mahitungod sa DCF77.
Pagdawat sa signal
Ang DCF77 usa ka taas nga istasyon sa balud nga naglihok sa frequency nga 77.5 kHz ug nagpadala mga signal sa amplitude modulation. Ang estasyon sa 50KW nahimutang 25 km gikan sa Frankfurt, nagsugod kini sa operasyon kaniadtong 1959, ug kaniadtong 1973 ang impormasyon sa petsa gidugang sa eksaktong oras. Ang wavelength sa frequency nga 77 KHz taas kaayo, busa ang mga sukod sa antenna field medyo disente usab (litrato gikan sa Wikipedia):

Uban sa ingon nga antenna ug power input, ang reception area naglangkob sa halos tibuok Europe, Belarus, Ukraine ug bahin sa Russia.

Bisan kinsa makarekord og signal. Aron mahimo kini, adto lang sa online receiver , pilia ang frequency 76.5KHz ug USB modulation didto. Kinahanglang magbukas ang usa ka imahen nga ingon niini:

Didto among gipugos ang buton sa pag-download ug girekord ang usa ka tipik pipila ka minuto ang gitas-on. Siyempre, kung ikaw adunay "tinuod" nga tigdawat nga makahimo sa pagrekord sa 77.5KHz frequency, mahimo nimong gamiton kana.
Siyempre, pinaagi sa pagdawat sa mga signal sa oras sa radyo pinaagi sa Internet, dili kami makadawat sa tinuud nga tukma nga oras - ang signal gipasa sa usa ka paglangan. Apan ang among katuyoan mao ra ang pagsabut sa istruktura sa signal; alang niini, ang pagrekord sa Internet labi pa sa igo. Sa tinuud nga kinabuhi, siyempre, gigamit ang mga espesyal nga aparato alang sa pagdawat ug pag-decode, hisgutan sa ubos.
Busa, nadawat na namo ang rekording, ato nang sugdan ang pagproseso niini.
Pag-decode sa Signal
Atong i-load ang file gamit ang Python ug tan-awa ang istruktura niini:
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()
Nakita namon ang tipikal nga modulasyon sa amplitude:

Aron mapasayon ββang pag-decode, atong kuhaon ang signal envelope gamit ang Hilbert transform:
analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])
Gipadako nga resulta:

Atong pahapsay ang mga emisyon sa kasaba gamit ang usa ka low-pass nga filter, ug sa samang higayon kuwentahon ang kasagaran nga kantidad, nga magamit sa ulahi alang sa pag-parse.
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
Resulta (dilaw nga linya): usa ka hapit square wave signal nga dali ra analisahon.

Pag-parse
Una kinahanglan nimo nga makuha ang gamay nga pagkasunod-sunod. Ang istruktura sa signal mismo yano kaayo.

Ang mga pulso gibahin sa ikaduha nga mga agwat. Kung ang gilay-on tali sa mga pulso 0.1s (ie ang gitas-on sa pulso mismo 0.9s), idugang ang "0" sa gamay nga han-ay; kung ang distansya 0.2s (ie ang gitas-on mao ang 0.8s), idugang ang "1". Ang katapusan sa matag minuto gipakita sa usa ka "taas" nga pulso, 2s ang gitas-on, ang gamay nga han-ay gi-reset sa zero, ug ang pagpuno magsugod pag-usab.
Ang sa ibabaw dali nga isulat sa 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
Ingon usa ka sangputanan, nakakuha kami usa ka han-ay sa mga bit, sa among panig-ingnan sa duha ka segundo ingon kini:
0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000
Pinaagi sa dalan, kini makapaikag nga ang signal usab adunay "ikaduha nga layer" sa datos. Ang bit nga han-ay gi-encode usab gamit . Sa teorya, kini kinahanglan nga maghatag labi ka lig-on nga pag-decode bisan sa kaso sa usa ka huyang nga signal.
Ang among katapusang lakang: pagkuha sa aktuwal nga datos. Ang mga bit gipasa kausa matag segundo, mao nga kita adunay kinatibuk-an nga 59 ka mga bit, diin daghang impormasyon ang na-encode:

Ang mga bit gihulagway sa , ug medyo kuryuso sila. Ang una nga 15 ka bit wala gigamit, bisan kung adunay mga plano nga gamiton kini alang sa mga sistema sa pasidaan ug sibil nga depensa. Ang bit A1 nagpakita nga ang orasan mausab sa daylight saving time sa sunod nga oras. Bit A2 nagpakita nga ang usa ka dugang , nga usahay gigamit sa pag-adjust sa oras sumala sa pagtuyok sa Yuta. Ang nahabilin nga mga piraso nag-encode sa mga oras, minuto, segundo ug petsa.

Alang niadtong gusto nga mag-eksperimento sa ilang kaugalingon, ang decoding code gihatag ubos sa spoiler.
Source 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)
Kung atong gipadagan ang programa, atong makita ang output nga susama niini:
0011110110111000001011000001010000100110010101100010011000
Tuesday, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Tuesday, 26.03.19, 21:42
Sa tinuud, kana ang tanan nga salamangka. Ang bentaha sa ingon nga sistema mao nga ang pag-decode labi ka yano ug mahimo sa bisan unsang, bisan ang pinakasimple nga microcontroller. Giihap lang namo ang gitas-on sa mga pulso, natigom ang 60 ka bits, ug sa kataposan sa matag minuto makuha namo ang eksaktong oras. Kung itandi sa ubang mga pamaagi sa pag-synchronize sa oras (GPS, pananglitan, o idili sa Diyos, ang Internet :)), ang ingon nga pag-synchronize sa radyo halos walaβy kinahanglan nga kuryente - pananglitan, ang usa ka regular nga istasyon sa panahon sa balay nagdagan mga usa ka tuig sa 2 ka baterya sa AA. Busa, bisan ang mga relo sa pulso gihimo uban sa pag-synchronize sa radyo, wala pay labot, siyempre, mga relo sa dingding o mga relo sa estasyon sa kadalanan.
Ang kasayon ββββug kayano sa DCF nakadani usab sa mga mahiligon sa DIY. Para lang sa $10-20 makapalit ka ug ready-made antenna module nga adunay ready-made receiver ug TTL output, nga mahimong konektado sa Arduino o uban pang controller.

Gisulat na alang sa Arduino . Bisan pa, nahibal-an na nga bisan unsa pa ang imong buhaton sa usa ka microcontroller, adunay usa ka orasan o usa ka istasyon sa panahon. Sa ingon nga aparato, ang pagkuha sa eksakto nga oras dali ra, nga gihatag, siyempre, nga naa ka sa lugar sa pagdawat. Aw, mahimo nimong ibitay ang inskripsiyon nga "Atomic Clock" sa imong relo, ug sa samang higayon ipasabut sa tanan nga ang aparato gi-synchronize gyud gamit ang atomic nga orasan.
Kadtong nangandoy mahimo pa gani nga mag-upgrade sa relo sa ilang tigulang nga lola pinaagi sa pag-instalar og bag-ong mekanismo nga adunay pag-synchronize sa radyo:

Makita nimo ang usa sa ebay gamit ang mga keyword nga "Radio Controlled Movement".
Ug sa katapusan, usa ka life hack para sa mga nakabasa na niini. Bisan kung walay bisan usa ka radio transmitter sulod sa pipila ka libo ka kilometro, dali ra ang paghimo niini sa imong kaugalingon. Adunay usa ka app sa Google Play nga gitawag og "DCF77 Emulator" nga mopagawas og signal ngadto sa mga headphone. Ang tagsulat nag-ingon nga kung imong iputos ang headphone cable sa relo, kini mokuha sa signal (Natingala ko kung giunsa, tungod kay ang regular nga mga headphone dili makahimo og 77 kHz nga signal, apan lagmit tungod kini sa harmonics). Sa akong relo... Android Wala gyud mogana ang Program 9βwala lang gyuy tingog (o basin wala lang gyud ko kadungogβ77 kHz man diay. :)), pero basin mas swertehon ang uban. Apan, ang ubang mga tawo naghimo sa ilang kaugalingong kompletong DCF signal generator, nga dali ra buhaton gamit ang Arduino o ESP32:

(gigikanan )
konklusyon
Ang sistema sa DCF nahimo nga yano ug sayon. Sa tabang sa usa ka yano ug barato nga tigdawat, mahimo nimo ang eksaktong oras kanunay ug bisan diin, siyempre sa lugar sa pagdawat. Ingon og bisan pa sa kaylap nga digitalization ug sa Internet of Things, ang ingon nga yano nga mga solusyon kinahanglan nga pangayoon sa dugay nga panahon.
Source: www.habr.com
