永不消逝的电波——Arduino制作BCD码电波钟

thomas 于 2013-11-15 11:12 编辑



特别声明:本帖仅作为技术方案探讨使用,禁止任何人用于商业行为。

如本帖对相关权利人利益构成伤害,请立即联系网站删除此贴!





分隔线内引自百度百科



------------------------------------------------------------------------------------------------

简介



电波表

所谓电波表,机身由原子时钟和无线电接收系统组成,由国家授时中心发出准确时间,通过无线电接收系统接收、经CPU处理后显示时间,电波表30万年误差不会超过一秒。简单的说就是一种接受标准时间信息的电波后,可以自动校对时间的手表。电波钟表是人类计时技术发展历程中,继沙漏、日晷、机械钟表、石英钟表之后的第五代计时器。电波钟表技术和产品的出现是人类计时史的又一次革命。

2技术特点



电波表

电波钟表将传统钟表技术与现代时频技术、微电子技术、通讯技术、计算机技术等多项技术相结合,通过接收国家授时中心以无线电长波传送的标准时间信号,经过内置微处理器解码处理后,自动校准计时器走时,使电波钟表显示的时间与国家保持的标准时间自动保持精确同步。

中国科学院国家授时中心与**公司合作,开发低频时码电波授时新技术,致力推动中国电波钟技术发展,推出具有中国自主知识产权的电波钟表,使中国成为世界上继德国、美国、英国、日本之后第五个实现长波授时技术民用化的国家。

-------------------------------------------------------------------------------------------------------



我算是第一批中国制式电波手表的用户,大概07年底入手的,CITIZEN BPC码电波表。

见当时新闻 http://www.dpcrct.com/dongtai/07.htm



后来单位也统一配发了电波表,几个同事手表放一排,秒针都是同步的,很有乐趣。

所以我野心膨胀,一直想找机会自制一个电波钟。

终于等到tb有模块出售了,15块,其实不算便宜。可到手后,发现不带解码功能。自己也一直没有合适的解码思路,闲置了。

专业电子论坛也试着破解过编码,都不完美。偶然发现一些资料,感觉趁热打铁,将代码解出来了。

资料地址 http://wenku.baidu.com/view/0b2e2526a5e9856a56126017.html

按照发布者的思路,其实自己设计电路接收并不复杂,只是灵敏度问题。

ourdev_588151U7CKSX (1).gif

2013-11-15 00:29 上传
(6.84 KB)

参考amoBBS.com上发布的帖子,相关编码规则



-----------------------------------------------------------------------------------------------------------

【二】BPC天线模块介绍:


bpc_01.jpg

2013-11-15 00:28 上传
(36.81 KB)



BPC电波钟天线模块采用CME6005高灵敏度IC,性能稳定可靠,低碳低功耗,工作电压范围1.5~3.5V,工作电流70~100uA,静态电流0.2~2uA。



反面有白油字样V, G, T,空, P, H;脚位间隔是2.54mm。



V-接电源VCC,1.5~3.5V



G-接地GND



T-时间信号反向输出端



空(无丝印)-时间信号正向输出端



P-模块使能端,工作接底,静态接高



H-自动增益控制接高电平(模块已连好高电平)

bpc_02.jpg

2013-11-15 00:29 上传
(115.08 KB)

bpc_03.jpg

2013-11-15 00:29 上传
(119.09 KB)

bpc_04.jpg

2013-11-15 00:29 上传
(196.15 KB)



--------------------------------------------------------------------------------------------------------------

试验过程





每一个夜黑风高的夜晚,总会有些奇迹发生。

20131015_003030.jpg

2013-11-15 00:23 上传
(5.89 KB)





电路很简单。



由于模块对开关电源非常敏感,我选择了一节3.6v电池接 V和G端(最高电压为3.5v,用两节1.5v电池最好)

然后G端和Arduino GND连接。

时间信号正向输出端接Arduino A0

就这么简单。



测试:我从藏宝箱里找了一个80年代的电话话筒,压电陶瓷的,直接 输出端和地,听见有节奏的咔哒声。如果将模块距离电脑屏幕稍近,立即能听见强烈干扰,估计是屏幕升压电路引起的。

20131110_150718.jpg

2013-11-15 00:23 上传
(87.85 KB)



特别注意! 模块应远离电脑屏幕,否则会引入很强干扰。



开始解析信号。考虑晚上干扰少,成功率比较高。

终于得到了一堆数据。

........

0011302423103103133

0011302413103103133

0011302433103033133

0011302423103033123

0011302413103033123

.......



第一次解码,傻了根本找不出有效数据。

这是4进制数据,不应该出现4,我做的分隔符。

失败了。



隔了一周,我将资料全打印出来,没事就分析下。发现是程序的问题。

开始改进,终于得到了完整的数据。

目前的数据

........

------------------------------------



2003021132022230310

2013-11-10 Week:7 Time: 3:10:0PM

------------------------------------



0003022133022230310

2013-11-10 Week:7 Time: 3:10:20PM

------------------------------------



1003022132022230310

2013-11-10 Week:7 Time: 3:10:40PM

------------------------------------



2003022132022230310

2013-11-10 Week:7 Time: 3:11:0PM

------------------------------------



0003023132022230310

2013-11-10 Week:7 Time: 3:11:20PM

------------------------------------



1003023133022230310

2013-11-10 Week:7 Time: 3:11:40PM

------------------------------------

.......


20131110_151055.jpg

2013-11-15 00:23 上传
(68.1 KB)



左侧是电波手表作为基准对照,分秒不差。





基础解码程序,不带任何纠错及验证功能。

不考虑纠错的话,可以直接每天校准DS1302时钟模块了



未完待续。



ARDUINO 代码复制打印

int timeWidth=0;int dataOut=0;int lostData=0;int flag=0;int P0=0;int P1=0;int P2=0;int P3=0;int P4=0;int BPChour=0;int BPCminuate=0;int BPCsecond;int BPCweek=0;int BPCday=0;int BPCmonth=0;int BPCyear=0;int BPCArray[19]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};void setup() {Serial.begin(9600);}void loop() {int sensorValue = analogRead(A0);if(sensorValue<100){      //低位触发计数开始  timeWidth++;   lostData=0;}else if(timeWidth!=0){    //高位输出,如果不为空,则输出脉宽信息  dataOut=timeWidth-1;   //  Serial.print(dataOut);  //输出原始数据  BPCArray[flag]=dataOut;  flag++;  timeWidth=0;}else{           //低电平计时数开始  BPCArray[18]=dataOut;  lostData++;   if(lostData>12){      //判断是否为1S缺秒脉冲标志,是则换行  Serial.println("");  //////////////////////////////////////////////////////////////////////////////  int i;  for (i = 0; i < 19; i = i + 1) {  Serial.print(BPCArray[i]);////统一输出存储数据  }  Serial.println("");  P1=BPCArray[


via - 极客工坊

标签: Arduino教程