Arduino实时时钟的制作图解

电子说

1.3w人已加入

描述

步骤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();

}

如果您已经有了此模块,则第二个代码使用另一个库,请使用该库使上面的代码正常工作。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分