使用Mircoduino UM220III gps模块自动校准RTC PCF8563制作高精度北...-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4942|回复: 2

使用Mircoduino UM220III gps模块自动校准RTC PCF8563制作高精度北...

[复制链接]
发表于 2016-9-6 23:13 | 显示全部楼层 |阅读模式
本帖最后由 topdog 于 2016-9-6 23:34 编辑

Microduino mcookie的教程里只有手动设置RTC来制作时钟,本帖介绍一下,用UM220III gps模块自动校准RTC PCF8563,并且再用RTC PCF8563制作高精度北京时间时钟。

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

switch(gps.Month)
         {
            case 1:
                if(GPS_Hour_Tmp >= 24)
              {                  
                   gps.Day += 1;
                   if(gps.Day > 31)
                {
                   gps.Day -= 31;
                   gps.Month += 1;
                 }
              }
            break;
            case 2:
                if(GPS_Hour_Tmp >= 24)
             {                  
                   gps.Day += 1;
                   if( LEAP_YEAR = 1)
                 {
                   if(gps.Day > 29)
                 {
                   gps.Day -= 29;
                   gps.Month += 1;  
                  }
               }
               else
              {
                 
                 if(gps.Day > 28)
                 {
                    gps.Day -= 28;
                    gps.Month += 1;
                  }
            
               }
             }
             break;      
             case 3:
                   if(GPS_Hour_Tmp >= 24)
                 {                     
                      gps.Day += 1;
                      if(gps.Day > 31)
                    {
                       gps.Day -= 31;
                       gps.Month += 1;
                     }
                  }
               break;
               case 4:
               if(GPS_Hour_Tmp >= 24)
              {                  
                    gps.Day += 1;
               if(gps.Day > 30)
                {
                      gps.Day -= 30;
                      gps.Month += 1;
                 }
               }
               break;

               case 5:
                if(GPS_Hour_Tmp >= 24)
              {               
                  gps.Day += 1;
                  if(gps.Day > 31)
                     {
                         gps.Day -= 31;
                         gps.Month += 1;
                      }
                }
                break;

               case 6:
                 if(GPS_Hour_Tmp >= 24)
               {                 
                  gps.Day += 1;
                  if(gps.Day > 30)
                  {
                   gps.Day -= 30;
                   gps.Month += 1;
                  }
                }
                break;
                case 7:
                if(GPS_Hour_Tmp >= 24)
               {               
                 gps.Day += 1;
                 if(gps.Day > 31)
                  {
                    gps.Day -= 31;
                    gps.Month += 1;
                   }
                 }
                 break;

                case 8:
                if(GPS_Hour_Tmp >= 24)
               {                  
                   gps.Day += 1;
                 if(gps.Day > 31)
                 {
                    gps.Day -= 31;
                    gps.Month += 1;
                  }
                 }
                break;

                case 9:
                if(GPS_Hour_Tmp >= 24)
                {                  
                   gps.Day += 1;
                   if(gps.Day > 30)
                   {
                      gps.Day -= 30;
                      gps.Month += 1;
                    }
                   }
                  break;

                  case 10:
                  if(GPS_Hour_Tmp >= 24)
                  {                     
                     gps.Day += 1;
                   if(gps.Day > 31)
                   {
                      gps.Day -= 31;
                      gps.Month += 1;
                    }
                   }
                   break;
      
                   case 11:
                  if(GPS_Hour_Tmp >= 24)
                  {                    
                     gps.Day += 1;
                   if(gps.Day > 30)
                   {
                     gps.Day -= 30;
                     gps.Month += 1;
                    }
}
                   }
                   break;

                   case 12:
                   if(GPS_Hour_Tmp >= 24)
                   {                     
                      gps.Day += 1;
                    if(gps.Day > 31)
                    {
                       gps.Day -= 31;
                       gps.Month = 1;
                       gps.Year += 1;
                     }
                    }
                    break;
            default:
            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 08:05 | 显示全部楼层
很不错的设计
 楼主| 发表于 2016-9-10 22:37 | 显示全部楼层

谢谢你的指导。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 00:37 , Processed in 0.111484 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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