如何向Arduino添加实时时钟

电子说

1.3w人已加入

描述

保持Arduino项目的时间并不像您想的那么容易:一旦计算机连接不存在,您没电的Arduino就会停止运行,包括内部代码。

在为了使Arduino与周围世界保持同步,您将需要所谓的“实时时钟模块”。

实时时钟(RTC)的意义是什么?

您的计算机最有可能与互联网同步时间,但它的内部时钟仍然可以即使没有互联网连接或电源关闭也能继续工作。当您使用Arduino插入计算机时,它可以访问系统时钟提供的准确时间。这非常有用,但是大多数Arduino项目都设计为不在计算机上使用–到那时,无论何时拔掉电源或Arduino重新启动,它绝对不知道现在几点。内部时钟将被重置,并在下一次启动时从零开始重新计数。

如果您的项目与需要时间有关,例如我的夜灯和日出闹钟,那么这很明显成为一个问题。在该项目中,我们通过以一种相当粗略的方式手动设置每晚的时间来解决该问题-用户在上床睡觉之前将按下重置按钮,从而提供了手动时间同步。显然,这不是一个理想的长期解决方案。

RTC模块是额外的电路,需要一块小的纽扣电池,即使关闭Arduino,它也可以继续计时。设置一次–它将使电池的寿命(通常是一年左右)有效。

TinyRTC

Arduino最受欢迎的RTC称为TinyRTC,可以购买在eBay上大约需要5至10美元。您最有可能需要提供自己的电池(将这些电池运到国外很多地方是违法的)和一些接头(插入孔中的销,您需要自己焊接在这些孔中)。

这是我拥有的模块:

它甚至具有内置的温度传感器,但是如果您使用以下电池,则电池可以使用更长的时间不使用它。

在那个东西上的孔的数量看起来很吓人,但是您只需要四个即可。 GND,VCC,SCL和SDA –您可以使用RTC模块两侧的相关引脚。您使用I2C协议与时钟对话,这意味着仅使用了两个引脚-一个用于“时钟”(串行通信数据时钟,与时间无关),另一个用于数据。实际上,您甚至可以在相同的两个引脚上链接多达121个I2C设备-请访问Adafruit页面以选择可以添加的其他I2C设备,因为还有很多!

入门 strong》

根据下图连接TinyRTC模块–不需要粉红色的DS线,因为它是用于温度传感器的。

时钟

下一步,下载Time和DS1307RTC库,并将生成的文件夹放在您的/libraries 文件夹中。

退出并重新启动Arduino环境以加载到库和示例中。

时钟

您将在DS1307RTC菜单中找到两个示例:首先上传并运行 SetTime 示例-这会将RTC设置为正确的时间。实际的代码不值得详细介绍,只是知道您需要运行一次才能执行初始时间同步。

接下来,请使用 ReadTest 查看示例用法

#include

#include

#include

void setup() {

Serial.begin(9600);

while (!Serial) ; // wait for serial

delay(200);

Serial.println(“DS1307RTC Read Test”);

Serial.println(“-------------------”);

}

void loop() {

tmElements_t tm;

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

}

delay(9000);

}

delay(1000);

}

void print2digits(int number) {

if (number 》= 0 && number 《 10) {

Serial.write(‘0’);

}

Serial.print(number);

}

。请注意,我们还包括了核心 Wire.h 库–该库随Arduino一起提供,用于通过I2C进行通信。上载代码,以9600波特打开串口控制台,然后观察,您的Arduino将每秒输出当前时间。

该示例中最重要的代码是创建一个 tmElements_t tm –一种我们将在当前时间填充的结构;和 RTC.read(tm)函数,该函数从RTC模块获取当前时间,并将其放入我们的 tm 结构,如果一切顺利,则返回true。在该“ if”语句中添加调试或逻辑代码,例如打印时间或对其作出反应。

现在,您知道如何使用Arduino获得正确的时间,您可以尝试重写日出报警项目或创建一个LED字时钟–无限的可能性!你会做什么?

责任编辑:wv

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

全部0条评论

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

×
20
完善资料,
赚取积分