Arduino实时时钟的制作图解

步骤1:关于ds 1307
简介:
除了arduino,ds1307集成电路是该项目的核心因为它充当计时器,并告知arduino什么时候应该将设备保持打开状态。 ds 1307专为计时而设计,时间相当准确,每个月大约有1分钟的错误(时间漂移)。如果您想消除这种情况,您可以选择ds3234,它的时间漂移仅为每年1分钟。对于我们的特定应用,我们可以选择ds1307本身。
ds1307的优点在于它具有备用的纽扣电池。该纽扣电池通常为cr2032。这种电池对于ic来说绰绰有余,因为ds1307的功耗非常低,因此该电池的备用电池寿命至少约为9年。
因此,现在讨论这些规格让我们谈谈交流。 ds 1307使用i²c通信与arduino通信。只需将芯片以十进制形式发送数据,使得每个十进制形式都是4位二进制数据,也称为二进制编码十进制系统。
重要引脚:
5v引脚: :当该引脚为高电平时,ds1307发送数据,为低电平时,它在备份按钮单元上运行。
gnd: 这是模块的接地引脚。电池的接地和电源都连接在一起。
scl: 这是i2c时钟引脚-与rtc通信。
sda: 这是i2c数据引脚-与rtc进行通信。
现在,介绍已经完成。让我们开始实际制作模块。该指导书包含焊接步骤以及板上组件的放置位置。希望这种方法比仅仅提供电路图更好理解。
步骤2:组装和焊接-1
因此该模块只有2 x 3 cm的尺寸,非常紧凑。该模块具有电线连接器,但您也可以使用公头或母头接头,以便将其直接插入arduino。无论如何,除了不焊接方波引脚之外,模块都具有所有功能。
制造模块:
步骤1:
将原型板切成上述尺寸,然后插入币形电池座。然后焊接底端以将电池固定在其位置。
第2步:
将dip插座插入下一步固定到晶胞支架上,但如图所示,为晶振留出了空间。焊接一些引脚以将插座固定到位。
第3步:
现在将晶体振荡器插入第一个晶体振荡器附近。 dip插座的第二个针脚,如图所示。然后如图所示进行焊接。
注意1:
此注释用于显示我的4针连接器的颜色代码仅供参考,因为您的颜色可能有所不同,请仔细检查是否已正确连接。
注2: p》
现在,我们需要使用如图所示的走线连接电池端子。这些连接提供备用电源。
步骤3:组装和焊接-2
第5步:
现在插入来自arduino的电源引脚。正引脚连接到ds 1307的第八引脚。然后,ic和纽扣单元的接地是公共的。
步骤6:
在这一步中,我们连接来自arduino的其他两个数据引脚,如图所示。很抱歉,因为我将模块做得很小,所以10k电阻没有孔。我将电阻器和导线都插入了相同的引脚,然后进行了焊接。
第7步:
因此,接下来插入电线,我们需要在两个引脚中分别插入10k电阻。两个电阻的另一端连接到ds 1307的电源引脚8。然后将导线焊接起来,以供参考。
步骤8:
由于我在此模块中使用了连接器,因此频繁使用会导致电线磨损。所以我用电阻器上的电线剪了一下。首先将电线插入一端并焊接以使其坚固。然后制作一个u形弯头,并使电线穿过该u形弯头,并拧紧u形弯头以获得良好的抓地力,然后再焊接另一端以形成接头。该图比文字更能说明该方法。
该模块最终完成,因此将电池和ds1307 ic都插入其插槽中。最终图显示了完整完整的模块。
步骤4:检查和设置模块
组装完模块后。将模块连接到arduino,以便将引脚正确插入arduino。下面给出了测试模块的程序。代码会不断通过串行端口更新时间。
为了运行模块,我们需要两个库,而在arduino软件中则需要两个库。以下步骤使用所需的库和代码来设置arduino软件。
导入库:
下载库“ realtimeclockds1307 ”并将其保存在桌面中。
打开arduino,然后转到素描 =》 导入库 =》 添加库。
然后选择保存在桌面中的库,然后单击添加。
现在粘贴下面给出的示例代码,然后点击编译。如果编译成功,则跳过其余步骤。
如果没有导入第二个库“ wire ”,重复相同的过程并编译代码,它将起作用。
代码正常工作:
代码是由“ david h. brown”编写的,我只是用它来给你ds1307的简介。无论如何,arduino与rtc模块通信并通过 serial monitor 每秒更新一次时间。创建者为我们提供了一个选项,用于设置发送命令“ ?”的时间。出现以下菜单。
try these:
h## - set hours [range 1..12 or 0..24]
i## - set minutes [range 0..59]
s## - set seconds [range 0..59]
d## - set date [range 1..31]
m## - set month [range 1..12]
y## - set year [range 0..99]
w## - set arbitrary day of week [range 1..7]
t - toggle 24-hour mode
a - set am p - set pm
z - start clock z - stop clock
q - sqw/out = 1hz q - stop sqw/out
该代码将帮助您设置时间以及检查模块的备用电池供电是否正常。在下一个教程中,我将向您展示如何设置lcd显示器并显示rtc模块中的时间。这是用于测试模块及其附件的代码。
#include
#include
//realtimeclock rtc;//=new realtimeclock();
#define display_clock_every_n_seconds 10 // n.secs to show date/time
#define display_shorthelp_every_n_seconds 60 // n.secs to show hint for help
//#define test_squarewave
//#define test_stopstart
//#define test_1224switch
int count=0;
char formatted[] = “00-00-00 00:00:00x”;
void setup() {
// wire.begin();
serial.begin(9600);
pinmode(a3, output); //*** pin 16 (analog pin 2) as output ***
digitalwrite(a3, high); //*** pin 16 (analog pin 2) set to low ***
pinmode(a2, output); //*** pin 17 (analog pin 3) as output ***
digitalwrite(a2, low); //*** pin 17 (analog pin 3) set to high ***
//*** analog pin settings to power rtc module ***
}
void loop() {
if(serial.available())
{
processcommand();
}
rtc.readclock();
count++;
if(count % display_clock_every_n_seconds == 0){
serial.print(count);
serial.print(“: ”);
rtc.getformatted(formatted);
serial.print(formatted);
serial.println();
}
if(count % display_shorthelp_every_n_seconds == 0) {
serial.println(“send ? for a list of commands.”);
}
#ifdef test_squarewave
if(count%10 == 0)
{
switch(count/10 % 6)
{
case 0:
serial.print(“squarewave disabled (low impedance): ”);
rtc.sqwdisable(0);
serial.println((int) rtc.readdata(7));
break;
case 1:
serial.print(“squarewave disabled (high impedance): ”);
rtc.sqwdisable(1);
serial.println((int) rtc.readdata(7));
break;
case 2:
serial.println(“squarewave enabled at 1 hz”);
rtc.sqwenable(rtc.sqw_1hz);
break;
case 3:
serial.println(“squarewave enabled at 4.096 khz”);
rtc.sqwenable(rtc.sqw_4khz);
break;
case 4:
serial.println(“squarewave enabled at 8.192 khz”);
rtc.sqwenable(rtc.sqw_8khz);
break;
case 5:
serial.println(“squarewave enabled at 32.768 khz”);
rtc.sqwenable(rtc.sqw_32khz);
break;
default:
serial.println(“squarewave test not defined”);
}//switch
}
#endif
#ifdef test_stopstart
if(count%10 == 0)
{
if(!rtc.isstopped())
{
if(rtc.getseconds() 《 45)
{
serial.println(“stopping clock for 10 seconds”);
rtc.stop();
}//if we have enough time
} else {
rtc.setseconds(rtc.getseconds()+11);
rtc.start();
serial.println(“adding 11 seconds and restarting clock”);
}
}//if on a multiple of 10 counts
#endif
#ifdef test_1224switch
if(count%10 == 0)
{
if(count %20 == 0)
{
serial.println(“switching to 12-hour time”);
rtc.switchto12h();
rtc.setclock();
}
else
{
serial.println(“switching to 24-hour time”);
rtc.switchto24h();
rtc.setclock();
}
}
#endif
}
void processcommand() {
if(!serial.available()) { return; }
char command = serial.read();
int in,in2;
switch(command)
{
case ‘h’:
case ‘h’:
in=serialreadposint();
rtc.sethours(in);
rtc.setclock();
serial.print(“setting hours to ”);
serial.println(in);
break;
case ‘i’:
case ‘i’:
in=serialreadposint();
rtc.setminutes(in);
rtc.setclock();
serial.print(“setting minutes to ”);
serial.println(in);
break;
case ‘s’:
case ‘s’:
in=serialreadposint();
rtc.setseconds(in);
rtc.setclock();
serial.print(“setting seconds to ”);
serial.println(in);
break;
case ‘y’:
case ‘y’:
in=serialreadposint();
rtc.setyear(in);
rtc.setclock();
serial.print(“setting year to ”);
serial.println(in);
break;
case ‘m’:
case ‘m’:
in=serialreadposint();
rtc.setmonth(in);
rtc.setclock();
serial.print(“setting month to ”);
serial.println(in);
break;
case ‘d’:
case ‘d’:
in=serialreadposint();
rtc.setdate(in);
rtc.setclock();
serial.print(“setting date to ”);
serial.println(in);
break;
case ‘w’:
serial.print(“day of week is ”);
serial.println((int) rtc.getdayofweek());
break;
case ‘w’:
in=serialreadposint();
rtc.setdayofweek(in);
rtc.setclock();
serial.print(“setting day of week to ”);
serial.println(in);
break;
case ‘t’:
case ‘t’:
if(rtc.is12hour()) {
rtc.switchto24h();
serial.println(“switching to 24-hour clock.”);
} else {
rtc.switchto12h();
serial.println(“switching to 12-hour clock.”);
}
rtc.setclock();
break;
case ‘a’:
case ‘a’:
if(rtc.is12hour()) {
rtc.setam();
rtc.setclock();
serial.println(“set am.”);
} else {
serial.println(“(set hours only in 24-hour mode.)”);
}
break;
case ‘p’:
case ‘p’:
if(rtc.is12hour()) {
rtc.setpm();
rtc.setclock();
serial.println(“set pm.”);
} else {
serial.println(“(set hours only in 24-hour mode.)”);
}
break;
case ‘q’:
rtc.sqwenable(rtc.sqw_1hz);
serial.println(“square wave output set to 1hz”);
break;
case ‘q’:
rtc.sqwdisable(0);
serial.println(“square wave output disabled (low)”);
break;
case ‘z’:
rtc.start();
serial.println(“clock oscillator started.”);
break;
case ‘z’:
rtc.stop();
serial.println(“clock oscillator stopped.”);
break;
case ‘》’:
in=serialreadposint();
in2=serialreadposint();
rtc.writedata(in, in2);
serial.print(“write to register ”);
serial.print(in);
serial.print(“ the value ”);
serial.println(in2);
break;
case ‘《’:
in=serialreadposint();
in2=rtc.readdata(in);
serial.print(“read from register ”);
serial.print(in);
serial.print(“ the value ”);
serial.println(in2);
break;
default:
serial.println(“unknown command. try these:”);
serial.println(“ h## - set hours [range 1..12 or 0..24]”);
serial.println(“ i## - set minutes [range 0..59]”);
serial.println(“ s## - set seconds [range 0..59]”);
serial.println(“ d## - set date [range 1..31]”);
serial.println(“ m## - set month [range 1..12]”);
serial.println(“ y## - set year [range 0..99]”);
serial.println(“ w## - set arbitrary day of week [range 1..7]”);
serial.println(“ t - toggle 24-hour mode”);
serial.println(“ a - set am p - set pm”);
serial.println();
serial.println(“ z - start clock z - stop clock”);
serial.println(“ q - sqw/out = 1hz q - stop sqw/out”);
serial.println();
serial.println(“ 》##,### - write to register ## the value ###”);
serial.println(“ 《## - read the value in register ##”);
}//switch on command
}
//read in numeric characters until something else
//or no more data is available on serial.
int serialreadposint() {
int i = 0;
boolean done=false;
while(serial.available() && !done)
{
char c = serial.read();
if (c 》= ‘0’ && c 《=‘9’)
{
i = i * 10 + (c-‘0’);
}
else
{
done = true;
}
}
return i;
}
步骤5:关于库
开始之前在液晶显示屏上显示时间。我想讨论一下我们导入的库。我省略了需要方波数据的库,因为该模块没有方波输出引脚。让我们通过一些示例来讨论该库中涉及的各种关键字。
关键字:
起始时钟:
rtc.start();
此时钟可用于启动时钟,它将从停止时开始计时。首次使用该模块以启动模块时,应使用此命令。
停止时钟:
rtc.stop();
使用此行,可以暂停该模块,并且在给出启动命令之前,时钟不会计时。它与开始时钟命令一起使用以控制模块的状态。
读取时钟:
rtc.readclock();
使用“开始”命令打开时钟后。您需要从rtc模块读取数据。这是通过readclock函数完成的。在使用后面的命令之前,此功能必不可少。
读取时间:
//integers for holding the various time values.
int hours = 0;
int minutes = 0;
int seconds = 0;
int dates = 0;
int months = 0;
int years = 0;
int date = 0;
//syntax for setting the values to the integers
rtc.readclock(); //this line is essential for the other commands to work.
//commands for getting the individual time values.
hours = rtc.gethours();
minutes = rtc.getminutes();
seconds = rtc.getseconds();
dates = rtc.getdate();
months = rtc.getmonth();
years = rtc.getyear();
date = rtc.getdayofweek();
//finally just print the stored data (refer next step)。
因此一旦readclock被调用。接下来,我们需要将各个值存储为整数。我们创建整数来保存值。 getdayofweek函数提供星期几。第一天为星期一,最后一天为星期日。请注意,与前面步骤中的代码相比,此方法效率很低,但这将有助于您了解库中各种功能的工作。
注意:
//extra code for finding out whether its am or pm when the clock is in 12h mode.
//declare an integer and string.
int ap = 0;
string tz;
//then read the data from the module.
ampm = rtc.ispm();
//use an if loop to find out whether its am or pm.
if(ampm == 1)
{
am = “pm”;
}
else
{
am =“am”;
}
此额外的代码行将在12小时模式下显示其上午还是下午。当您将其设置为24小时制时,请删除此代码。
写时间:
rtc.sethours(4);
rtc.setminutes(35);
rtc.setseconds(14);
rtc.setdate(9);
rtc.setmonth(6);
rtc.setyear(14);
rtc.set24h();
//rtc.setam();
rtc.setpm();
rtc.setdayofweek(1);
因此,这些是用于设置模块时间的命令。如您所见,我已经设置了 4:35:14 pm 的时间,日期为 9/6/14 。除了这些命令外,还有set24h命令,直接将时钟设置为24小时模式,并将am和pm设置为12小时模式。 setdayofweek用于设置日期。
时间命令:
//these commands deal with the settings in the module.
//checks whether the clock is running.
rtc.isstopped();
//check whether it is am or pm depending on the output(given above)。
rtc.ispm();
//checks whether the clock is in 24hour mode.
rtc.is12hour();
//toggles between the 12hour mode and 24hour mode.
rtc.switchto24h();
以下是这些命令:控制时钟内的设置。
我已经尽我所能解释了这个库。如果发现任何缺陷或我错过的东西,请对其进行评论,以使其尽可能准确。
步骤6:显示时间(简单方法)
现在检查了模块,现在让我们开始获取要在lcd上显示的时间数据。 lcd模块可以轻松连接到arduino。显示了用于连接lcd模块的电路图。下面显示了用于显示时间的代码。
在我制作了此代码的两个版本之前。其中一个将普通lcd连接到arduino。这是最简单的版本,但是它将占用arduino中的大多数引脚。因此,我想出了一个替代方案,使用移位寄存器仅使用2个引脚将数据发送到lcd模块。因此,您可以选择更方便的方式。
普通版:
更多的引脚,但是更简单!
因此,如面包板图所示,连接lcd。然后将代码上传到arduino,日期和时间将显示在lcd显示屏中。因此,这是代码。
代码:
#include
#include
#include
liquidcrystal lcd(12, 11, 5, 4, 3, 2);
#define display_clock_every_n_seconds 10
#define display_shorthelp_every_n_seconds 60
string tz;
int hours = 0;
int minutes = 0;
int seconds = 0;
int dates = 0;
int months = 0;
int years = 0;
int ap = 0;
void setup() {
serial.begin(9600);
lcd.begin(16,2);
pinmode(a3, output);
digitalwrite(a3, high);
pinmode(a2, output);
digitalwrite(a2, low);
}
void loop() {
rtc.readclock();
if(ap == 1)
{
tz = “pm”;
}
else
{
tz =“am”;
}
lcd.home();
hours = rtc.gethours();
minutes = rtc.getminutes();
seconds = rtc.getseconds();
ap = rtc.ispm();
dates = rtc.getdate();
months = rtc.getmonth();
years = rtc.getyear();
lcd.print(hours);
lcd.print(“:”);
lcd.print(minutes);
lcd.print(“:”);
lcd.print(seconds);
lcd.print(“ ”);
lcd.print(tz);
lcd.setcursor(0, 1);
lcd.print(dates);
lcd.print(“:”);
lcd.print(months);
lcd.print(“:”);
lcd.print(years);
delay(250);
lcd.clear();
lcd.home();
lcd.print(hours);
lcd.print(“ ”);
lcd.print(minutes);
lcd.print(“ ”);
lcd.print(seconds);
lcd.print(“ ”);
lcd.print(tz);
lcd.setcursor(0, 1);
lcd.print(dates);
lcd.print(“ ”);
lcd.print(months);
lcd.print(“ ”);
lcd.print(years);
delay(250);
lcd.clear();
}
在连接rtc模块并上传代码后。液晶显示屏将在顶部显示时间,在底部显示日期。此版本对于学习基本命令很有用,并允许您在将来的项目中使用这些命令。
步骤7:显示时间(移位寄存器版本)
移位寄存器lcd版本:
此版本使用的移位寄存器模块仅使用两个就可以将数据发送到lcd引脚而不是六个引脚。可以购买此模块,但我想制造它。即将发布的链接中提供了制作模块的完整说明!因此,只需将arduino的两个引脚连接到模块,然后上传下面给出的代码,就可以像在简单版本中一样观察到相同的输出。
code:
#include
#include
#include
liquidcrystal_sr lcd(8,7,two_wire);
#define display_clock_every_n_seconds 10
#define display_shorthelp_every_n_seconds 60
string tz;
int hours = 0;
int minutes = 0;
int seconds = 0;
int dates = 0;
int months = 0;
int years = 0;
int ap = 0;
void setup() {
// wire.begin();
serial.begin(9600);
lcd.begin(16,2);
pinmode(a3, output);
digitalwrite(a3, high);
pinmode(a2, output);
digitalwrite(a2, low);
}
void loop() {
rtc.readclock();
ap = rtc.ispm();
if(ap == 1)
{
tz = “pm”;
}
else
{
tz =“am”;
}
lcd.home();
hours = rtc.gethours();
minutes = rtc.getminutes();
seconds = rtc.getseconds();
dates = rtc.getdate();
months = rtc.getmonth();
years = rtc.getyear();
lcd.print(hours);
lcd.print(“:”);
lcd.print(minutes);
lcd.print(“:”);
lcd.print(seconds);
lcd.print(“ ”);
lcd.print(tz);
lcd.setcursor(0, 1);
lcd.print(dates);
lcd.print(“:”);
lcd.print(months);
lcd.print(“:”);
lcd.print(years);
delay(250);
lcd.clear();
lcd.home();
lcd.print(hours);
lcd.print(“ ”);
lcd.print(minutes);
lcd.print(“ ”);
lcd.print(seconds);
lcd.print(“ ”);
lcd.print(tz);
lcd.setcursor(0, 1);
lcd.print(dates);
lcd.print(“ ”);
lcd.print(months);
lcd.print(“ ”);
lcd.print(years);
delay(250);
lcd.clear();
}
如果您已经有了此模块,则第二个代码使用另一个库,请使用该库使上面的代码正常工作。

一维大行程抗震动压电纳米定位台的特性是什么
IP地址相关知识的深入了解
针对数据中心工作负载的第二代至强可扩展芯片阵容的18-SKU更新
光栅尺替代方案:磁栅尺读数头丨磁栅丨磁读头
锂离子电池可能终于实现了它的“承诺”
Arduino实时时钟的制作图解
宜简苏打水3D产品建模三维可视化模型线上全景展示
霍尼韦尔新品斩获国际物联网展金奖 赋能精益智造转型
中国燃气轮机场发展潜力大,仍存在被“卡脖子”的风险
编码器的6种常见问题
51单片机“积木式”实验板的制作
美国向苹果发出的国家安全相关数据索取要求再次急剧增长
采用Quartus II软件和EP2C5芯片实现新型位同步提取电路的设计
物联网在医疗上实施经常遇到什么障碍
浅析锂电池保护板(BMS)系统设计思路(二)SOC算法
测试测量的接线细节,接线方式与电路接线
基于P89C591控制器实现实现变电站远程控制系统的设计
安防行业在2018年的十大关键词回顾
没有绝对的市场红利 车企必须要学会适应市场变化
民众如何抓住互联网的下一波红利