Hello Habr.
Mohlomong ba bangata ba rekang oache kapa seteishene sa boemo ba leholimo ba bone letšoao la Radio Controlled Clock kapa esita le letšoao la Atomic Clock ka har'a sephutheloana. Sena se loketse haholo, hobane o hloka feela ho beha oache tafoleng, 'me ka mor'a nakoana e tla ikamahanya le nako e nepahetseng.
Ha re boneng hore na e sebetsa joang 'me re ngole decoder ho Python.
Ho na le litsamaiso tse fapaneng tsa khokahano ea nako. E tummeng ka ho fetisisa Europe ke tsamaiso ea Jeremane
Ntho e ngoe le e ngoe e ngotsoeng ka tlase e tla bua ka DCF77.
Kamohelo ea lipontšo
DCF77 ke seteishene se selelele sa maqhubu se sebetsang ka sekhahla sa 77.5 kHz le ho fetisa matshwao ka ho feto-fetoha ha molumo oa amplitude. Seteishene sa 50KW se lik'hilomithara tse 25 ho tloha Frankfurt, se qalile ho sebetsa ka 1959, 'me ka 1973 tlhahisoleseding ea letsatsi e ile ea eketsoa ka nako e nepahetseng. Bophahamo ba maqhubu a maqhubu a 77 KHz bo bolelele haholo, ka hona, boholo ba lebala la antenna le bona bo nepahetse (setšoantšo se tsoang Wikipedia):
Ka li-antenna tse joalo le ho kenya matla, sebaka sa kamohelo se akaretsa hoo e batlang e le Europe eohle, Belarus, Ukraine le karolo ea Russia.
Mang kapa mang a ka rekota lets'oao. Ho etsa sena, e ea feela ho moamoheli oa inthanete
Ha re le moo re tobetsa konopo ea ho jarolla ebe re rekota sekhechana sa metsotso e mengata. Ehlile, haeba u na le moamoheli oa "sebele" ea khonang ho rekota maqhubu a 77.5KHz, u ka e sebelisa.
Ehlile, ka ho amohela matšoao a nako ea seea-le-moea ka Marang-rang, re ke ke ra fumana nako e nepahetseng e le kannete - lets'oao le fetisoa ka tieho. Empa sepheo sa rona ke ho utloisisa sebopeho sa lets'oao feela; bakeng sa sena, ho rekota marang-rang ho feta ho lekana. Bophelong ba 'nete, ho sebelisoa lisebelisoa tse khethehileng bakeng sa ho amohela le ho hlophisa; li tla tšohloa ka tlase.
Kahoo, re se re fumane rekoto, ha re qaleng ho e sebetsa.
Tlhaloso ea Letšoao
Ha re kenye faele re sebelisa Python 'me re bone sebopeho sa eona:
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()
Re bona modulation e tloaelehileng ea amplitude:
Ho nolofatsa decoding, ha re nke enfelopo ea matšoao re sebelisa phetoho ea Hilbert:
analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])
Sephetho se atolositsoeng:
Ha re tlose mesi ea lerata re sebelisa sefahla se tlase, 'me ka nako e ts'oanang re bale boleng bo tloaelehileng, bo tla ba molemo hamorao bakeng sa ho arola.
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
Sephetho (mola o mosehla): leqhubu le batlang le le sekwere le bonolo ho le sekaseka.
Ho hlalosa
Pele u lokela ho fumana tatellano ea li-bit. Sebopeho sa pontšo ka boeona se bonolo haholo.
Li-pulses li arotsoe ka mekhahlelo ea bobeli. Haeba sebaka se pakeng tsa li-pulse ke 0.1s (ke hore bolelele ba sekhahla ka boeona ke 0.9s), eketsa "0" ho tatellano e nyenyane; haeba sebaka se le 0.2s (e leng bolelele ke 0.8s), eketsa "1". Qetello ea motsotso o mong le o mong e bontšoa ke "nako e telele", 2s e telele, tatellano e nyenyane e khutlisetsoa ho zero, 'me ho tlatsa ho qala hape.
Lintlha tse ka holimo li bonolo ho li ngola ka 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
Ka lebaka leo, re fumana tatellano ea likotoana, mohlala oa rona bakeng sa metsotsoana e 'meli e shebahala tjena:
0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000
Ka tsela, hoa thahasellisa hore letšoao le boetse le na le "lera la bobeli" la data. Biti tatelano e boetse e encoded sebelisa
Mohato oa rona oa ho qetela: ho fumana data ea sebele. Li-Bits li fetisoa hang ka motsotsoana, kahoo re na le kakaretso ea li-bits tse 59, moo boitsebiso bo bongata bo kenngoeng ka khouto:
Likotoana li hlalositsoe ho
Bakeng sa ba batlang ho etsa liteko ka bobona, khoutu ea decoding e fanoa tlas'a spoiler.
Khoutu ea mohloli
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)
Ha re tsamaisa lenaneo, re tla bona tlhahiso e tšoanang le ena:
0011110110111000001011000001010000100110010101100010011000
Tuesday, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Tuesday, 26.03.19, 21:42
Ha e le hantle, ke eona feela boselamose. Monyetla oa sistimi e joalo ke hore decoding e bonolo haholo mme e ka etsoa ho efe kapa efe, esita le microcontroller e bonolo ka ho fetisisa. Re bala feela bolelele ba li-pulses, re bokella likotoana tse 60, 'me qetellong ea motsotso o mong le o mong re fumana nako e tobileng. Ha ho bapisoa le mekhoa e meng ea ho hokahanya ha nako (GPS, mohlala, kapa ha Molimo a hanela, Inthanete :), ho hokahanya ha seea-le-moea ho hloka hoo e batlang e le ha ho na motlakase - ka mohlala, seteishene sa kamehla sa boemo ba leholimo se sebetsa nako e ka etsang selemo ho li-betri tsa 2 AA. Ka hona, esita le lioache tsa letsoho li entsoe ka ho lumellana ha seea-le-moea, ho sa tsotellehe, ho hlakile, litebelo tsa lebota kapa liteishene tsa literata.
Bonolo le bonolo ba DCF le tsona li hohela ba chesehelang DIY. Bakeng sa $ 10-20 feela o ka reka mojule oa antenna o itokiselitseng o nang le moamoheli o lokiselitsoeng le tlhahiso ea TTL, e ka hokahantsoeng le Arduino kapa molaoli e mong.
E se e ngoletsoe Arduino
Ba lakatsang ba ka ba ba ntlafatsa oache ea nkhono oa bona oa khale ka ho kenya mochini o mocha o nang le khokahano ea radio:
U ka e fumana ho ebay u sebelisa mantsoe a sehlooho "Motsamao o Laolehileng oa Radio".
'Me qetellong, ho senya bophelo bakeng sa ba balileng ho fihlela joale. Le haeba ho se na sesebelisoa se le seng sa seea-le-moea sebakeng sa lik'hilomithara tse likete tse latelang, ha ho thata ho iketsetsa lets'oao le joalo. Ho na le lenaneo ho Google Play le bitsoang "DCF77 Emulator" le hlahisang lets'oao ho li-headphone. Ho ea ka mongoli, haeba u phuthela terata ea li-headphone ho pota oache, ba tla nka letšoao (hoa thahasellisa joang, hobane li-headphones tse tloaelehileng li ke ke tsa hlahisa letšoao la 77KHz, empa kamohelo e ka 'na ea e-ba ka lebaka la li-harmonics). Ho Android 9, lenaneo ha lea ka la nthusa ho hang - ho ne ho se na molumo (kapa mohlomong ha kea o utloa - ke 77KHz, ka mor'a tsohle :), empa mohlomong motho e mong o tla ba le mahlohonolo. Leha ho le joalo, ba bang ba iketsetsa jenereithara e felletseng ea DCF, eo ho leng bonolo ho e etsa ho Arduino kapa ESP32 e tšoanang:
(mohloli o moholo
fihlela qeto e
Sistimi ea DCF e ile ea bonahala e le bonolo ebile e le bonolo. Ka thuso ea mochine o bonolo le o theko e tlaase, o ka ba le nako e nepahetseng kamehla le hohle, ha e le hantle sebakeng sa kamohelo. Ho bonahala eka le ho sa tsotellehe ho ata ha digitalization le Inthanete ea Lintho, litharollo tse joalo tse bonolo li tla ba teng ka nako e telele.
Source: www.habr.com