极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7267|回复: 6

使用Mircoduino UM220III gps模块自动校准RTC PCF8563制作高精度北京时间时钟

[复制链接]
发表于 2016-9-6 23:07:54 | 显示全部楼层 |阅读模式
Microduino mcookie的教程里只有手动设置RTC来制作时钟,本帖介绍一下,用UM220III gps模块自动校准RTC PCF8563,并且再用RTC PCF8563制作高精度北京时间时钟。

有关UM220III gps模块得到时间和日期的办法帖子《Microduino-UM220iiiN-GPS模块制作时钟》已经介绍过了,gps的日期转化成北京日期的办法switch()来实现,这样阅读起来也比较方便。就是每天24点,根据月份判断明天的日期。

  1. switch(gps.Month)
  2. {
  3. case 1:
  4.   if(GPS_Hour_Tmp >= 24)
  5.   {                  
  6.     gps.Day += 1;
  7.     if(gps.Day > 31)
  8.     {
  9.       gps.Day -= 31;
  10.       gps.Month += 1;
  11.     }
  12.   }
  13.   break;
  14. case 2:
  15.   if(GPS_Hour_Tmp >= 24)
  16.   {                  
  17.     gps.Day += 1;
  18.     if( LEAP_YEAR = 1)
  19.     {
  20.       if(gps.Day > 29)
  21.       {
  22.         gps.Day -= 29;
  23.         gps.Month += 1;  
  24.       }
  25.     }
  26.     else
  27.     {

  28.       if(gps.Day > 28)
  29.       {
  30.         gps.Day -= 28;
  31.         gps.Month += 1;
  32.       }

  33.     }
  34.   }
  35.   break;      
  36. case 3:
  37.   if(GPS_Hour_Tmp >= 24)
  38.   {                     
  39.     gps.Day += 1;
  40.     if(gps.Day > 31)
  41.     {
  42.       gps.Day -= 31;
  43.       gps.Month += 1;
  44.     }
  45.   }
  46.   break;
  47. case 4:
  48.   if(GPS_Hour_Tmp >= 24)
  49.   {                  
  50.     gps.Day += 1;
  51.     if(gps.Day > 30)
  52.     {
  53.       gps.Day -= 30;
  54.       gps.Month += 1;
  55.     }
  56.   }
  57.   break;

  58. case 5:
  59.   if(GPS_Hour_Tmp >= 24)
  60.   {               
  61.     gps.Day += 1;
  62.     if(gps.Day > 31)
  63.     {
  64.       gps.Day -= 31;
  65.       gps.Month += 1;
  66.     }
  67.   }
  68.   break;

  69. case 6:
  70.   if(GPS_Hour_Tmp >= 24)
  71.   {                 
  72.     gps.Day += 1;
  73.     if(gps.Day > 30)
  74.     {
  75.       gps.Day -= 30;
  76.       gps.Month += 1;
  77.     }
  78.   }
  79.   break;
  80. case 7:
  81.   if(GPS_Hour_Tmp >= 24)
  82.   {               
  83.     gps.Day += 1;
  84.     if(gps.Day > 31)
  85.     {
  86.       gps.Day -= 31;
  87.       gps.Month += 1;
  88.     }
  89.   }
  90.   break;

  91. case 8:
  92.   if(GPS_Hour_Tmp >= 24)
  93.   {                  
  94.     gps.Day += 1;
  95.     if(gps.Day > 31)
  96.     {
  97.       gps.Day -= 31;
  98.       gps.Month += 1;
  99.     }
  100.   }
  101.   break;

  102. case 9:
  103.   if(GPS_Hour_Tmp >= 24)
  104.   {                  
  105.     gps.Day += 1;
  106.     if(gps.Day > 30)
  107.     {
  108.       gps.Day -= 30;
  109.       gps.Month += 1;
  110.     }
  111.   }
  112.   break;

  113. case 10:
  114.   if(GPS_Hour_Tmp >= 24)
  115.   {                     
  116.     gps.Day += 1;
  117.     if(gps.Day > 31)
  118.     {
  119.       gps.Day -= 31;
  120.       gps.Month += 1;
  121.     }
  122.   }
  123.   break;

  124. case 11:
  125.   if(GPS_Hour_Tmp >= 24)
  126.   {                    
  127.     gps.Day += 1;
  128.     if(gps.Day > 30)
  129.     {
  130.       gps.Day -= 30;
  131.       gps.Month += 1;
  132.     }
  133.   }
  134. }
  135. break;

  136. case 12:
  137.   if(GPS_Hour_Tmp >= 24)
  138.   {                     
  139.     gps.Day += 1;
  140.     if(gps.Day > 31)
  141.     {
  142.       gps.Day -= 31;
  143.       gps.Month = 1;
  144.       gps.Year += 1;
  145.     }
  146.   }
  147.   break;
  148. default:
  149.   break;

复制代码

RTC PCF8563设置日期的函数是 rtc.setDate();参数包括day, weekday, month, century(1=1900, 0=2000), year(0-99)。其中year只要后面两位,所以在截取gps的年份时对"$GNZDA"取了26至28位。难在对星期的计算上,这里我是用了基姆拉尔森计算公式。把一月和二月看成是上一年的十三月和十四月。年月日转化成星期几的公式是 weekday= (day+2*month+3*(month+1)/5+year+year/4-year/100+year/400+1)%7 。计算出来的“0”代表星期一,“6”代表星期天,依此类推。

if(gps.Month ==1||gps.Month ==2) {
             gps.Month=(gps.Month==1?13:14);
             gps.Year--;
             }
             int Weekday=(gps.Day+2*gps.Month +3*(gps.Month +1)/5+gps.Year+gps.Year/4-gps.Year/100+gps.Year/400)%7;  
                    
把Microduino um220III , coreUSB 和 mcookie RTC PCF8563叠加在一起,用数据线和电脑的USB口连接,用Arduino IDE烧写程序。 程序分享在github地址:

IMG_8168a.jpg

IMG_8169a.jpg

在串口看到数据已经被改写,和计算机右下角的时间相同,那么校准RTC的任务已经完成。

校时.JPG

接下来要使用mcookie的模块来做时钟,用到的有coreUSB,RTC,OLED,BM和电池组,以及底板。用Arduino IDE烧写程序。程序分享到github地址:

a.jpg

时间的精度和电波表不相上下,那比手动对时精度高多了。最后的显示效果:

IMG_8171a.jpg
回复

使用道具 举报

发表于 2016-9-7 11:23:54 | 显示全部楼层
那两节1860很是,威武
回复 支持 反对

使用道具 举报

发表于 2016-9-7 18:06:25 | 显示全部楼层
蹲蹲兄,转换东八区的时间,有现成库,你可以参考一下。https://github.com/jcw/rtclib
  1. //提取时间
  2.     i_hour=GPS.hour;
  3.     i_minute=GPS.minute;
  4.     i_second=GPS.seconds;
  5.     i_year=GPS.year;
  6.     i_month=GPS.month;
  7.     i_day=GPS.day;
  8.     DateTime dt1 (i_year,i_month, i_day, i_hour, i_minute, i_second);
  9.     DateTime dt2=dt1.get()+3600*8;  //8 hour later (东八区)
  10.     i_year=dt2.year();//将补偿8小时的时间重新计算年月日时
  11.     i_month=dt2.month();
  12.     i_day=dt2.day();
  13.     i_hour=dt2.hour();
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-7 19:42:45 | 显示全部楼层
沧海笑1122 发表于 2016-9-7 18:06
蹲蹲兄,转换东八区的时间,有现成库,你可以参考一下。https://github.com/jcw/rtclib

谢谢指教,一起学习进步。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-9 20:35:11 | 显示全部楼层
wing 发表于 2016-9-7 11:23
那两节1860很是,威武

是10440。谢谢指导。
回复 支持 反对

使用道具 举报

发表于 2016-9-10 10:05:47 | 显示全部楼层
哦哦,小白了

锂点在我看来都很高大上
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-10 22:39:49 | 显示全部楼层
wing 发表于 2016-9-10 10:05
哦哦,小白了

锂点在我看来都很高大上

谢谢你的指导。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2020-9-29 00:46 , Processed in 0.050115 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表