#raspberry-pi-pico #receiver #clock #dcf77 #msf #led #second

app rp-rs-radio-clock

在Raspberry Pi Pico上的DCF77和MSF接收器

6个版本 (1个稳定版)

1.0.0 2024年7月13日
0.1.4 2024年6月13日
0.1.3 2023年12月4日
0.1.2 2023年11月26日
0.1.0 2022年6月27日

#39硬件支持

Download history 118/week @ 2024-06-11 2/week @ 2024-06-18 28/week @ 2024-07-02 134/week @ 2024-07-09 10/week @ 2024-07-16 1/week @ 2024-07-23 82/week @ 2024-07-30

每月99次下载

MIT/Apache

37KB
793

DCF77/MSF接收器

这是一个接收德国DCF77和英国MSF时间发射器的接收器。维基百科上对这两个站点都有详细的介绍。两个站点的接收是相互独立的。如果接收允许,时钟会在几分钟内显示两个发射器广播的当前日期和时间。

请参考原理图了解各种组件。KY040(包括按钮和旋转编码器)目前未使用,但将来可能会使用。

构建和安装

要构建程序,您需要一个最新版本的Rust(当前代码是在Rust 1.79上开发的)并安装了 thumbv6m-none-eabi 目标,因为这是Raspberry Pico运行的目标。编译后,将编译好的程序加载到您的Raspberry Pico上,之后程序应该会启动。

LED灯

三个LED组(连接到12-14引脚)由DCF77使用

  • LED 12表示新的秒(200 ms开启)或新的分钟(600 ms开启)
  • LED 13开启表示当前传输的位值为1
  • LED 14开启表示当前位无法解码

四个LED组(连接到2-5引脚)由MSF使用

  • LED 2表示新的秒(200 ms开启)或新的分钟(600 ms开启)
  • LED 3开启表示当前传输的位A值为1
  • LED 4开启表示当前传输的位B值为1
  • LED 5开启表示当前位无法解码

在启动时钟时,LED 12和14开启,直到接收到DCF77的第一个脉冲,LED 2和5开启,直到接收到MSF的第一个脉冲。


显示屏

显示屏分为两部分,DCF77使用上面两行,MSF使用下面两行

DCF77 cbaymdwhmt =MS
YYMMDD WW HHmmSS TCL
MSF  dcbaymdwhmt = !
YYMMDD WW HHmmSS Tdd

在顶部行显示站点名称。通常站点名称的第一个字母是大写,但如果当前分钟溢出且下一个分钟由软件预测而不是从发射器解码,则切换为小写。在站点名称之后,可能会出现各种字符,如果软件检测到异常。

如果出现奇偶校验错误,前三个或四个字母(对于DCF77为'cba',对于MSF为'dcba')将出现。如果无法计算奇偶校验,则这些字母为小写,如果计算成功但与预期值不匹配,则为大写。

  • 对于DCF77
    • 'c'表示日期奇偶校验错误(星期、月、日、年)
    • 'b'表示小时奇偶校验错误
    • 'a'表示分钟奇偶校验错误
  • 对于MSF
    • 'd'表示时间奇偶校验错误(小时、分钟)
    • 'c'表示星期奇偶校验错误
    • 'b'表示日期奇偶校验错误(日、月)
    • 'a'表示年奇偶校验错误

如果某个值(例如月份)意外跳变,则接下来七个字符(对于DCF77和MSF相同)将出现

  • 'y'表示年
  • 'm'(第一个)表示月份
  • 'd'表示月份中的日
  • 'w'表示星期
  • 'h'表示小时
  • 'm'(第二个)表示分钟
  • 't'表示夏令时

带有电台名称的行中的最后三个字符表示一些其他信息

  • '='表示接收到的秒数(或比特数)与预期数量不匹配,通常是60,除非发生闰秒,如果是'<'表示分钟太短,'>'表示分钟太长,如果是空白则表示分钟长度正常
  • 对于DCF77
    • 'M'如果位0的值为1时显示为'M',如果无法解码则显示为'm',如果正常(值为0)则显示为空白
    • 'S'如果位20的值为0时显示为'S',如果无法解码则显示为's',如果正常(值为1)则显示为空白
  • 对于MSF
    • '!'保留供将来使用

DCF77 cbaymdwhmt =MS
YYMMDD WW HHmmSS TCL
MSF  dcbaymdwhmt = !
YYMMDD WW HHmmSS Tdd

第二行和第四行显示当前日期和时间。所有数值均为两位数,可前面加'0',如果无法解码则显示为'**'。

  • YY显示当前年份(00-99)
  • MM显示当前月份(01-12)
  • DD显示当前月份中的日(01-31)
  • WW显示当前星期(Mo, Tu, We, Th, Fr, Sa, Su)
  • HH显示当前小时(00-23)
  • mm显示当前分钟(00-59)
  • SS显示当前秒(00-59,如果发生闰秒则显示60)

最后三个字符显示一些其他方面

  • T显示当前夏令时状态
    • 's'表示夏令时('summer')
    • 'w'表示正常时间('winter')
    • 'S'在切换或刚切换到夏令时时出现
    • 'W'在切换或刚切换到正常时间时出现
    • '*'如果状态无法解码则出现
  • 对于DCF77
    • 'C'表示是否激活了'call bit'(位15),如果无法解码则显示为'c'
    • 'L'表示有关闰秒的各种信息
      • 'l'表示宣布了闰秒
      • 'L'表示刚刚发生了闰秒
      • '1'表示刚刚发生了闰秒,其值为1(应该是0)
      • 'm'表示宣布了闰秒但缺失
      • '*'表示状态无法解码
  • 对于MSF
    • dd显示DUT1的值,它表示UT1和UTC之间的差异,单位为十分之一秒。正值表示UT1在UTC之前,负值表示UT1在UTC之后。

已知问题

  • 有时在开机时时钟会卡住(至少在我的硬件上是这样),重新供电最终会解决这个问题。
  • 有时在接收不良时时间不会正确增加。

依赖关系

~11MB
~169K SLoC