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 在 硬件支持
每月99次下载
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