|
新人刚接触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
以下是代码: - #include <EtherCard.h>
- #include <DS1307RTC.h>
- #include <Time.h>
- #include <Wire.h>
- #define SECONDS_IN_DAY 86400
- #define START_YEAR 1900
- #define TIME_ZONE +8
- static int days_in_month[] = {
- 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
- static byte mymac[] = {
- 0x00,0x1A,0x4B,0x38,0x0C,0x5C};
- byte Ethernet::buffer[700];
- static byte ntpServer[] = {
- 193,204,114,232};
- static byte srcPort = 0;
- uint32_t timeStamp;
- boolean requestSent;
- void setup () {
- Serial.begin(115200);
- Serial.println("Update RTC time thru NTP");
- printRTCTime();
- if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))
- Serial.println( "Failed to access Ethernet controller");
- else
- Serial.println("Ethernet controller initialized");
- if (!ether.dhcpSetup())
- Serial.println("Failed to get configuration from DHCP");
- else
- Serial.println("DHCP configuration done");
- ether.printIp("IP Address:\t", ether.myip);
- ether.printIp("Netmask:\t", ether.mymask);
- ether.printIp("Gateway:\t", ether.gwip);
- Serial.println();
- Serial.println("Press n to send NTP request");
- requestSent = false;
- }
- void loop() {
- ether.packetLoop(ether.packetReceive());
- if(requestSent && ether.ntpProcessAnswer(&timeStamp, srcPort)) {
- Serial.println("NTP answer received");
- Serial.println();
- Serial.print("Timestamp: ");
- Serial.println(timeStamp);
- Serial.println();
- printDate(timeStamp + 3600 * TIME_ZONE);
- requestSent = false;
- }
- if(Serial.available() > 0) {
- int incomingByte = Serial.read();
- if(incomingByte == 'n') {
- ether.ntpRequest(ntpServer, srcPort);
- Serial.println("NTP request sent");
- requestSent = true;
- }
- }
- }
- void printDate(uint32_t timeStamp) {
- unsigned int year = START_YEAR;
- while(1) {
- uint32_t seconds;
- if(isLeapYear(year)) seconds = SECONDS_IN_DAY * 366;
- else seconds = SECONDS_IN_DAY * 365;
- if(timeStamp >= seconds) {
- timeStamp -= seconds;
- year++;
- }
- else break;
- }
- unsigned int month = 0;
- while(1) {
- uint32_t seconds = SECONDS_IN_DAY * days_in_month[month];
- if(isLeapYear(year) && month == 1) seconds = SECONDS_IN_DAY * 29;
- if(timeStamp >= seconds) {
- timeStamp -= seconds;
- month++;
- }
- else break;
- }
- month++;
- unsigned int day = 1;
- while(1) {
- if(timeStamp >= SECONDS_IN_DAY) {
- timeStamp -= SECONDS_IN_DAY;
- day++;
- }
- else break;
- }
- unsigned int hour = timeStamp / 3600;
- unsigned int minute = (timeStamp - (uint32_t)hour * 3600) / 60;
- unsigned int second = (timeStamp - (uint32_t)hour * 3600) - minute * 60;
- tmElements_t tm;
- tm.Year = CalendarYrToTm(year);
- tm.Month = month;
- tm.Day = day;
- tm.Hour = hour;
- tm.Minute = minute;
- tm.Second = second;
- RTC.write(tm);
- Serial.println("Current date and time:");
- if(day < 10) Serial.print("0");
- Serial.print(day);
- Serial.print("/");
- if(month < 10) Serial.print("0");
- Serial.print(month);
- Serial.print("/");
- Serial.println(year);
- if(hour < 10) Serial.print("0");
- Serial.print(hour);
- Serial.print(":");
- if(minute < 10) Serial.print("0");
- Serial.print(minute);
- Serial.print(":");
- if(second < 10) Serial.print("0");
- Serial.println(second);
- Serial.println();
- printRTCTime();
- }
- boolean isLeapYear(unsigned int year) {
- return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
- }
- void printRTCTime()
- {
- tmElements_t tm;
- Serial.println("Time from RTC:");
- if (RTC.read(tm)) {
- Serial.print("Ok, Time = ");
- print2digits(tm.Hour);
- Serial.write(':');
- print2digits(tm.Minute);
- Serial.write(':');
- print2digits(tm.Second);
- Serial.print(", Date (D/M/Y) = ");
- Serial.print(tm.Day);
- Serial.write('/');
- Serial.print(tm.Month);
- Serial.write('/');
- Serial.print(tmYearToCalendar(tm.Year));
- Serial.println();
- }
- else {
- if (RTC.chipPresent()) {
- Serial.println("The DS1307 is stopped. Please run the SetTime");
- Serial.println("example to initialize the time and begin running.");
- Serial.println();
- }
- else {
- Serial.println("DS1307 read error! Please check the circuitry.");
- Serial.println();
- }
- }
- }
- void print2digits(int number) {
- if (number >= 0 && number < 10) {
- Serial.write('0');
- }
- Serial.print(number);
- }
复制代码
刷好DS3231后顺带把1307的时间也更新了,坑爹的模块没有排针,偶用面包线用手指按在那4个洞洞里刷的 =,=
顺带请假,1307自带的那个锂电池可以充电的话,应该怎么充?。。。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|