如何以及为什么向Arduino添加实时时钟

在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设备,因为还有很多!

入门

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

下一步,下载Time和DS1307RTC库并将其放置您的 / libraries 文件夹中的结果文件夹。

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

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

#include <DS1307RTC.h>#include <Time.h>#include <Wire.h>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字时钟–无限的可能性!你会做什么?

标签: