Mhoro Habr.
Pamwe vazhinji vanotenga wachi kana chiteshi chemamiriro ekunze vaona Radio Controlled Clock kana kunyange Atomic Clock logo pakurongedzerwa. Izvi zvakanyanya nyore, nekuti iwe unongoda kuisa wachi patafura, uye mushure mechinguva inozozvigadzirisa kune chaiyo nguva.

Ngationei kuti inoshanda sei uye tinyore decoder muPython.
Kune akasiyana masisitimu ekuyananisa nguva. Iyo inonyanya kufarirwa muEurope iGerman system , Japan ine hurongwa hwayo , kuUSA kune system , zvichingoenda zvakadaro. Tevere, iyo nyaya ichava yeDCF77, seyakanyanya kukosha uye inosvikika yekugamuchirwa mune dzimwe nzvimbo muEuropean chikamu cheRussia uye nyika dzakavakidzana (vagari vekuFar East vangave nemafungiro akasiyana, zvisinei, ivo, ivowo, vanogona kugamuchira. uye ongorora chiratidzo cheJapan;).
Zvese zvakanyorwa pazasi zvichange zviri nezve DCF77.
Signal reception
DCF77 inzvimbo refu yemafungu inoshanda pafrequency ye77.5 kHz uye inotumira masaini mune amplitude modulation. Chiteshi che50KW chiri makiromita makumi maviri neshanu kubva kuFrankfurt, chakatanga kushanda muna 25, uye muna 1959 ruzivo rwezuva rwakawedzerwa kune iyo nguva chaiyo. Iyo wavelength pafrequency ye 1973 KHz yakareba kwazvo, saka zviyero zvemunda weantenna zvakare zvakatsiga (mufananidzo kubva kuWikipedia):

Iine antenna yakadaro uye simba rekuisa, nzvimbo yekugamuchira inovhara inenge yese yeEurope, Belarus, Ukraine uye chikamu cheRussia.

Chero ani zvake anogona kunyora chiratidzo. Kuti uite izvi, ingoenda kune inogamuchira online , sarudza frequency 76.5KHz uye USB modulation ipapo. Mufananidzo unofanirwa kuvhurwa unotaridzika seizvi:

Ikoko tinodzvanya bhatani rekurodha uye tinorekodha chidimbu maminetsi akati wandei. Ehe, kana iwe uine "chaiyo" inogamuchira inokwanisa kurekodha iyo 77.5KHz frequency, unogona kuzvishandisa.
Ehe, nekugamuchira masaini eredhiyo nguva kuburikidza neInternet, isu hatigamuchire chaiyo chaiyo nguva - chiratidzo chinofambiswa nekunonoka. Asi chinangwa chedu ndechekunzwisisa chimiro chechiratidzo; nekuda kweizvi, kurekodha kweInternet kunopfuura zvakakwana. Muhupenyu chaihwo, hongu, maturusi ehunyanzvi anoshandiswa kugashira uye kudhirodha; ivo vanozokurukurwa pazasi.
Saka, tagamuchira kurekodhwa, ngatitangei kugadzirisa.
Signal Decoding
Ngatiisei faira tichishandisa Python uye tione chimiro chayo:
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()
Isu tinoona yakajairika amplitude modulation:

Kurerutsa decoding, ngatitorei hamvuropu yechiratidzo tichishandisa Hilbert shanduko:
analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])
Mubairo wakakurisa:

Ngatigadzirise kuburitsa kweruzha tichishandisa yakaderera-pass sefa, uye panguva imwe chete kuverenga kukosha kweavhareji, iyo inozobatsira gare gare pakurongedza.
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
Mhedzisiro (yero mutsara): chiratidzo chinenge square wave chiri nyore kuongorora.

Parsing
Kutanga iwe unofanirwa kuwana iyo bit sequence. Chimiro chechiratidzo pachacho chiri nyore kwazvo.

Mapurusi akakamurwa kuita nhanho dzechipiri. Kana chinhambwe chiri pakati pemapuruzi chiri 0.1s (kureva kuti kureba kwepombo pachayo kuri 0.9s), wedzera "0" kune kutevedzana kwebhiti; kana chinhambwe chiri 0.2s (kureva kureba kuri 0.8s), wedzera "1". Kupera kweminiti imwe neimwe kunoratidzwa ne "refu" pulse, 2s kureba, bit sequence inogadziriswazve kune zero, uye kuzadza kunotanga zvakare.
Izvo zviri pamusoro zviri nyore kunyora muPython.
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
Nekuda kweizvozvo, tinowana kutevedzana kwemabits, mumuenzaniso wedu kwemasekonzi maviri zvinoita seizvi:
0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000
Nenzira, zvinonakidza kuti chiratidzo chinewo "yechipiri layer" yedata. Iyo bit sequence inoiswawo encoded uchishandisa . Mune dzidziso, izvi zvinofanirwa kupa yakawedzera kusimba decoding kunyangwe iri nyaya yechiratidzo chisina simba.
Nhanho yedu yekupedzisira: kuwana iyo chaiyo data. Mabhiti anofambiswa kamwe pasekondi, saka isu tine huwandu hwe59 bits, umo ruzivo rwakawanda rwakaiswa encoded:

Mabhiti anotsanangurwa mukati , uye vanoda kuziva. Iwo mabhiti gumi nemashanu ekutanga haashandiswe, kunyangwe paine zvirongwa zvekuashandisa kune yambiro masisitimu uye kudzivirira kwevanhu. Bit A15 inoratidza kuti wachi ichachinja kuita masikati ekuchengetedza nguva muawa inotevera. Bit A1 inoratidza kuti imwe yekuwedzera , iyo dzimwe nguva inoshandiswa kugadzirisa nguva maererano nekutenderera kweNyika. Iwo asara mabhiti encode maawa, maminetsi, masekondi uye zuva.

Kune avo vanoda kuedza ivo pachavo, iyo decoding code inopiwa pasi pemuparadzi.
Purogiramu yekupa
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)
Patinomhanyisa chirongwa, tinoona kubuda kwakafanana neiyi:
0011110110111000001011000001010000100110010101100010011000
Tuesday, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Tuesday, 26.03.19, 21:42
Chaizvoizvo, ndiwo ese mashiripiti. Chakanakira sisitimu yakadai ndechekuti decoding yakapusa uye inogona kuitwa pane chero, kunyangwe yakapusa microcontroller. Isu tinongoverenga kureba kwemapulses, kuunganidza 60 bits, uye pakupera kweminiti imwe neimwe tinowana nguva chaiyo. Kuenzaniswa nedzimwe nzira dzekubatanidza nguva (GPS, semuenzaniso, kana Mwari ngaasadaro, Indaneti :), kuwiriranisa kweredhiyo kwakadaro kunoda anenge asina magetsi - semuenzaniso, chiteshi chemamiriro ekunze pamba chinomhanya kwerinenge gore pamabhatiri maviri AA. Naizvozvo, kunyangwe mawachi emaoko anogadzirwa neredhiyo synchronization, tisingataure, hongu, mawachi emadziro kana mawachi echiteshi.
Iko kureruka uye kureruka kweDCF zvakare kunokwezva DIY vanofarira. Nemadhora gumi kusvika makumi maviri chete unogona kutenga antenna module ine yakagadzirira-yakagadzirwa inogamuchira uye TTL inobuda, inogona kubatana neArduino kana imwe controller.

Yakatonyorerwa Arduino . Nekudaro, zvave kutozivikanwa kuti kunyangwe zvaunoita pane microcontroller, unopedzisira uine wachi kana chiteshi chemamiriro ekunze. Nechigadzirwa chakadaro, kuwana nguva chaiyo iri nyore chaizvo, yakapiwa, hongu, iwe uri munzvimbo yekugamuchira. Zvakanaka, iwe unogona kuturika chinyorwa "Atomic Clock" pawachi yako, uye panguva imwechete tsanangurira kune wese munhu kuti mudziyo wakanyatso kuwiriraniswa uchishandisa wachi yeatomu.
Avo vanoshuvira vanogona kunyange kukwidziridza wachi yavo yekare nekuisa michina mitsva ine radio synchronization:

Unogona kuwana imwe pa ebay uchishandisa mazwi akakosha "Radio Controlled Movement".
Uye pakupedzisira, nzira yehupenyu kune avo vakamboverenga kusvika pano. Kunyangwe pasina kana imwe chete yeredhiyo iri mukati memakiromita zviuru zviviri, zviri nyore kugadzira imwe iwe pachako. Pane app paGoogle Play inonzi "DCF77 Emulator" inoburitsa chiratidzo kumahedhifoni. Munyori anoti kana ukaputira tambo yehedhifoni pawachi, ichatora chiratidzo (ndinoshamisika kuti sei, sezvo mahedhifoni akajairwa asingaburitse chiratidzo che77 kHz, asi zvichida zvinokonzerwa nemaharmonics). Pawachi yangu... Android Chirongwa 9 hachina kushanda zvachoseβpakanga pasina ruzha (kana kuti pamwe handina kukwanisa kurwunzwaβi77 kHz, mushure mezvose. :)), asi pamwe mumwe munhu achava nerombo rakanaka. Zvisinei, vamwe vanhu vanogadzira jenareta yavo yakazara yeDCF signal, iyo iri nyore kugadzira uchishandisa Arduino kana ESP32:

(tsime )
mhedziso
Iyo DCF sisitimu yakazove yakapusa uye nyore. Nerubatsiro rwemugamuchiri ari nyore uye akachipa, unogona kuva nenguva chaiyo nguva dzose uye kwese kwese, hongu munzvimbo yekugamuchira. Zvinoita sekunge kunyangwe kupararira kwedhijitari uye Internet yezvinhu, zvigadziriso zviri nyore zvakadaro zvichange zvichidikanwa kwenguva yakareba.
Source: www.habr.com
