国外课栈 - 国外电子信息技术视频教程、电子书和博文栈

Arduino:使用DS1307的Arduino实时时钟

 二维码 33
发表时间:2019-01-14 21:36


在Arduino实时时钟教程中,我们将了解实时时钟(RTC)以及Arduino和实时时钟IC DS1307如何作为计时器件接口。但该项目并未涵盖实时时钟或RTC的基础知识,DS1307 RTC IC的规格以及如何将其与实时时钟模块如DS1307或DS3231与Arduino连接。


概述

RTC或实时时钟是一种计时设备,通常采用集成电路(IC)的形式。RTC由电池供电,即使没有电源也能跟踪当前时间。实时时钟IC存在于计算机,服务器和许多嵌入式系统中,实际上它们可用于需要保持准确时间的任何地方。


为什么我们需要实时时钟(RTC)?

尽管Arduino和几乎所有微控制器都有内置定时器和计时器(在Arduino的情况下为millis()),但它们依赖于电源,即只要有电源就会运行。关闭电源后(手动或由于断电),所有定时器都将重置为0。虽然使用内部定时器的计时对于简单项目是可以接受的,但我们需要在数据记录器,时钟,报警等项目中使用定时器需要独立运行,而不管外部电源或微控制器(或Arduino)是否被重新编程。这里是实时时钟IC的使用。几乎所有RTC IC都是低电流器件,可在单个锂电池上运行多年(通常为CR2032)。DS1307实时时钟是最流行和最常用的RTC IC之一。




DS1307实时时钟

DS1307 RTC是一款低成本,低功耗的实时时钟IC,可以保持完整的时钟和日历,即小时,分钟,秒以及年,月,日。下面提到了流行的DS1307 RTC的一些众所周知的功能。

完整的计时功能,即小时,分钟,秒,闰年,月份,月份日期和星期几。有效期至2100年。低功耗:使用电池供电时功耗低于500nA。电源故障时自动切换到电池供电。

带AM / PM指示的24小时或12小时时钟。DS1307 RTC作为模块提供,包括所有必要的组件,如电池,连接器,上拉电阻和晶体。在这个项目中使用了一个这样的模块,如下所示。  


DS1307 RTC引脚图

下图显示了DS1307 RTC IC的引脚图。为了降低功耗,必须减少IC上的引脚数量。因此,DS1307 RTC使用I2C通信。

DS1307 RTC的引脚说明

X1和X2:这些引脚用于连接频率为32.768 KHz的晶振,以启用内部振荡器。如果外部振荡器连接到X1,则X2可以悬空。

VBAT:电池电源引脚。必须连接到3V锂电池以备用电源。

GND:接地引脚。

SDA:串行数据引脚。它是I2C接口的数据输入/输出引脚。通常通过10KΩ电阻器需要5V的外部上拉。

SCL:串行时钟输入引脚。它是I2C接口的时钟输入引脚。它还必须通过10KΩ电阻上拉至5V。

SQW / OUT:方波输出引脚。如果不使用,它可以悬空。

VCC:主电源引脚。     


Arduino实时时钟DS1307接口

现在我们已经看到了一些关于实时时钟IC DS1307的信息,我们将继续使用Arduino和实时时钟接口。如前所述,DS1307 RTC模块使用I2C通信。在Arduino实时时钟I2C接口中,Arduino微控制器始终充当主设备,DS1307充当从设备。I2C通信中的主设备Arduino负责时钟信号,总线访问,启动和停止信号。


电路原理图

下图显示了Arduino实时时钟DS1307接口的电路图。该电路仅介绍了与DS1307模块(包含DS1307 IC以及晶振,电池和上拉电阻的电路板)的基本连接。

为了更好地了解DS1307 RTC模块,下图将为您提供帮助,因为它包含典型DS1307实时时钟模块的电路。

需要的组件

  • Arduino UNO

  • DS1307 RTC模块

  • 16×2液晶显示器

  • 面包板

  • 连接线

  • 电源


电路设计

Arduino RTC接口的设计非常简单。将DS1307 RTC的SDA和SCL引脚连接到Arduino的SDA和SCL引脚,即引脚A4和A5。连接16×2 LCD以显示数据和时间信息。根据电路图进行连接。


Arduino实时时钟DS1307接口的工作原理

这里实现了一个简单的项目,其中Arduino UNO与DS1307实时时钟接口。在这个项目中,我们将使用当前日期和时间对DS1307 RTC进行编程,看看即使Arduino的电源被移除,它是否确实保留了数据。

编程中使用了一个名为“RTClib”的特殊库,可以从链接下载。确保首先下载并添加到Arduino库数据库。

为了将数据和时间上传到DS1307 RTC IC,我们使用了RTClib库中提供的功能,Arduino将在上传代码时从计算机上传日期和时间。

代码

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib

#include <Wire.h>

#include <LiquidCrystal.h>

#include "RTClib.h"


RTC_DS1307 rtc;

LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (rs, e, d4, d5, d6, d7)


char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};


void setup ()

{

  Serial.begin(9600);

  lcd.begin(16, 2);


  if (! rtc.begin())

  {

    lcd.print("Couldn't find RTC");

    while (1);

  }


  if (! rtc.isrunning())

  {

    lcd.print("RTC is NOT running!");

  }


    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));//auto update from computer time

    //rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));// to set the time manualy


}


void loop ()

{

    DateTime now = rtc.now();


    lcd.setCursor(0, 1);

    lcd.print(now.hour());

    lcd.print(':');

    lcd.print(now.minute());

    lcd.print(':');

    lcd.print(now.second());

    lcd.print("   ");


    lcd.setCursor(0, 0);

    lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);

    lcd.print(" ,");

    lcd.print(now.day());

    lcd.print('/');

    lcd.print(now.month());

    lcd.print('/');

    lcd.print(now.year());


}



应用

借助Arduino实时时钟接口,我们可以实现与数据记录,报警,时钟等相关的多个项目。

由于RTC模块DS1307配有电池,即使在电源发生故障时也能继续保持时间。




文章分类: 平台创客Arduino
分享到:
会员登录
登录
我的资料
留言
回到顶部