DCF77: рд╕рдордп рд╕рдВрдХреЗрдд рдкреНрд░рдгрд╛рд▓реАрд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ?

рдирдорд╕реНрддреЗ Habrред

рдШрдбреА рд╡рд╛ рдореМрд╕рдо рд╕реНрдЯреЗрд╢рди рдЦрд░рд┐рдж рдЧрд░реНрдиреЗ рдзреЗрд░реИрд▓реЗ рдкреНрдпрд╛рдХреЗрдЬрд┐рдЩреНрдЧрдорд╛ рд░реЗрдбрд┐рдпреЛ рдирд┐рдпрдиреНрддреНрд░рд┐рдд рдШрдбреА рд╡рд╛ рдкрд░рдорд╛рдгреБ рдШрдбреАрдХреЛ рд▓реЛрдЧреЛ рдкрдирд┐ рджреЗрдЦреЗрдХрд╛ рдЫрдиреНред рдпреЛ рдзреЗрд░реИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЫ, рдХрд┐рдирдХрд┐ рддрдкрд╛рдИрд▓реЗ рдХреЗрд╡рд▓ рдЯреЗрдмрд▓рдорд╛ рдШрдбреА рд░рд╛рдЦреНрдиреБ рдкрд░реНрдЫ, рд░ рдХреЗрд╣рд┐ рд╕рдордп рдкрдЫрд┐ рдпреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рд╕рд╣реА рд╕рдордп рд╕рдорд╛рдпреЛрдЬрди рд╣реБрдиреЗрдЫред
DCF77: рд╕рдордп рд╕рдВрдХреЗрдд рдкреНрд░рдгрд╛рд▓реАрд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ?

рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ рднрдиреЗрд░ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдиреБрд╣реЛрд╕реН рд░ рдкрд╛рдЗрдердирдорд╛ рдбрд┐рдХреЛрдбрд░ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реНред

рддреНрдпрд╣рд╛рдБ рд╡рд┐рднрд┐рдиреНрди рд╕рдордп рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬреЗрд╕рди рдкреНрд░рдгрд╛рд▓реАрд╣рд░реВ рдЫрдиреНред рдпреБрд░реЛрдкрдорд╛ рд╕рдмреИрднрдиреНрджрд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рдЬрд░реНрдорди рдкреНрд░рдгрд╛рд▓реА рд╣реЛ DCF-77, рдЬрд╛рдкрд╛рдирдХреЛ рдЖрдлреНрдиреИ рдкреНрд░рдгрд╛рд▓реА рдЫ JJY, рд╕рдВрдпреБрдХреНрдд рд░рд╛рдЬреНрдп рдЕрдореЗрд░рд┐рдХрд╛ рдорд╛ рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдЫ WWVB, рд░ рдпрд╕реНрддреИред рдЕрд░реНрдХреЛ, рдХрдерд╛ DCF77 рдХреЛ рдмрд╛рд░реЗ рдорд╛ рд╣реБрдиреЗрдЫ, рд░реВрд╕ рдХреЛ рдпреБрд░реЛрдкреЗрд▓реА рднрд╛рдЧ рд░ рдЫрд┐рдореЗрдХреА рджреЗрд╢рд╣рд░реБ рдХреЛ рдХреЗрд╣рд┐ рд╕реНрдерд╛рдирд╣рд░реБрдорд╛ рд╕реНрд╡рд╛рдЧрдд рдХреЛ рд▓рд╛рдЧреА рд╕рдмреИ рднрдиреНрджрд╛ рд╕рд╛рдиреНрджрд░реНрднрд┐рдХ рд░ рдкрд╣реБрдБрдЪрдпреЛрдЧреНрдп рдХреЛ рд░реВрдк рдорд╛ (рд╕реБрджреВрд░ рдкреВрд░реНрд╡ рдХреЛ рдмрд╛рд╕рд┐рдиреНрджрд╛рд╣рд░реБ рдХреЛ рд╡рд┐рдкрд░реАрдд рд░рд╛рдп рд╣реБрди рд╕рдХреНрдЫ, рддрдерд╛рдкрд┐, рдЙрдиреАрд╣рд░реБ, рдмрд╛рд░реАрдорд╛, рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдЫрдиреНред рд░ рдЬрд╛рдкрд╛рдиреА рд╕рдВрдХреЗрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг;)ред

рддрд▓ рд▓реЗрдЦрд┐рдПрдХрд╛ рд╕рдмреИ рдХреБрд░рд╛ DCF77 рдХреЛ рдмрд╛рд░реЗрдорд╛ рд╣реБрдиреЗрдЫред

priem signaala

DCF77 рдПрдХ рд▓рд╛рдореЛ рддрд░рдВрдЧ рд╕реНрдЯреЗрд╢рди рд╣реЛ рдЬреБрди 77.5 kHz рдХреЛ рдлреНрд░рд┐рдХреНрд╡реЗрдиреНрд╕реАрдорд╛ рд╕рдЮреНрдЪрд╛рд▓рди рд╣реБрдиреНрдЫ рд░ рдПрдореНрдкреНрд▓рд┐рдЯреНрдпреВрдб рдореЛрдбреНрдпреБрд▓реЗрд╕рдирдорд╛ рд╕рд┐рдЧреНрдирд▓рд╣рд░реВ рдкреНрд░рд╕рд╛рд░рдг рдЧрд░реНрджрдЫред 50KW рд╕реНрдЯреЗрд╢рди рдлреНрд░реИрдВрдХрдлрд░реНрдЯ рджреЗрдЦрд┐ 25 рдХрд┐рдореА рд╕реНрдерд┐рдд рдЫ, рдпреЛ 1959 рдорд╛ рд╕рдЮреНрдЪрд╛рд▓рди рд╕реБрд░реБ рднрдпреЛ, рд░ 1973 рдорд╛ рдорд┐рддрд┐ рдЬрд╛рдирдХрд╛рд░реА рд╕рд╣реА рд╕рдордпрдорд╛ рдердкрд┐рдпреЛред 77 KHz рдХреЛ рдлреНрд░рд┐рдХреНрд╡реЗрдиреНрд╕реАрдорд╛ рддрд░рдВрдЧрджреИрд░реНрдзреНрдп рдзреЗрд░реИ рд▓рд╛рдореЛ рдЫ, рддреНрдпрд╕реИрд▓реЗ рдПрдиреНрдЯреЗрдирд╛ рдХреНрд╖реЗрддреНрд░рдХреЛ рдЖрдпрд╛рдорд╣рд░реВ рдкрдирд┐ рдзреЗрд░реИ рд╕рднреНрдп рдЫрдиреН (рд╡рд┐рдХрд┐рдкрд┐рдбрд┐рдпрд╛рдмрд╛рдЯ рдлреЛрдЯреЛ):
DCF77: рд╕рдордп рд╕рдВрдХреЗрдд рдкреНрд░рдгрд╛рд▓реАрд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ?

рдпрд╕реНрддреЛ рдПрдиреНрдЯреЗрдирд╛ рд░ рдкрд╛рд╡рд░ рдЗрдирдкреБрдЯрдХреЛ рд╕рд╛рде, рд░рд┐рд╕реЗрдкреНрд╢рди рдХреНрд╖реЗрддреНрд░рд▓реЗ рд▓рдЧрднрдЧ рд╕рдмреИ рдпреБрд░реЛрдк, рдмреЗрд▓рд╛рд░реБрд╕, рдпреБрдХреНрд░реЗрди рд░ рд░реВрд╕рдХреЛ рднрд╛рдЧ рд╕рдореЗрдЯреНрдЫред

DCF77: рд╕рдордп рд╕рдВрдХреЗрдд рдкреНрд░рдгрд╛рд▓реАрд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ?

рдЬреЛ рдХреЛрд╣реАрд▓реЗ рд╕рдВрдХреЗрдд рд░реЗрдХрд░реНрдб рдЧрд░реНрди рд╕рдХреНрдЫред рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рдХреЗрд╡рд▓ рдЕрдирд▓рд╛рдЗрди рд░рд┐рд╕реАрднрд░рдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН http://websdr.ewi.utwente.nl:8901/, рддреНрдпрд╣рд╛рдБ рдлреНрд░рд┐рдХреНрд╡реЗрдиреНрд╕реА 76.5KHz рд░ USB рдореЛрдбреБрд▓реЗрд╢рди рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдПрдЙрдЯрд╛ рдЫрд╡рд┐ рдЦреБрд▓реНрдиреБ рдкрд░реНрдЫ рдЬреБрди рдпреЛ рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:

DCF77: рд╕рдордп рд╕рдВрдХреЗрдд рдкреНрд░рдгрд╛рд▓реАрд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ?

рддреНрдпрд╣рд╛рдБ рд╣рд╛рдореА рдбрд╛рдЙрдирд▓реЛрдб рдмрдЯрди рдерд┐рдЪреНрдЫреМрдВ рд░ рдзреЗрд░реИ рдорд┐рдиреЗрдЯ рд▓рд╛рдореЛ рдЯреБрдХреНрд░рд╛ рд░реЗрдХрд░реНрдб рдЧрд░реНрдЫреМрдВред рдЕрд╡рд╢реНрдп рдкрдирд┐, рдпрджрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ 77.5KHz рдлреНрд░рд┐рдХреНрд╡реЗрдиреНрд╕реА рд░реЗрдХрд░реНрдб рдЧрд░реНрди рд╕рдХреНрд╖рдо "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рд░рд┐рд╕реАрднрд░ рдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рдпрд╕рд▓рд╛рдИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рдЗрдиреНрдЯрд░рдиреЗрдЯ рдорд╛рд░реНрдлрдд рд░реЗрдбрд┐рдпреЛ рд╕рдордп рд╕рдВрдХреЗрддрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реЗрд░, рд╣рд╛рдореА рд╕рд╛рдБрдЪреНрдЪреИ рд╕рд╣реА рд╕рдордп рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджреИрдиреМрдВ - рд╕рдВрдХреЗрдд рдврд┐рд▓рд╛рдЗ рд╕рдВрдЧ рдкреНрд░рд╕рд╛рд░рд┐рдд рдЫред рддрд░ рд╣рд╛рдореНрд░реЛ рд▓рдХреНрд╖реНрдп рдХреЗрд╡рд▓ рд╕рдВрдХреЗрдд рдХреЛ рд╕рдВрд░рдЪрдирд╛ рдмреБрдЭреНрди рдХреЛ рд▓рд╛рдЧреА рдЫ; рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐, рдЗрдиреНрдЯрд░рдиреЗрдЯ рд░реЗрдХрд░реНрдбрд┐рдЩ рдкрд░реНрдпрд╛рдкреНрдд рднрдиреНрджрд╛ рдмрдвреА рдЫред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рдирдорд╛, рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рд╡рд┐рд╢реЗрд╖ рдЙрдкрдХрд░рдгрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рд░ рдбрд┐рдХреЛрдбрд┐рдЩрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ; рддрд┐рдиреАрд╣рд░реВ рддрд▓ рдЫрд▓рдлрд▓ рдЧрд░рд┐рдиреЗрдЫред

рддреНрдпрд╕реЛрднрдП, рд╣рд╛рдореАрд▓реЗ рд░реЗрдХрд░реНрдбрд┐рдЩ рдкреНрд░рд╛рдкреНрдд рдЧрд░реЗрдХрд╛ рдЫреМрдВ, рдпрд╕рд▓рд╛рдИ рдкреНрд░рд╢реЛрдзрди рд╕реБрд░реБ рдЧрд░реМрдВред

рд╕рд┐рдЧреНрдирд▓ рдбрд┐рдХреЛрдбрд┐рдЩ

рдкрд╛рдЗрдерди рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдлрд╛рдЗрд▓ рд▓реЛрдб рдЧрд░реМрдВ рд░ рдпрд╕рдХреЛ рд╕рдВрд░рдЪрдирд╛ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН:

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 рд▓рд╛рдореЛ, рдмрд┐рдЯ рдЕрдиреБрдХреНрд░рдо рд╢реВрдиреНрдпрдорд╛ рд░рд┐рд╕реЗрдЯ рд╣реБрдиреНрдЫ, рд░ рднрд░реНрди рдлреЗрд░рд┐ рд╕реБрд░реБ рд╣реБрдиреНрдЫред

рдорд╛рдерд┐рдХреЛ рдкрд╛рдЗрдердирдорд╛ рд▓реЗрдЦреНрди рд╕рдЬрд┐рд▓реЛ рдЫред

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 рдмрд┐рдЯрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХреЛ рдЫреИрди, рдпрджреНрдпрдкрд┐ рддреНрдпрд╣рд╛рдБ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдЪреЗрддрд╛рд╡рдиреА рдкреНрд░рдгрд╛рд▓реА рд░ рдирд╛рдЧрд░рд┐рдХ рд░рдХреНрд╖рд╛рдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдпреЛрдЬрдирд╛рд╣рд░реВ рдерд┐рдПред Bit 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, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд╡рд╛ God forbid, Internet:), рдпрд╕реНрддреЛ рд░реЗрдбрд┐рдпреЛ рд╕рд┐рдЩреНрдХреНрд░реЛрдирд╛рдЗрдЬреЗрд╕рдирд▓рд╛рдИ рд▓рдЧрднрдЧ рдХреБрдиреИ рдмрд┐рдЬреБрд▓реАрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░реНрджреИрди - рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, 2 AA рдмреНрдпрд╛рдЯреНрд░реАрд╣рд░реВрдорд╛ рдирд┐рдпрдорд┐рдд рдЧреГрд╣ рдореМрд╕рдо рд╕реНрдЯреЗрд╢рди рд▓рдЧрднрдЧ рдПрдХ рд╡рд░реНрд╖ рдЪрд▓реНрдЫред рддреНрдпрд╕рдХрд╛рд░рдг, рдирд╛рдбреА рдШрдбреАрд╣рд░реВ рдкрдирд┐ рд░реЗрдбрд┐рдпреЛ рд╕рд┐рдЩреНрдХреНрд░реЛрдирд╛рдЗрдЬреЗрд╕рдирд╕рдБрдЧ рдмрдирд╛рдЗрдиреНрдЫ, рдЙрд▓реНрд▓реЗрдЦ рдирдЧрд░реНрдиреЗ, рдЕрд╡рд╢реНрдп рдкрдирд┐, рднрд┐рддреНрддрд╛ рдШрдбреАрд╣рд░реВ рд╡рд╛ рд╕рдбрдХ рд╕реНрдЯреЗрд╢рди рдШрдбреАрд╣рд░реВред

DCF рдХреЛ рд╕реБрд╡рд┐рдзрд╛ рд░ рд╕рд░рд▓рддрд╛рд▓реЗ рдкрдирд┐ DIY рдЙрддреНрд╕рд╛рд╣реАрд╣рд░реВрд▓рд╛рдИ рдЖрдХрд░реНрд╖рд┐рдд рдЧрд░реНрдЫред рдХреЗрд╡рд▓ $ 10-20 рдХреЛ рд▓рд╛рдЧреА рддрдкрд╛рдЗрдБ рдПрдХ рд░реЗрдбрд┐рдореЗрдб рд░рд┐рд╕реАрднрд░ рд░ TTL рдЖрдЙрдЯрдкреБрдЯрдХреЛ рд╕рд╛рде рдПрдХ рд░реЗрдбрд┐рдореЗрдб рдПрдиреНрдЯреЗрдирд╛ рдореЛрдбреНрдпреБрд▓ рдХрд┐рдиреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдЬреБрди Arduino рд╡рд╛ рдЕрдиреНрдп рдирд┐рдпрдиреНрддреНрд░рдХрдорд╛ рдЬрдбрд╛рди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред
DCF77: рд╕рдордп рд╕рдВрдХреЗрдд рдкреНрд░рдгрд╛рд▓реАрд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ?

рдкрд╣рд┐рд▓реЗ рдиреИ Arduino рдХреЛ рд▓рд╛рдЧреА рд▓реЗрдЦрд┐рдПрдХреЛ рдЫ рддрдпрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВред рдпрджреНрдпрдкрд┐, рдпреЛ рдкрд╣рд┐рд▓реЗ рдиреИ рдерд╛рд╣рд╛ рдЫ рдХрд┐ рддрдкрд╛рдИрд▓реЗ рдорд╛рдЗрдХреНрд░реЛрдХрдиреНрдЯреНрд░реЛрд▓рд░рдорд╛ рдЬреЗ рдЧрд░реЗ рдкрдирд┐, рддрдкрд╛рдЗрдБ рдпрд╛ рдд рдШрдбреА рд╡рд╛ рдореМрд╕рдо рд╕реНрдЯреЗрд╢рдирдХреЛ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реБрдиреНрдЫред рдпрд╕реНрддреЛ рдпрдиреНрддреНрд░рдХреЛ рд╕рд╛рде, рд╕рд╣реА рд╕рдордп рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рд╛рдБрдЪреНрдЪреИ рд╕рдЬрд┐рд▓реЛ рдЫ, рдЕрд╡рд╢реНрдп рдкрдирд┐, рддрдкрд╛рдЗрдБ рд╕реНрд╡рд╛рдЧрдд рдХреНрд╖реЗрддреНрд░рдорд╛ рд╣реБрдиреБрд╣реБрдиреНрдЫред рдард┐рдХ рдЫ, рддрдкрд╛рдИрд▓реЗ рдЖрдлреНрдиреЛ рдШрдбреАрдорд╛ "рдкрд░рдорд╛рдгреБ рдШрдбреА" рд╢рд┐рд▓рд╛рд▓реЗрдЦ рдЭреБрдгреНрдбреНрдпрд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рд░ рдПрдХреИ рд╕рдордпрдорд╛ рд╕рдмреИрд▓рд╛рдИ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рдЙрдкрдХрд░рдг рд╡рд╛рд╕реНрддрд╡рдореИ рдкрд░рдорд╛рдгреБ рдШрдбреА рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬ рдЧрд░рд┐рдПрдХреЛ рдЫред

рдЪрд╛рд╣рдиреЗрд╣рд░реВрд▓реЗ рд░реЗрдбрд┐рдпреЛ рд╕рд┐рдЩреНрдХреНрд░реЛрдирд╛рдЗрдЬреЗрд╕рдирдХреЛ рд╕рд╛рде рдирдпрд╛рдБ рд╕рдВрдпрдиреНрддреНрд░ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реЗрд░ рдЖрдлреНрдиреЛ рдкреБрд░рд╛рдиреЛ рд╣рдЬреБрд░рдЖрдорд╛рдХреЛ рдШрдбреА рдЕрдкрдЧреНрд░реЗрдб рдЧрд░реНрди рд╕рдХреНрдЫрдиреН:

DCF77: рд╕рдордп рд╕рдВрдХреЗрдд рдкреНрд░рдгрд╛рд▓реАрд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ?

рддрдкрд╛рдИрдВрд▓реЗ "рд░реЗрдбрд┐рдпреЛ рдирд┐рдпрдиреНрддреНрд░рд┐рдд рдЖрдиреНрджреЛрд▓рди" рдХреБрдЮреНрдЬреА рд╢рдмреНрджрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ eBay рдорд╛ рдПрдЙрдЯрд╛ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рд░ рдЕрдиреНрддрдорд╛, рдпреЛ рдкрдвреЗрдХрд╛рд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рдЬреАрд╡рди рд╣реНрдпрд╛рдХред рдЕрд░реНрдХреЛ рджреБрдИ рд╣рдЬрд╛рд░ рдХрд┐рд▓реЛрдорд┐рдЯрд░рдорд╛ рдПрдЙрдЯреИ рд░реЗрдбрд┐рдпреЛ рд╕рд┐рдЧреНрдирд▓ рдЯреНрд░рд╛рдиреНрд╕рдорд┐рдЯрд░ рдирднрдП рдкрдирд┐, рдпрд╕реНрддреЛ рд╕рд┐рдЧреНрдирд▓ рдЖрдлреИрд▓реЗ рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рдЧрд╛рд╣реНрд░реЛ рдЫреИрдиред Google Play рдорд╛ "DCF77 Emulator" рдирд╛рдордХ рдПрдЙрдЯрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЫ рдЬрд╕рд▓реЗ рд╣реЗрдбрдлреЛрдирдорд╛ рд╕рд┐рдЧреНрдирд▓ рдЖрдЙрдЯрдкреБрдЯ рдЧрд░реНрдЫред рд▓реЗрдЦрдХрдХрд╛ рдЕрдиреБрд╕рд╛рд░, рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рд╣реЗрдбрдлреЛрдирдХреЛ рддрд╛рд░ рдШрдбреАрдХреЛ рд╡рд░рд┐рдкрд░рд┐ рд▓рдкреЗрдЯреНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрд┐рдиреАрд╣рд░реВрд▓реЗ рд╕рд┐рдЧреНрдирд▓ рдЙрдард╛рдЙрдиреЗрдЫрдиреН (рдпреЛ рдЪрд╛рдЦрд▓рд╛рдЧреНрджреЛ рдЫ рдХрд┐ рдХрд╕рд░реА, рд╕рд╛рдорд╛рдиреНрдп рд╣реЗрдбрдлреЛрдирд▓реЗ 77KHz рд╕рд┐рдЧреНрдирд▓ рдЙрддреНрдкрд╛рджрди рдЧрд░реНрджреИрди, рддрд░ рд░рд┐рд╕реЗрдкреНрд╢рди рд╕рдореНрднрд╡рддрдГ рд╣рд╛рд░реНрдореЛрдирд┐рдХреНрд╕рдХреЛ рдХрд╛рд░рдгрд▓реЗ рд╣реЛ)ред рдПрдиреНрдбреНрд░реЛрдЗрдб 9 рдорд╛, рдХрд╛рд░реНрдпрдХреНрд░рдорд▓реЗ рдореЗрд░реЛ рд▓рд╛рдЧрд┐ рдХрд╛рдо рдЧрд░реЗрди - рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдЖрд╡рд╛рдЬ рдерд┐рдПрди (рд╡рд╛ рд╕рд╛рдпрдж рдореИрд▓реЗ рдпреЛ рд╕реБрдиреЗрдХреЛ рдЫреИрди - рдпреЛ 77KHz рд╣реЛ, рдЖрдЦрд┐рд░ :), рддрд░ рд╕рд╛рдпрдж рдХрд╕реИрдХреЛ рднрд╛рдЧреНрдп рд░рд╛рдореНрд░реЛ рд╣реБрдиреЗрдЫред рдХреЗрд╣рд┐, рддрдерд╛рдкрд┐, рдЖрдлреИрд▓рд╛рдИ рдПрдХ рдкреВрд░реНрдг рд╡рд┐рдХрд╕рд┐рдд DCF рд╕рд┐рдЧреНрдирд▓ рдЬреЗрдиреЗрд░реЗрдЯрд░ рдмрдирд╛рдЙрдБрджрдЫ, рдЬреБрди рд╕рдорд╛рди Arduino рд╡рд╛ ESP32 рдорд╛ рдмрдирд╛рдЙрди рд╕рдЬрд┐рд▓реЛ рдЫ:

DCF77: рд╕рдордп рд╕рдВрдХреЗрдд рдкреНрд░рдгрд╛рд▓реАрд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ?
(рдореБрд╣рд╛рди sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛

DCF рдкреНрд░рдгрд╛рд▓реА рд╕рд╛рдБрдЪреНрдЪреИ рдПрдХрджрдо рд╕рд░рд▓ рд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рднрдПрдХреЛ рдЫред рдПрдХ рд╕рд░рд▓ рд░ рд╕рд╕реНрддреЛ рд░рд┐рд╕реАрднрд░рдХреЛ рдорджреНрджрддрд▓реЗ, рддрдкрд╛рдИрдВрд╕рдБрдЧ рд╕рдзреИрдВ рд░ рдЬрддрд╛рддрддреИ рд╕рд╣реА рд╕рдордп рд╣реБрди рд╕рдХреНрдЫ, рдкрдХреНрдХреИ рдкрдирд┐ рд╕реНрд╡рд╛рдЧрдд рдХреНрд╖реЗрддреНрд░рдорд╛ред рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ рдХрд┐ рд╡реНрдпрд╛рдкрдХ рдбрд┐рдЬрд┐рдЯрд▓рд╛рдЗрдЬреЗрд╢рди рд░ рдЪреАрдЬрд╣рд░реВрдХреЛ рдЗрдиреНрдЯрд░рдиреЗрдЯрдХреЛ рдмрд╛рд╡рдЬреБрдж рдкрдирд┐, рдпрд╕реНрддрд╛ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рдирд╣рд░реВ рд▓рд╛рдореЛ рд╕рдордпрдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рдЧ рд╣реБрдиреЗрдЫред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди