Arduino 可以不连接其他硬件使用时钟和日期功能,这是使用了 Arduino 板子自带的晶振,再配合上Arduino的Time函数库,这可以精确到每天只有几秒的误差。但是这样做有一个弊端,就是当你断开了Arduino的电源时,因为Arduino并没有电池,所以无法将时间保存起来,每次执行时,都会从程序设定的时间开始,所以为了时间的准确,必须每次自行设定时间。RTC时钟模块可以解决这个问题, 它使用DS1307作为时钟芯片, 时钟频率为32.768Khz,IIC接口设计,节约Arduino控制器引脚,只需要占用两个控制器的数据引脚就可以控制,RTC Module可安装一个3V CR1220纽扣电池,当Arduino断电后,RTC模块还保持供电,可以继续记录时间,这样就不需要每次校对时间。
接下来我们就开始制作电子时钟
首先,准备要使用到的硬件
* Carduino UNO R3 控制器 * 1个
* 传感器扩展板 V5.0 * 1个
* USB 数据下载线 * 1 条
* RTC Module 模块 * 1 个
* 四位七段数码管模块 * 1 个
* 传感器连接线 * 若干
如下图所示,连接所有的硬件设备,传感器与传感器扩展板V5.0连接非常方便,只需要使用杜邦线连接相应引脚即可,传感器扩展板使用了防呆设计,信号S、电源正、电源负,分别使用黄色、红色、黑色排针区分开。
硬件连接无误情况下,我们就可以给控制器上传程序,程序如下所示,程序中会用到函数库,是你在编译和上传程序之前必须要安装的,否则会出现编译出错的情况,程序源文件及程序代码可以从文章底部的链接中下载。
#include <TimerOne.h>
#include "TM1637.h"
#include <Wire.h>
#include "RTClib.h"
#define ON 1
#define OFF 0
#if defined(ARDUINO_ARCH_SAMD)
#define Serial SerialUSB
#endif
RTC_DS1307 rtc;
int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};
unsigned char ClockPoint = 1;
unsigned char Update;
unsigned char minute = 0;
unsigned char hour = 12;
int stem,val;
#define CLK 5
#define DIO 4
TM1637 tm1637(CLK,DIO);
void setup()
{
tm1637.set();
tm1637.init();
Timer1.initialize(500000);
Timer1.attachInterrupt(TimingISR);
#ifndef ESP8266
while (!Serial);
#endif
Serial.begin(57600);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (! rtc.isrunning()) {
Serial.println("RTC is running!");
rtc.adjust(DateTime(2016, 7, 27, 11,16, 00)); // 设置初始时间和日期
}
}
void loop()
{
DateTime now = rtc.now();
if(Update == ON)
{
TimeUpdate();
tm1637.display(TimeDisp);
}
stem = now.hour();
val = now.minute();
}
void TimingISR()
{
ClockPoint = (~ClockPoint) & 0x01;
Update = ON;
}
void TimeUpdate(void)
{
if(ClockPoint)tm1637.point(POINT_ON);
else tm1637.point(POINT_OFF);
TimeDisp[0] = stem/ 10;
TimeDisp[1] = stem % 10;
TimeDisp[2] = val / 10;
TimeDisp[3] = val % 10;
}
注意:通过修改时间和日期可以设置模块的初始状态,如果给模块安装上3V电池,模块在断电后就会继续计时,下次再通电使用时,显示的会是正确的系统时间,无需再次初始化。
程序效果
如图所示,为程序上传后的效果,数码管会显示当前时间,图中所示时间为11时16分
总结
虽然Arduino是有时钟功能的,但是断电不能保存,RTC模块完美解决了这个问题,本实验中,使用了4位数码管显示,所以不能将现在是多少秒,或者现在的日期显示出来,我们可以换用 SPI 8位数码管显示模块,再制作一个精美的外壳,就可以制作属于自己的电子时钟了,快来试一下吧。、
注意此程序需要使用到的库文件,大家可以点击此处,进入奥松机器人官方技术论坛进行下载。
----------------------------------------------------------------------------------------------------------------
奥松机器人官网:www.robotbase.cn
微信号:搜索公众号“奥松机器人”
QQ群: 271230889(讨论,解惑)
微博:@奥松机器人基地
----------------------------------------------------------------------------------------------------------------
温馨提示:予人玫瑰,手留余香;如果你喜欢这篇文章,不妨转发推荐给你身边的朋友!
近期新闻
热门新闻
奥松智能微信