DCF77: Как Ρ€Π°Π±ΠΎΡ‚ΠΈ систСмата Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π²ΠΈ сигнал?

Π—Π΄Ρ€Π°Π²Π΅ΠΉ Π₯Π°Π±Ρ€.

ВСроятно ΠΌΠ½ΠΎΠ·ΠΈΠ½Π°, ΠΊΠΎΠΈΡ‚ΠΎ ΠΊΡƒΠΏΡƒΠ²Π°Ρ‚ часовник ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚Π΅ΠΎΡ€ΠΎΠ»ΠΎΠ³ΠΈΡ‡Π½Π° станция, са Π²ΠΈΠΆΠ΄Π°Π»ΠΈ радиоуправляСмия часовник ΠΈΠ»ΠΈ Π΄ΠΎΡ€ΠΈ Π»ΠΎΠ³ΠΎΡ‚ΠΎ Π½Π° атомния часовник Π½Π° ΠΎΠΏΠ°ΠΊΠΎΠ²ΠΊΠ°Ρ‚Π°. Π’ΠΎΠ²Π° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Π·Π°Ρ‰ΠΎΡ‚ΠΎ просто трябва Π΄Π° поставитС часовника Π½Π° масата ΠΈ слСд извСстно Π²Ρ€Π΅ΠΌΠ΅ Ρ‚ΠΎΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Ρ‰Π΅ сС настрои към Ρ‚ΠΎΡ‡Π½ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅.
DCF77: Как Ρ€Π°Π±ΠΎΡ‚ΠΈ систСмата Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π²ΠΈ сигнал?

НСка Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈ Π΄Π° напишСм Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ Π½Π° Python.

Има Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ систСми Π·Π° синхронизиранС Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ. Най-популярната Π² Π•Π²Ρ€ΠΎΠΏΠ° Π΅ нСмската систСма DCF-77, Япония ΠΈΠΌΠ° своя собствСна систСма JJY, Π² БАЩ ΠΈΠΌΠ° систСма WWVB, ΠΈ Ρ‚Π°ΠΊΠ° Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° историята Ρ‰Π΅ бъдС Π·Π° DCF77, ΠΊΠ°Ρ‚ΠΎ Π½Π°ΠΉ-подходящия ΠΈ Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½ Π·Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ°Π½Π΅ Π½Π° някои мСста Π² СвропСйската част Π½Π° Русия ΠΈ ΡΡŠΡΠ΅Π΄Π½ΠΈΡ‚Π΅ страни (ΠΆΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ Π½Π° ДалСчния ΠΈΠ·Ρ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ°Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΡ‚ΠΎ ΠΌΠ½Π΅Π½ΠΈΠ΅, Π½ΠΎ Ρ‚Π΅ ΠΎΡ‚ своя страна ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΉΡ‚Π΅ японския сигнал;).

Всичко написано ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ Ρ‰Π΅ бъдС Π·Π° DCF77.

ΠŸΡ€ΠΈΠ΅ΠΌΠ°Π½Π΅ Π½Π° сигнал

DCF77 Π΅ дълговълнова станция, Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰Π° Π½Π° чСстота 77.5 kHz ΠΈ ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‰Π° сигнали Π² Π°ΠΌΠΏΠ»ΠΈΡ‚ΡƒΠ΄Π½Π° модулация. Бтанцията 50KW сС Π½Π°ΠΌΠΈΡ€Π° Π½Π° 25 ΠΊΠΌ ΠΎΡ‚ Π€Ρ€Π°Π½ΠΊΡ„ΡƒΡ€Ρ‚, Π·Π°ΠΏΠΎΡ‡Π²Π° Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΡ€Π΅Π· 1959 Π³., Π° ΠΏΡ€Π΅Π· 1973 Π³. към точния час Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° информация Π·Π° Π΄Π°Ρ‚Π°Ρ‚Π°. Π”ΡŠΠ»ΠΆΠΈΠ½Π°Ρ‚Π° Π½Π° Π²ΡŠΠ»Π½Π°Ρ‚Π° ΠΏΡ€ΠΈ чСстота ΠΎΡ‚ 77 KHz Π΅ ΠΌΠ½ΠΎΠ³ΠΎ голяма, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° Π°Π½Ρ‚Π΅Π½Π½ΠΎΡ‚ΠΎ ΠΏΠΎΠ»Π΅ ΡΡŠΡ‰ΠΎ са доста ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΈ (снимка ΠΎΡ‚ Wikipedia):
DCF77: Как Ρ€Π°Π±ΠΎΡ‚ΠΈ систСмата Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π²ΠΈ сигнал?

Π‘ Ρ‚Π°ΠΊΠ°Π²Π° Π°Π½Ρ‚Π΅Π½Π° ΠΈ Π²Ρ…ΠΎΠ΄Π½Π° мощност Π·ΠΎΠ½Π°Ρ‚Π° Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ°Π½Π΅ ΠΏΠΎΠΊΡ€ΠΈΠ²Π° ΠΏΠΎΡ‡Ρ‚ΠΈ цяла Π•Π²Ρ€ΠΎΠΏΠ°, БСларус, Π£ΠΊΡ€Π°ΠΉΠ½Π° ΠΈ част ΠΎΡ‚ Русия.

DCF77: Как Ρ€Π°Π±ΠΎΡ‚ΠΈ систСмата Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π²ΠΈ сигнал?

ВсСки ΠΌΠΎΠΆΠ΅ Π΄Π° запишС сигнал. Π—Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π°, просто ΠΎΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ Π½Π° ΠΎΠ½Π»Π°ΠΉΠ½ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ° http://websdr.ewi.utwente.nl:8901/, ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅ Ρ‚Π°ΠΌ чСстота 76.5KHz ΠΈ USB модулация. Врябва Π΄Π° сС ΠΎΡ‚Π²ΠΎΡ€ΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ слСдния Π½Π°Ρ‡ΠΈΠ½:

DCF77: Как Ρ€Π°Π±ΠΎΡ‚ΠΈ систСмата Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π²ΠΈ сигнал?

Π’Π°ΠΌ натискамС Π±ΡƒΡ‚ΠΎΠ½Π° Π·Π° изтСглянС ΠΈ записвамС Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ с дълТина няколко ΠΌΠΈΠ½ΡƒΡ‚ΠΈ. Π Π°Π·Π±ΠΈΡ€Π° сС, Π°ΠΊΠΎ ΠΈΠΌΠ°Ρ‚Π΅ β€žΠΈΡΡ‚ΠΈΠ½ΡΠΊΠΈβ€œ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ, способСн Π΄Π° записва чСстота ΠΎΡ‚ 77.5 KHz, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅.

Π Π°Π·Π±ΠΈΡ€Π° сС, ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΉΠΊΠΈ радиосигнали Π·Π° Π²Ρ€Π΅ΠΌΠ΅ ΠΏΡ€Π΅Π· ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚, няма Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ наистина Ρ‚ΠΎΡ‡Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅ - ΡΠΈΠ³Π½Π°Π»ΡŠΡ‚ сС ΠΏΡ€Π΅Π΄Π°Π²Π° със закъснСниС. Но Π½Π°ΡˆΠ°Ρ‚Π° Ρ†Π΅Π» Π΅ само Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ структурата Π½Π° сигнала, Π·Π° Ρ‚ΠΎΠ²Π° Π·Π°ΠΏΠΈΡΡŠΡ‚ Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π΅Π½. Π’ рСалния ΠΆΠΈΠ²ΠΎΡ‚, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ спСциализирани устройства Π·Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ°Π½Π΅ ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅, Ρ‚Π΅ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ Ρ€Π°Π·Π³Π»Π΅Π΄Π°Π½ΠΈ ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ.

И Ρ‚Π°ΠΊΠ°, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ записа, Π½Π΅ΠΊΠ° Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌ Π΄Π° Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°ΠΌΠ΅.

Π”Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ Π½Π° сигнала

НСка Π·Π°Ρ€Π΅Π΄ΠΈΠΌ Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Python ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° структура:

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()

Π’ΠΈΠΆΠ΄Π°ΠΌΠ΅ Ρ‚ΠΈΠΏΠΈΡ‡Π½Π° Π°ΠΌΠΏΠ»ΠΈΡ‚ΡƒΠ΄Π½Π° модулация:
DCF77: Как Ρ€Π°Π±ΠΎΡ‚ΠΈ систСмата Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π²ΠΈ сигнал?

Π—Π° Π΄Π° опростим Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ, Π½Π΅ΠΊΠ° Π²Π·Π΅ΠΌΠ΅ΠΌ ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°Ρ‚Π° Π½Π° сигнала, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ трансформацията Π½Π° Π₯ΠΈΠ»Π±Π΅Ρ€Ρ‚:

analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])

Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚:
DCF77: Как Ρ€Π°Π±ΠΎΡ‚ΠΈ систСмата Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π²ΠΈ сигнал?

НСка Π΄Π° ΠΈΠ·Π³Π»Π°Π΄ΠΈΠΌ ΡˆΡƒΠΌΠΎΠ²ΠΈΡ‚Π΅ Смисии с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° нискочСстотСн Ρ„ΠΈΠ»Ρ‚ΡŠΡ€ ΠΈ Π² ΡΡŠΡ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π΄Π° изчислим срСдната стойност, която Ρ‰Π΅ бъдС ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΏΠΎ-късно Π·Π° Π°Π½Π°Π»ΠΈΠ·.

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

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ (ΠΆΡŠΠ»Ρ‚Π° линия): ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΏΡ€Π°Π²ΠΎΡŠΠ³ΡŠΠ»Π΅Π½ сигнал, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ доста лСсСн Π·Π° Π°Π½Π°Π»ΠΈΠ·.
DCF77: Как Ρ€Π°Π±ΠΎΡ‚ΠΈ систСмата Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π²ΠΈ сигнал?

Π Π°Π·Π±ΠΎΡ€

ΠŸΡŠΡ€Π²ΠΎ трябва Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π±ΠΈΡ‚ΠΎΠ²Π°Ρ‚Π° послСдоватСлност. Π‘Π°ΠΌΠ°Ρ‚Π° структура Π½Π° сигнала Π΅ ΠΌΠ½ΠΎΠ³ΠΎ проста.
DCF77: Как Ρ€Π°Π±ΠΎΡ‚ΠΈ систСмата Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π²ΠΈ сигнал?

Π˜ΠΌΠΏΡƒΠ»ΡΠΈΡ‚Π΅ са Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈ Π½Π° сСкундни ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΈ. Ако разстояниСто ΠΌΠ΅ΠΆΠ΄Ρƒ импулситС Π΅ 0.1s (Ρ‚.Π΅. Π΄ΡŠΠ»ΠΆΠΈΠ½Π°Ρ‚Π° Π½Π° самия импулс Π΅ 0.9s), Π΄ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ β€ž0β€œ към послСдоватСлността ΠΎΡ‚ Π±ΠΈΡ‚ΠΎΠ²Π΅; Π°ΠΊΠΎ разстояниСто Π΅ 0.2s (Ρ‚.Π΅. Π΄ΡŠΠ»ΠΆΠΈΠ½Π°Ρ‚Π° Π΅ 0.8s), Π΄ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ β€ž1β€œ. ΠšΡ€Π°ΡΡ‚ Π½Π° всяка ΠΌΠΈΠ½ΡƒΡ‚Π° сС ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π²Π° с β€žΠ΄ΡŠΠ»ΡŠΠ³β€œ импулс, дълъг 2 s, Π±ΠΈΡ‚ΠΎΠ²Π°Ρ‚Π° послСдоватСлност сС Π½ΡƒΠ»ΠΈΡ€Π° ΠΈ ΠΏΡŠΠ»Π½Π΅Π½Π΅Ρ‚ΠΎ Π·Π°ΠΏΠΎΡ‡Π²Π° ΠΎΡ‚Π½ΠΎΠ²ΠΎ.

Π“ΠΎΡ€Π½ΠΎΡ‚ΠΎ Π΅ лСсно Π·Π° писанС Π½Π° 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

Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ послСдоватСлност ΠΎΡ‚ Π±ΠΈΡ‚ΠΎΠ²Π΅, Π² нашия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Π΄Π²Π΅ сСкунди ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Ρ‚Π°ΠΊΠ°:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

ΠœΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΡ‚ΠΎ, интСрСсно Π΅, Ρ‡Π΅ ΡΠΈΠ³Π½Π°Π»ΡŠΡ‚ ΠΈΠΌΠ° ΠΈ β€žΠ²Ρ‚ΠΎΡ€ΠΈ ΡΠ»ΠΎΠΉβ€œ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎΡΡ‚Ρ‚Π° ΠΎΡ‚ Π±ΠΈΡ‚ΠΎΠ²Π΅ ΡΡŠΡ‰ΠΎ сС ΠΊΠΎΠ΄ΠΈΡ€Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Ρ„Π°Π·ΠΎΠ²Π° модулация. На тСория Ρ‚ΠΎΠ²Π° трябва Π΄Π° осигури ΠΏΠΎ-стабилно Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ Π΄ΠΎΡ€ΠΈ Π² случай Π½Π° отслабСн сигнал.

ΠΠ°ΡˆΠ°Ρ‚Π° послСдна ΡΡ‚ΡŠΠΏΠΊΠ°: ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° дСйствитСлнитС Π΄Π°Π½Π½ΠΈ. Π‘ΠΈΡ‚ΠΎΠ²Π΅Ρ‚Π΅ сС ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚ вСднъТ Π² сСкунда, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΈΠΌΠ°ΠΌΠ΅ ΠΎΠ±Ρ‰ΠΎ 59 Π±ΠΈΡ‚Π°, Π² ΠΊΠΎΠΈΡ‚ΠΎ Π΅ ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π° доста информация:
DCF77: Как Ρ€Π°Π±ΠΎΡ‚ΠΈ систСмата Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π²ΠΈ сигнал?

Π‘ΠΈΡ‚ΠΎΠ²Π΅Ρ‚Π΅ са описани Π² Wikipedia, ΠΈ са доста Π»ΡŽΠ±ΠΎΠΏΠΈΡ‚Π½ΠΈ. ΠŸΡŠΡ€Π²ΠΈΡ‚Π΅ 15 Π±ΠΈΡ‚Π° Π½Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚, Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ имашС ΠΏΠ»Π°Π½ΠΎΠ²Π΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π° систСми Π·Π° ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΈ граТданска Π·Π°Ρ‰ΠΈΡ‚Π°. Π‘ΠΈΡ‚ A1 ΠΏΠΎΠΊΠ°Π·Π²Π°, Ρ‡Π΅ Ρ‡Π°ΡΠΎΠ²Π½ΠΈΠΊΡŠΡ‚ Ρ‰Π΅ ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ към лятно часово Π²Ρ€Π΅ΠΌΠ΅ ΠΏΡ€Π΅Π· слСдващия час. Π‘ΠΈΡ‚ A2 ΠΏΠΎΠΊΠ°Π·Π²Π°, Ρ‡Π΅ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π΅Π½ скок сСкунда, ΠΊΠΎΠΉΡ‚ΠΎ понякога сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°Π½Π΅ Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ спорСд Π²ΡŠΡ€Ρ‚Π΅Π½Π΅Ρ‚ΠΎ Π½Π° ЗСмята. ΠžΡΡ‚Π°Π½Π°Π»ΠΈΡ‚Π΅ Π±ΠΈΡ‚ΠΎΠ²Π΅ ΠΊΠΎΠ΄ΠΈΡ€Π°Ρ‚ часовС, ΠΌΠΈΠ½ΡƒΡ‚ΠΈ, сСкунди ΠΈ Π΄Π°Ρ‚Π°.

DCF77: Как Ρ€Π°Π±ΠΎΡ‚ΠΈ систСмата Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π²ΠΈ сигнал?

Π—Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ искат Π΄Π° СкспСримСнтират сами, ΠΊΠΎΠ΄ΡŠΡ‚ Π·Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ Π΅ Π΄Π°Π΄Π΅Π½ ΠΏΠΎΠ΄ спойлСра.
Π˜Π·Ρ…ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄

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)

ΠšΠΎΠ³Π°Ρ‚ΠΎ стартирамС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, Ρ‰Π΅ Π²ΠΈΠ΄ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚, ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° Ρ‚ΠΎΠ·ΠΈ:

0011110110111000001011000001010000100110010101100010011000
Tuesday, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Tuesday, 26.03.19, 21:42

Π’ΡΡŠΡ‰Π½ΠΎΡΡ‚ Ρ‚ΠΎΠ²Π° Π΅ цялата магия. ΠŸΡ€Π΅Π΄ΠΈΠΌΡΡ‚Π²ΠΎΡ‚ΠΎ Π½Π° Ρ‚Π°ΠΊΠ°Π²Π° систСма Π΅, Ρ‡Π΅ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π΅ ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ просто ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ Π½Π° всСки, Π΄ΠΎΡ€ΠΈ ΠΈ Π½Π°ΠΉ-простият ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€. ΠŸΡ€ΠΎΡΡ‚ΠΎ Π±Ρ€ΠΎΠΈΠΌ Π΄ΡŠΠ»ΠΆΠΈΠ½Π°Ρ‚Π° Π½Π° импулситС, Π½Π°Ρ‚Ρ€ΡƒΠΏΠ²Π°ΠΌΠ΅ 60 Π±ΠΈΡ‚Π° ΠΈ Π² края Π½Π° всяка ΠΌΠΈΠ½ΡƒΡ‚Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ Ρ‚ΠΎΡ‡Π½ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅. Π’ сравнСниС с Π΄Ρ€ΡƒΠ³ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° синхронизация Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ (GPS, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ»ΠΈ Π½Π΅ Π΄Π°ΠΉ си Π‘ΠΎΠΆΠ΅, Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ :), Ρ‚Π°ΠΊΠ°Π²Π° Ρ€Π°Π΄ΠΈΠΎ синхронизация Π½Π΅ изисква ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΎ СлСктричСство - Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½Π° домашна ΠΌΠ΅Ρ‚Π΅ΠΎΡ€ΠΎΠ»ΠΎΠ³ΠΈΡ‡Π½Π° станция Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΎΠΊΠΎΠ»ΠΎ Π³ΠΎΠ΄ΠΈΠ½Π° с 2 Π±Π°Ρ‚Π΅Ρ€ΠΈΠΈ АА. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ Π΄ΠΎΡ€ΠΈ Ρ€ΡŠΡ‡Π½ΠΈΡ‚Π΅ часовници сС правят с радиосинхронизация, Π΄Π° Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, Π·Π° стСннитС часовници ΠΈΠ»ΠΈ часовницитС Π½Π° ΡƒΠ»ΠΈΡ‡Π½ΠΈΡ‚Π΅ станции.

Удобството ΠΈ простотата Π½Π° DCF ΡΡŠΡ‰ΠΎ ΠΏΡ€ΠΈΠ²Π»ΠΈΡ‡Π°Ρ‚ СнтусиаститС β€žΠ½Π°ΠΏΡ€Π°Π²ΠΈ си ΡΠ°ΠΌβ€œ. Π‘Π°ΠΌΠΎ Π·Π° $10-20 ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°ΠΊΡƒΠΏΠΈΡ‚Π΅ Π³ΠΎΡ‚ΠΎΠ² Π°Π½Ρ‚Π΅Π½Π΅Π½ ΠΌΠΎΠ΄ΡƒΠ» с Π³ΠΎΡ‚ΠΎΠ² ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ ΠΈ TTL ΠΈΠ·Ρ…ΠΎΠ΄, ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΡΠ²ΡŠΡ€Π·Π°Π½ към Arduino ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€.
DCF77: Как Ρ€Π°Π±ΠΎΡ‚ΠΈ систСмата Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π²ΠΈ сигнал?

Π’Π΅Ρ‡Π΅ Π΅ написано Π·Π° Arduino Π³ΠΎΡ‚ΠΎΠ²ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Но Π²Π΅Ρ‡Π΅ Π΅ извСстно, Ρ‡Π΅ ΠΊΠ°ΠΊΠ²ΠΎΡ‚ΠΎ ΠΈ Π΄Π° ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ с ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€Π°, Π² ΠΊΡ€Π°ΠΉΠ½Π° смСтка ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Ρ‚Π΅ ΠΈΠ»ΠΈ часовник, ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚Π΅ΠΎΡ€ΠΎΠ»ΠΎΠ³ΠΈΡ‡Π½Π° станция. Π‘ Ρ‚Π°ΠΊΡŠΠ² ΡƒΡ€Π΅Π΄ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° точния час Π΅ наистина лСсно, ΠΏΡ€ΠΈ условиС, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, Ρ‡Π΅ стС Π½Π° рСцСпцията. Π•, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΎΠΊΠ°Ρ‡ΠΈΡ‚Π΅ надписа β€žΠΡ‚ΠΎΠΌΠ΅Π½ Ρ‡Π°ΡΠΎΠ²Π½ΠΈΠΊβ€œ Π½Π° часовника си ΠΈ Π² ΡΡŠΡ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π΄Π° обяснитС Π½Π° всички, Ρ‡Π΅ устройството наистина сС синхронизира с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Π°Ρ‚ΠΎΠΌΠ΅Π½ часовник.

Π–Π΅Π»Π°Π΅Ρ‰ΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄ΠΎΡ€ΠΈ Π΄Π° надстроят стария си часовник Π½Π° Π±Π°Π±Π°, ΠΊΠ°Ρ‚ΠΎ инсталират Π½ΠΎΠ² ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ с радиосинхронизация:

DCF77: Как Ρ€Π°Π±ΠΎΡ‚ΠΈ систСмата Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π²ΠΈ сигнал?

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΡŠΠ² Π² ebay, ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΊΠ»ΡŽΡ‡ΠΎΠ²ΠΈΡ‚Π΅ Π΄ΡƒΠΌΠΈ β€žΠ Π°Π΄ΠΈΠΎΡƒΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌΠΎ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅β€œ.

И накрая, Π΅Π΄ΠΈΠ½ Π»Π°ΠΉΡ„Ρ…Π°ΠΊ Π·Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ са ΠΏΡ€ΠΎΡ‡Π΅Π»ΠΈ Π΄ΠΎ Ρ‚ΡƒΠΊ. Π”ΠΎΡ€ΠΈ ΠΈ Π΄Π° няма Π½ΠΈΡ‚ΠΎ Π΅Π΄ΠΈΠ½ ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚Π΅Π» Π½Π° радиосигнал Π² слСдващитС няколко хиляди ΠΊΠΈΠ»ΠΎΠΌΠ΅Ρ‚Ρ€Π°, Π½Π΅ Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Ρ‚Π΅ Ρ‚Π°ΠΊΡŠΠ² сигнал сами. Π’ Google Play ΠΈΠΌΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°, Π½Π°Ρ€Π΅Ρ‡Π΅Π½Π° β€žDCF77 Emulatorβ€œ, която ΠΈΠ·Π²Π΅ΠΆΠ΄Π° сигнала към ΡΠ»ΡƒΡˆΠ°Π»ΠΊΠΈΡ‚Π΅. Π‘ΠΏΠΎΡ€Π΅Π΄ Π°Π²Ρ‚ΠΎΡ€Π°, Π°ΠΊΠΎ ΡƒΠ²ΠΈΠ΅Ρ‚Π΅ ΠΊΠ°Π±Π΅Π»Π° Π½Π° ΡΠ»ΡƒΡˆΠ°Π»ΠΊΠΈΡ‚Π΅ ΠΎΠΊΠΎΠ»ΠΎ часовника, Ρ‚Π΅ Ρ‰Π΅ уловят сигнала (интСрСсно Π΅ ΠΊΠ°ΠΊ, Π·Π°Ρ‰ΠΎΡ‚ΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ‚Π΅ ΡΠ»ΡƒΡˆΠ°Π»ΠΊΠΈ няма Π΄Π° ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π°Ρ‚ 77KHz сигнал, Π½ΠΎ ΠΏΡ€ΠΈΠ΅ΠΌΠ°Π½Π΅Ρ‚ΠΎ вСроятно сС дълТи Π½Π° Ρ…Π°Ρ€ΠΌΠΎΠ½ΠΈΡ†ΠΈ). На Android 9 ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ Π·Π° ΠΌΠ΅Π½ - просто нямашС Π·Π²ΡƒΠΊ (ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π½Π΅ Π³ΠΎ Ρ‡ΡƒΡ… - всС ΠΏΠ°ΠΊ Π΅ 77KHz :), Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π±ΠΈ някой Ρ‰Π΅ ΠΈΠΌΠ° ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΊΡŠΡΠΌΠ΅Ρ‚. Някои ΠΎΠ±Π°Ρ‡Π΅ си правят ΠΏΡŠΠ»Π½ΠΎΡ†Π΅Π½Π΅Π½ DCF Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° сигнали, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ лСсСн Π·Π° създаванС Π½Π° ΡΡŠΡ‰ΠΈΡ Arduino ΠΈΠ»ΠΈ ESP32:

DCF77: Как Ρ€Π°Π±ΠΎΡ‚ΠΈ систСмата Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π²ΠΈ сигнал?
(ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

БистСмата DCF сС ΠΎΠΊΠ°Π·Π° наистина доста проста ΠΈ ΡƒΠ΄ΠΎΠ±Π½Π°. Π‘ ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° прост ΠΈ Π΅Π²Ρ‚ΠΈΠ½ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠΌΠ°Ρ‚Π΅ точния час Π²ΠΈΠ½Π°Π³ΠΈ ΠΈ навсякъдС, Ρ€Π°Π·Π±ΠΈΡ€Π° сС Π² рСцСпцията. ИзглСТда, Ρ‡Π΅ Π΄ΠΎΡ€ΠΈ Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ ΡˆΠΈΡ€ΠΎΠΊΠΎ разпространСната дигитализация ΠΈ Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ Π½Π° Π½Π΅Ρ‰Π°Ρ‚Π°, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ прости Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ Ρ‚ΡŠΡ€ΡΠ΅Π½ΠΈ дълго Π²Ρ€Π΅ΠΌΠ΅.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€