DCF77: ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ систСма ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сигналов Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ?

ΠŸΡ€ΠΈΠ²Π΅Ρ‚ Π₯Π°Π±Ρ€.

НавСрноС ΠΌΠ½ΠΎΠ³ΠΈΠ΅, ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π°ΡŽΡ‰ΠΈΠ΅ часы ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚Π΅ΠΎΡΡ‚Π°Π½Ρ†ΠΈΡŽ, Π²ΠΈΠ΄Π΅Π»ΠΈ Π½Π° ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ΅ Π»ΠΎΠ³ΠΎΡ‚ΠΈΠΏ Radio Controlled Clock ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Atomic Clock. Π­Ρ‚ΠΎ вСсьма ΡƒΠ΄ΠΎΠ±Π½ΠΎ, вСдь достаточно ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ часы Π½Π° стол, ΠΈ ΠΎΠ½ΠΈ Ρ‡Π΅Ρ€Π΅Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя автоматичСски настроятся Π½Π° Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ врСмя.
DCF77: ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ систСма ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сигналов Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ?

РазбСрСмся ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ напишСм Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ Π½Π° языкС Python.

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ систСмы синхронизации Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. НаиболСС популярная Π² Π•Π²Ρ€ΠΎΠΏΠ΅ β€” нСмСцкая систСма DCF-77, Π² Π―ΠΏΠΎΠ½ΠΈΠΈ Π΅ΡΡ‚ΡŒ своя систСма JJY, Π² БША Π΅ΡΡ‚ΡŒ систСма WWVB, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Π”Π°Π»Π΅Π΅ рассказ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎ DCF77, ΠΊΠ°ΠΊ ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΈ доступной для ΠΏΡ€ΠΈΠ΅ΠΌΠ° Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… мСстах СвропСйской части России ΠΈ сосСдних странах (Ρƒ ΠΆΠΈΡ‚Π΅Π»Π΅ΠΉ Π”Π°Π»ΡŒΠ½Π΅Π³ΠΎ Востока ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅, Π²ΠΏΡ€ΠΎΡ‡Π΅ΠΌ ΠΎΠ½ΠΈ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ японский сигнал;).

ВсС написанноС Π΄Π°Π»Π΅Π΅, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎ DCF77.

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

DCF77 это длинноволновая станция, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π°Ρ Π½Π° частотС 77.5ΠšΠ“Ρ†, ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰Π°Ρ сигналы Π² Π°ΠΌΠΏΠ»ΠΈΡ‚ΡƒΠ΄Π½ΠΎΠΉ модуляции. Бтанция ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒΡŽ 50ΠšΠ’Ρ‚ располоТСна Π² 25ΠΊΠΌ ΠΎΡ‚ Π€Ρ€Π°Π½ΠΊΡ„ΡƒΡ€Ρ‚Π°, ΠΎΠ½Π° Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ Π΅Ρ‰Π΅ Π² 1959 Π³ΠΎΠ΄Ρƒ, Π² 1973 ΠΊ Ρ‚ΠΎΡ‡Π½ΠΎΠΌΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π±Ρ‹Π»Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° информация ΠΎ Π΄Π°Ρ‚Π΅. Π”Π»ΠΈΠ½Π° Π²ΠΎΠ»Π½Ρ‹ ΠΏΡ€ΠΈ частотС 77ΠšΠ“Ρ† вСсьма большая, поэтому Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Π°Π½Ρ‚Π΅Π½Π½ΠΎΠ³ΠΎ поля Ρ‚ΠΎΠΆΠ΅ вСсьма ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½Ρ‹Π΅ (Ρ„ΠΎΡ‚ΠΎ ΠΈΠ· Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ):
DCF77: ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ систСма ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сигналов Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ?

ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΉ Π°Π½Ρ‚Π΅Π½Π½Π΅ ΠΈ ΠΏΠΎΠ΄Π²ΠΎΠ΄ΠΈΠΌΠΎΠΉ мощности, Π·ΠΎΠ½Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ° ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ практичСски всю Π•Π²Ρ€ΠΎΠΏΡƒ, Π‘Π΅Π»ΠΎΡ€ΡƒΡΡΠΈΡŽ, Π£ΠΊΡ€Π°ΠΈΠ½Ρƒ ΠΈ Ρ‡Π°ΡΡ‚ΡŒ России.

DCF77: ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ систСма ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сигналов Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ?

Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ сигнал ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ. Для этого достаточно Π·Π°ΠΉΡ‚ΠΈ Π½Π° ΠΎΠ½Π»Π°ΠΉΠ½-ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ http://websdr.ewi.utwente.nl:8901/, Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚Π°ΠΌ частоту 76.5ΠšΠ“Ρ† ΠΈ USB-ΠΌΠΎΠ΄ΡƒΠ»ΡΡ†ΠΈΡŽ. Π”ΠΎΠ»ΠΆΠ½Π° ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒΡΡ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚ΠΈΠΏΠ° Ρ‚Π°ΠΊΠΎΠΉ:

DCF77: ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ систСма ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сигналов Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ?

Π’Π°ΠΌ ΠΆΠ΅ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΡƒ download ΠΈ записываСм Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π΄Π»ΠΈΠ½ΠΎΠΉ Π² нСсколько ΠΌΠΈΠ½ΡƒΡ‚. РазумССтся, ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ «настоящСго» ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°, способного Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ частоту 77.5ΠšΠ“Ρ†, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π΅Π³ΠΎ.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, принимая радиосигналы Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‡Π΅Ρ€Π΅Π· Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚, ΠΌΡ‹ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ врСмя β€” сигнал пСрСдаСтся с Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ. Но наша Ρ†Π΅Π»ΡŒ лишь ΠΏΠΎΠ½ΡΡ‚ΡŒ структуру сигнала, для этого ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-записи Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ достаточно. Π’ Ρ€Π΅Π°Π»Π΅ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ спСциализированныС устройства для ΠΏΡ€ΠΈΠ΅ΠΌΠ° ΠΈ дСкодирования, ΠΎ Π½ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ сказано Π½ΠΈΠΆΠ΅.

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ запись, приступим ΠΊ Π΅Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅.

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

Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ Ρ„Π°ΠΉΠ» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ 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: ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ систСма ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сигналов Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ?

Π‘Π³Π»Π°Π΄ΠΈΠΌ выбросы ΠΎΡ‚ ΠΏΠΎΠΌΠ΅Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ low-pass Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°, Π·Π°ΠΎΠ΄Π½ΠΎ вычислим срСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎΠ½ΠΎ пригодится ΠΏΠΎΡ‚ΠΎΠΌ для парсинга.

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.1с (Ρ‚.Π΅. Π΄Π»ΠΈΠ½Π° самого ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠ° 0.9с), ΠΊ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ добавляСм Β«0Β», Ссли расстояниС составляСт 0.2с (Ρ‚.Π΅. Π΄Π»ΠΈΠ½Π° 0.8с), добавляСм Β«1Β». ΠšΠΎΠ½Π΅Ρ† ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΌΠΈΠ½ΡƒΡ‚Ρ‹ обозначаСтся Β«Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌΒ» ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠΎΠΌ, Π΄Π»ΠΈΠ½ΠΎΠΉ 2с, битовая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ этом обнуляСтся, ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ начинаСтся Π·Π°Π½ΠΎΠ²ΠΎ.

Π’Ρ‹ΡˆΠ΅Π½Π°ΠΏΠΈΡΠ°Π½Π½ΠΎΠ΅ нСслоТно Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° языкС 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: ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ систСма ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сигналов Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ?

Π‘ΠΈΡ‚Ρ‹ описаны Π² Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ, ΠΈ ΠΎΠ½ΠΈ довольно Π»ΡŽΠ±ΠΎΠΏΡ‹Ρ‚Π½Ρ‹. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ 15 Π±ΠΈΡ‚ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, хотя Π±Ρ‹Π»ΠΈ ΠΏΠ»Π°Π½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для систСм оповСщСния ΠΈ граТданской ΠΎΠ±ΠΎΡ€ΠΎΠ½Ρ‹. Π‘ΠΈΡ‚ A1 ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ час часы Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Ρ‹ Π½Π° Π»Π΅Ρ‚Π½Π΅Π΅ врСмя. Π‘ΠΈΡ‚ А2 ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ час Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ сСкунда, которая ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ†ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² соотвСтствии с Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ Π—Π΅ΠΌΠ»ΠΈ. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹ ΠΊΠΎΠ΄ΠΈΡ€ΡƒΡŽΡ‚ часы, ΠΌΠΈΠ½ΡƒΡ‚Ρ‹, сСкунды ΠΈ Π΄Π°Ρ‚Ρƒ.

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 ΡƒΠΆΠ΅ написаны ΠΈ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΈ Ρ‚Π°ΠΊ извСстно β€” Ρ‡Ρ‚ΠΎ Π½ΠΈ Π΄Π΅Π»Π°ΠΉ Π½Π° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ΡΡ Π»ΠΈΠ±ΠΎ часы, Π»ΠΈΠ±ΠΎ мСтСостанция. Π‘ Ρ‚Π°ΠΊΠΈΠΌ устройством ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ врСмя Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нСслоТно, Ссли ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Π·ΠΎΠ½Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ°. Ну ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²Π΅ΡΠΈΡ‚ΡŒ Π½Π° часы надпись Β«Atomic ClockΒ», ΠΈ Π·Π°ΠΎΠ΄Π½ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΡ‚ΡŒ всСм ΠΆΠ΅Π»Π°ΡŽΡ‰ΠΈΠΌ, Ρ‡Ρ‚ΠΎ устройство Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ синхронизируСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ‚ΠΎΠΌΠ½Ρ‹Ρ… часов.

Π–Π΅Π»Π°ΡŽΡ‰ΠΈΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΎΠ°ΠΏΠ³Ρ€Π΅ΠΉΠ΄ΠΈΡ‚ΡŒ старыС Π±Π°Π±ΡƒΡˆΠΊΠΈΠ½Ρ‹ часы, установив Π² Π½ΠΈΡ… Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ с радиосинхронизациСй:

DCF77: ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ систСма ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сигналов Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ?

Найти Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π° ebay ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словам Β«Radio Controlled MovementΒ».

И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π»Π°ΠΉΡ„Ρ…Π°ΠΊ для Ρ‚Π΅Ρ… ΠΊΡ‚ΠΎ Π΄ΠΎΡ‡ΠΈΡ‚Π°Π» Π΄ΠΎ сюда. Π”Π°ΠΆΠ΅ Ссли Π² Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΡ… ΠΏΠ°Ρ€Π΅ тысяч ΠΊΠΌ Π½Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ° радиосигнала, Ρ‚Π°ΠΊΠΎΠΉ сигнал нСслоТно ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Π’ Google Play Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Β«DCF77 EmulatorΒ», которая Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ сигнал Π½Π° Π½Π°ΡƒΡˆΠ½ΠΈΠΊΠΈ. По завСрСниям Π°Π²Ρ‚ΠΎΡ€Π°, Ссли ΠΎΠ±ΠΌΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ Π½Π°ΡƒΡˆΠ½ΠΈΠΊΠΎΠ² Π²ΠΎΠΊΡ€ΡƒΠ³ часов, ΠΎΠ½ΠΈ ΠΏΠΎΠΉΠΌΠ°ΡŽΡ‚ сигнал (интСрСсно ΠΊΠ°ΠΊ, вСдь ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Π½Π°ΡƒΡˆΠ½ΠΈΠΊΠΈ Π½Π΅ Π²Ρ‹Π΄Π°Π΄ΡƒΡ‚ сигнал 77ΠšΠ“Ρ†, Π½ΠΎ вСроятно ΠΏΡ€ΠΈΠ΅ΠΌ ΠΈΠ΄Π΅Ρ‚ Π·Π° счСт Π³Π°Ρ€ΠΌΠΎΠ½ΠΈΠΊ). Π£ мСня Π½Π° Android 9 ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° совсСм β€” просто Π½Π΅ Π±Ρ‹Π»ΠΎ Π·Π²ΡƒΠΊΠ° (Π° ΠΌΠΎΠΆΠ΅Ρ‚ я Π΅Π³ΠΎ Π½Π΅ ΡΠ»Ρ‹ΡˆΠ°Π» β€” 77ΠšΠ“Ρ† вСдь:), Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π·Π΅Ρ‚ большС. НСкоторыС Π²ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π΄Π΅Π»Π°ΡŽΡ‚ сСбС ΠΈ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ сигналов DCF, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ нСслоТно ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π° Ρ‚ΠΎΠΉ ΠΆΠ΅ Arduino ΠΈΠ»ΠΈ ESP32:

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

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

БистСма DCF, оказалась Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ простой ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ нСслоТного ΠΈ дСшСвого ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ врСмя всСгда ΠΈ Π²Π΅Π·Π΄Π΅, разумССтся Π² Π·ΠΎΠ½Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ°. ДумаСтся, Π΄Π°ΠΆΠ΅ нСсмотря Π½Π° ΠΏΠΎΠ²ΡΠ΅ΠΌΠ΅ΡΡ‚Π½ΡƒΡŽ Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ Β«ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ Π²Π΅Ρ‰Π΅ΠΉΒ», Ρ‚Π°ΠΊΠΈΠ΅ простыС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π±ΡƒΠ΄ΡƒΡ‚ вострСбованы Π΅Ρ‰Π΅ Π΄ΠΎΠ»Π³ΠΎ.

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