极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 25090|回复: 6

enc28j60+NTP更新DS3231时钟 兼容DS1307

[复制链接]
发表于 2013-9-16 20:17:36 | 显示全部楼层 |阅读模式
新人刚接触Arduino,各种尝试中~

参考这个帖子大采购了一番,还加上各种模块:
http://www.geek-workshop.com/thread-131-1-1.html (话说本坛真是各种有营养的帖子都有啊……)

因为想做个时钟类的东西练练手,买了2种时钟模块,一个是大家常见的DS1307,有DS18B20的接口但是没有本体,应该也有个存储模块,坑爹的没带排针……带的可充电纽扣电池。

另一个是DS3231,偶搜1307的时候看到的,据说更NB什么什么的,就一起买了一块。没有DS18B20的3针位。也内置了存储模块。带了不可充电的纽扣电池。这个模块买前坛子里几乎没找到什么资料,这回测下来OK就发个贴。实际上可以和1307的代码通用。高人大概都知道了,不过总有像偶一样的新人的吧。就留做参考了。

长这个样子,背面就是个电池:


enc28j60模块也是一起买的,反正要试好坏,就想着连起来一起弄弄。正好给时钟模块设了时间放着,看时间长了走时到底准不准。

连线参考了这个帖子:
http://www.geek-workshop.com/thread-200-1-1.html

时钟就是普通的I2C连线。说来惭愧,偶其实第一次玩I2C,一开始把A4,A5脚连到P4,P5脚去了……结果死活出不来东西,换了别的时钟模块,还有个1602转I2C的模块都没效果,才开始怀疑是连错线……>.<

实物是酱紫:


挡不住萌买了一块小熊板,和模块啥的一起收到的,拿来一试倒是意外发现很方便啊,因为比UNO多了排针,连模块直接用杜邦线就行了~

代码是抄了2段别人的来拼一下,目的反正只是刷进时间就好了(顺带测试模块好坏……),也就没去优化。
一个是github上的NTP获取Internet时间的:
https://github.com/lucadentella/enc28j60_tutorial/blob/master/_13_NTP/_13_NTP.ino

一个是DS1307库里自带的example,用的是Arduino官网上找到的DS1307的库,说是可以直接兼容DS3231,实测下来也的确~
http://playground.arduino.cc/Code/Time

以下是代码:
  1. #include <EtherCard.h>
  2. #include <DS1307RTC.h>
  3. #include <Time.h>
  4. #include <Wire.h>

  5. #define SECONDS_IN_DAY          86400
  6. #define START_YEAR              1900
  7. #define TIME_ZONE               +8
  8. static int days_in_month[] = {
  9.   31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

  10. static byte mymac[] = {
  11.   0x00,0x1A,0x4B,0x38,0x0C,0x5C};
  12. byte Ethernet::buffer[700];

  13. static byte ntpServer[] = {
  14.   193,204,114,232};
  15. static byte srcPort = 0;

  16. uint32_t timeStamp;
  17. boolean requestSent;

  18. void setup () {
  19.   Serial.begin(115200);
  20.   Serial.println("Update RTC time thru NTP");

  21.   printRTCTime();

  22.   if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))
  23.     Serial.println( "Failed to access Ethernet controller");
  24.   else
  25.     Serial.println("Ethernet controller initialized");

  26.   if (!ether.dhcpSetup())
  27.     Serial.println("Failed to get configuration from DHCP");
  28.   else
  29.     Serial.println("DHCP configuration done");

  30.   ether.printIp("IP Address:\t", ether.myip);
  31.   ether.printIp("Netmask:\t", ether.mymask);
  32.   ether.printIp("Gateway:\t", ether.gwip);

  33.   Serial.println();
  34.   Serial.println("Press n to send NTP request");
  35.   requestSent = false;
  36. }

  37. void loop() {

  38.   ether.packetLoop(ether.packetReceive());

  39.   if(requestSent && ether.ntpProcessAnswer(&timeStamp, srcPort)) {
  40.     Serial.println("NTP answer received");
  41.     Serial.println();
  42.     Serial.print("Timestamp: ");
  43.     Serial.println(timeStamp);
  44.     Serial.println();
  45.     printDate(timeStamp + 3600 * TIME_ZONE);
  46.     requestSent = false;
  47.   }

  48.   if(Serial.available() > 0) {
  49.     int incomingByte = Serial.read();
  50.     if(incomingByte == 'n') {
  51.       ether.ntpRequest(ntpServer, srcPort);
  52.       Serial.println("NTP request sent");
  53.       requestSent = true;
  54.     }
  55.   }
  56. }

  57. void printDate(uint32_t timeStamp) {

  58.   unsigned int year = START_YEAR;
  59.   while(1) {
  60.     uint32_t seconds;
  61.     if(isLeapYear(year)) seconds = SECONDS_IN_DAY * 366;
  62.     else seconds = SECONDS_IN_DAY * 365;
  63.     if(timeStamp >= seconds) {
  64.       timeStamp -= seconds;
  65.       year++;
  66.     }
  67.     else break;
  68.   }

  69.   unsigned int month = 0;
  70.   while(1) {   
  71.     uint32_t seconds = SECONDS_IN_DAY * days_in_month[month];
  72.     if(isLeapYear(year) && month == 1) seconds = SECONDS_IN_DAY * 29;
  73.     if(timeStamp >= seconds) {
  74.       timeStamp -= seconds;
  75.       month++;
  76.     }
  77.     else break;
  78.   }  
  79.   month++;

  80.   unsigned int day = 1;
  81.   while(1) {
  82.     if(timeStamp >= SECONDS_IN_DAY) {
  83.       timeStamp -= SECONDS_IN_DAY;
  84.       day++;
  85.     }
  86.     else break;
  87.   }  

  88.   unsigned int hour = timeStamp / 3600;
  89.   unsigned int minute = (timeStamp - (uint32_t)hour * 3600) / 60;
  90.   unsigned int second = (timeStamp - (uint32_t)hour * 3600) - minute * 60;

  91.   tmElements_t tm;
  92.   tm.Year = CalendarYrToTm(year);
  93.   tm.Month = month;
  94.   tm.Day = day;
  95.   tm.Hour = hour;
  96.   tm.Minute = minute;
  97.   tm.Second = second;
  98.   RTC.write(tm);

  99.   Serial.println("Current date and time:");

  100.   if(day < 10) Serial.print("0");
  101.   Serial.print(day);
  102.   Serial.print("/");

  103.   if(month < 10) Serial.print("0");
  104.   Serial.print(month);
  105.   Serial.print("/");  

  106.   Serial.println(year);

  107.   if(hour < 10) Serial.print("0");
  108.   Serial.print(hour);
  109.   Serial.print(":");

  110.   if(minute < 10) Serial.print("0");
  111.   Serial.print(minute);
  112.   Serial.print(":");

  113.   if(second < 10) Serial.print("0");
  114.   Serial.println(second);

  115.   Serial.println();
  116.   printRTCTime();
  117. }

  118. boolean isLeapYear(unsigned int year) {

  119.   return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
  120. }

  121. void printRTCTime()
  122. {
  123.   tmElements_t tm;
  124.   Serial.println("Time from RTC:");
  125.   if (RTC.read(tm)) {
  126.     Serial.print("Ok, Time = ");
  127.     print2digits(tm.Hour);
  128.     Serial.write(':');
  129.     print2digits(tm.Minute);
  130.     Serial.write(':');
  131.     print2digits(tm.Second);
  132.     Serial.print(", Date (D/M/Y) = ");
  133.     Serial.print(tm.Day);
  134.     Serial.write('/');
  135.     Serial.print(tm.Month);
  136.     Serial.write('/');
  137.     Serial.print(tmYearToCalendar(tm.Year));
  138.     Serial.println();
  139.   }
  140.   else {
  141.     if (RTC.chipPresent()) {
  142.       Serial.println("The DS1307 is stopped.  Please run the SetTime");
  143.       Serial.println("example to initialize the time and begin running.");
  144.       Serial.println();
  145.     }
  146.     else {
  147.       Serial.println("DS1307 read error!  Please check the circuitry.");
  148.       Serial.println();
  149.     }
  150.   }
  151. }
  152. void print2digits(int number) {
  153.   if (number >= 0 && number < 10) {
  154.     Serial.write('0');
  155.   }
  156.   Serial.print(number);
  157. }
复制代码


刷好DS3231后顺带把1307的时间也更新了,坑爹的模块没有排针,偶用面包线用手指按在那4个洞洞里刷的 =,=

顺带请假,1307自带的那个锂电池可以充电的话,应该怎么充?。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2013-9-16 20:19:45 | 显示全部楼层
对了顺带再问一下,DS3231模块右边的那4个孔位是干嘛的?……
回复 支持 反对

使用道具 举报

发表于 2014-3-17 09:41:38 | 显示全部楼层
isilcala 发表于 2013-9-16 20:19
对了顺带再问一下,DS3231模块右边的那4个孔位是干嘛的?……

你没发现字母和顺序和左边的后四个是一样的?
回复 支持 反对

使用道具 举报

发表于 2014-10-4 20:17:40 | 显示全部楼层
qq693954025 发表于 2014-3-17 09:41
**** 作者被禁止或删除 内容自动屏蔽 ****

能分享下库文件吗/
回复 支持 反对

使用道具 举报

发表于 2014-10-4 20:18:09 | 显示全部楼层
能分享下库文件吗/
回复 支持 反对

使用道具 举报

发表于 2015-9-22 19:03:38 | 显示全部楼层
DS1307RTC兼容3231.zip

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2017-9-21 21:01:21 | 显示全部楼层
感谢楼主分享,先收藏了,慢慢学习。
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-23 18:29 , Processed in 0.055390 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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