Hello Habr.
Mwinamwake ambiri amene amagula wotchi kapena malo owonetsera nyengo awonapo chizindikiro cha Radio Controlled Clock kapena Atomic Clock pachovala. Izi ndizothandiza kwambiri, chifukwa mumangofunika kuyika wotchiyo patebulo, ndipo pakapita nthawi idzasintha nthawi yake.
Tiyeni tiwone momwe zimagwirira ntchito ndikulemba decoder mu Python.
Pali njira zosiyanasiyana zolumikizirana nthawi. Odziwika kwambiri ku Europe ndi dongosolo la Germany
Chilichonse cholembedwa pansipa chikhala chokhudza DCF77.
Kulandila kwa ma Signal
DCF77 ndi mafunde aatali omwe amagwira ntchito pafupipafupi 77.5 kHz ndikutumiza ma siginecha mumatalikidwe osinthika. Sitima yapamtunda ya 50KW ili pamtunda wa 25 km kuchokera ku Frankfurt, idayamba kugwira ntchito mu 1959, ndipo mu 1973 zambiri zatsiku zidawonjezedwa ku nthawi yeniyeni. Kutalika kwa mafunde pafupipafupi 77 KHz ndiatali kwambiri, kotero miyeso ya gawo la mlongoti ndi yabwino kwambiri (chithunzi kuchokera ku Wikipedia):
Ndi mlongoti wotere ndi kulowetsa mphamvu, malo olandirira alendo amafika pafupifupi ku Ulaya, Belarus, Ukraine ndi mbali ya Russia.
Aliyense akhoza kulemba chizindikiro. Kuti muchite izi, ingopitani ku wolandila pa intaneti
Pamenepo timasindikiza batani lotsitsa ndikulemba kachidutswa kwa mphindi zingapo. Zachidziwikire, ngati muli ndi "weniweni" wolandila yemwe amatha kujambula ma frequency a 77.5KHz, mutha kugwiritsa ntchito.
Zoonadi, polandira zizindikiro za nthawi ya wailesi kudzera pa intaneti, sitidzalandira nthawi yolondola - chizindikirocho chimaperekedwa mochedwa. Koma cholinga chathu ndikungomvetsetsa mawonekedwe a chizindikirocho; pa izi, kujambula pa intaneti ndikokwanira. M'moyo weniweni, zida zapadera zimagwiritsidwa ntchito polandila ndi kusindikiza; zidzakambidwa pansipa.
Kotero, talandira kujambula, tiyeni tiyambe kukonza.
Kusintha kwa Signal
Tiyeni tiyike fayiloyo pogwiritsa ntchito Python ndikuwona kapangidwe kake:
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()
Timawona kusinthasintha kwa matalikidwe:
Kuti muchepetse kumasulira, tiyeni titenge envelopu yolumikizira pogwiritsa ntchito kusintha kwa Hilbert:
analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])
Zotsatira zokulitsidwa:
Tiyeni tiwongolere zotulutsa zaphokoso pogwiritsa ntchito fyuluta yotsika pang'ono, ndipo nthawi yomweyo tiziwerengera mtengo wapakati, womwe udzakhala wothandiza mtsogolomo.
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
Zotsatira (mzere wachikasu): chizindikiro cha mafunde pafupifupi masikweya chomwe ndi chosavuta kuunika.
Kusanthula
Choyamba muyenera kupeza bits sequence. Mapangidwe azizindikiro okha ndi osavuta.
Ma pulses amagawidwa mu magawo achiwiri. Ngati mtunda wapakati pa pulse ndi 0.1s (ie kutalika kwa kugunda komweko ndi 0.9s), onjezani "0" kutsatizana pang'ono; ngati mtunda uli 0.2s (ie kutalika ndi 0.8s), onjezani "1". Mapeto a miniti iliyonse akuwonetsedwa ndi kugunda kwa "kutalika", 2s kutalika, kutsatizana pang'ono kumakhazikitsidwanso ku zero, ndipo kudzaza kumayambanso.
Zomwe zili pamwambazi ndizosavuta kulemba mu 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
Zotsatira zake, timapeza ma bits, mu chitsanzo chathu kwa masekondi awiri zikuwoneka motere:
0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000
Mwa njira, ndizosangalatsa kuti chizindikirocho chilinso ndi "gawo lachiwiri" la deta. The bit sequence is also encoded ntchito
Gawo lathu lomaliza: kupeza deta yeniyeni. Ma bits amatumizidwa kamodzi pa sekondi iliyonse, kotero tili ndi ma bits 59, momwe zambiri zimasungidwa:
Mabiti akufotokozedwa mu
Kwa iwo omwe akufuna kuyesa okha, code decoding imaperekedwa pansi pa wowononga.
Nambala yachinsinsi
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)
Tikayendetsa pulogalamuyo, tidzawona zotsatira zofanana ndi izi:
0011110110111000001011000001010000100110010101100010011000
Tuesday, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Tuesday, 26.03.19, 21:42
Kwenikweni, ndiwo matsenga onse. Ubwino wamakina otere ndikuti decoding ndiyosavuta kwambiri ndipo imatha kuchitika pa chilichonse, ngakhale chowongolera chosavuta kwambiri. Timangowerengera kutalika kwa ma pulse, kudziunjikira ma bits 60, ndipo kumapeto kwa mphindi iliyonse timapeza nthawi yeniyeni. Poyerekeza ndi njira zina za kalunzanitsidwe nthawi (GPS, mwachitsanzo, kapena Mulungu aletsa, Intaneti :), ngati wailesi kalunzanitsidwe amafuna pafupifupi palibe magetsi - mwachitsanzo, wokhazikika kunyumba siteshoni nyengo akuthamanga kwa pafupifupi chaka pa 2 AA mabatire. Chifukwa chake, ngakhale mawotchi am'manja amapangidwa ndi kulumikizana kwa wailesi, osatchulanso, mawotchi apakhoma kapena mawotchi apamsewu.
Kusavuta komanso kuphweka kwa DCF kumakopanso okonda DIY. Kwa $ 10-20 yokha mutha kugula gawo la mlongoti lopangidwa mokonzeka ndi cholandirira chokonzekera ndi kutulutsa kwa TTL, komwe kumatha kulumikizidwa ndi Arduino kapena wowongolera wina.
Zalembedwa kale ku Arduino
Iwo omwe akufuna atha kukweza wotchi ya agogo awo akale poyika makina atsopano ndi kulumikizana ndi wailesi:
Mutha kupeza imodzi pa ebay pogwiritsa ntchito mawu osakira "Radio Controlled Movement".
Ndipo potsiriza, kuthyolako kwa moyo kwa iwo omwe awerenga mpaka pano. Ngakhale palibe chowulutsa chimodzi chawayilesi pamakilomita masauzande angapo otsatira, sikovuta kupanga siginecha yotere nokha. Pali pulogalamu pa Google Play yotchedwa "DCF77 Emulator" yomwe imatulutsa chizindikiro kumakutu. Malinga ndi wolemba, ngati mukulunga waya wa mahedifoni mozungulira wotchiyo, amatenga chizindikirocho (ndizosangalatsa bwanji, chifukwa mahedifoni wamba sangapange chizindikiro cha 77KHz, koma kulandila mwina chifukwa cha ma harmonics). Pa Android 9, pulogalamuyi sinandigwire ntchito konse - kunalibe phokoso (kapena mwina sindinamve - ndi 77KHz, pambuyo pa zonse :), koma mwina wina angakhale ndi mwayi wabwinoko. Ena, komabe, amadzipangira okha DCF chizindikiro chojambulira, chomwe ndi chosavuta kupanga pa Arduino kapena ESP32 yomweyo:
(gwero
Pomaliza
Dongosolo la DCF lidakhala losavuta komanso losavuta. Mothandizidwa ndi wolandila wosavuta komanso wotsika mtengo, mutha kukhala ndi nthawi yeniyeni nthawi zonse komanso kulikonse, ndithudi kumalo olandirira alendo. Zikuwoneka kuti ngakhale kufalikira kwa digito ndi intaneti ya Zinthu, mayankho osavuta otere adzakhala ofunikira kwa nthawi yayitali.
Source: www.habr.com