首页

Arduino实时时钟教程使用DS1307

在Arduino实时时钟教程中,我们将学习实时时钟(RTC),以及Arduino和实时时钟IC DS1307如何作为一个计时设备接口。如果您还记得,我们已经在早期的项目中使用RTC DS1307实现了Arduino闹钟。

但该项目没有涵盖实时时钟或RTC的基础知识、DS1307 RTC IC的规范以及如何将实时时钟(如DS1307或DS3231)与Arduino连接。

(adsense1)

概述

RTC或实时时钟是一种计时设备,通常采用集成电路(IC)的形式。RTC由电池供电,即使在没有电的情况下也能记录当前时间。

实时时钟集成电路出现在计算机、服务器和许多嵌入式系统中,事实上,它们被用于任何需要保持精确时间的地方。

还读:ARDUINO闹钟

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

尽管Arduino和几乎所有的微控制器都有内置的计时器和计时器(在Arduino情况下是millis()),但它们都依赖于电源,即只要有电源,它们就会运行。一旦电源被关闭(手动或由于停电),所有计时器重置为0。

虽然在简单的项目中使用内部计时器计时是可以接受的,但在数据记录器、时钟、闹钟等项目中,我们需要一种替代方案,在这些项目中,计时器独立运行,而不受外部电源的影响,或者如果微控制器(或Arduino)重新编程。

这就是实时时钟ic的使用。几乎所有的RTC ic都是使用单个锂电池(通常是CR2032)运行数年的低电流器件。其中最流行和最常用的RTC ic是DS1307实时时钟。

DS1307实时时钟

DS1307 RTC是一种低成本、低功耗的实时时钟IC,可以保持完整的时钟和日历,即小时、分、秒以及年、月和日。下面将介绍流行的DS1307 RTC的一些众所周知的特性。

  • 完整的计时功能,即小时,分钟,秒,年与闰年,月,月的日期和一周的一天。
  • 有效期到2100年。
  • 低功耗:电池供电时功耗小于500nA。
  • 在停电的情况下,自动切换到电池供应。
  • 24小时或12小时时钟,带有AM/PM指示灯。

DS1307 RTC可作为模块,它包括所有必要的组件,如电池,连接器,上拉电阻和晶体。本项目中使用了一个这样的模块,如下所示。

Arduino Real Time Clock DS1307教程图片

RTC引脚图

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

Arduino Real Time Clock DS1307教程图片

DS1307 RTC引脚描述

  • X1和X2:这些是连接32.768 KHz频率的晶体的引脚,以启用内部振荡器。如果一个外部振荡器连接到X1,那么X2可以保持浮动状态。
  • VBAT:电池供电引脚。必须连接到3V锂电池作为备用电源。
  • 接地:地面销。
  • SDA:串行数据引脚。它是I2C接口的数据输入输出引脚。需要一个5V的外部拉升,通常通过10KΩ电阻。
  • sci:串行时钟输入引脚。是I2C接口的时钟输入引脚。它还必须通过10KΩ电阻拉到5V。
  • SQW /出:方波输出引脚。如果不使用,可以让它浮动。
  • VCC:主电源插脚。

Arduino实时时钟DS1307接口

现在我们已经了解了一点实时时钟IC DS1307,我们将继续Arduino和实时时钟的接口。如前所述,DS1307 RTC模块使用I2C通信。

在Arduino Real Time Clock I2C接口中,Arduino微控制器始终充当主控制器,DS1307充当从控制器。I2C通信中的主控器,即本例中的Arduino,负责时钟信号、总线访问、启动和停止信号。

线路图

下图是Arduino Real Time Clock DS1307接口的电路图。此电路解释了DS1307模块(包含DS1307 IC以及晶体、电池和上拉电阻的板)的基本连接。

Arduino实时时钟DS1307教程电路3

为了更好地理解DS1307 RTC模块,下面的图像将帮助你,因为它包含了一个典型的DS1307实时时钟模块的电路。

Arduino Real Time Clock DS1307教程电路2

组件的要求

  • Arduino UNO [在这里买
  • DS1307 RTC模块
  • 16×2液晶显示器[在这里买
  • 电路试验板
  • 连接电线
  • 电力供应

电路设计

Arduino RTC接口的设计非常简单。将DS1307 RTC的SDA和SCL引脚连接到Arduino的SDA和SCL引脚上,即引脚A4和A5。

连接一个16×2 LCD来显示数据和时间信息。按电路图连接。

(adsense2)

Arduino实时时钟DS1307接口的工作

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

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

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

代码

应用程序

  • 借助Arduino Real Time Clock接口,我们可以实现多个与数据日志、闹钟、时钟等相关的项目。
  • 由于RTC模块DS1307是由电池支持,它将继续保持时间,即使在电源故障的情况下。

28岁的反应

  1. 你从“开始下载查看Pdf”按钮上赚钱了吗?我不想再使用另一款带有主页等内容的应用。

    关于DS1307 RTC的文章说我可以下载RCTLIB,这是需要的,但没有地方可以找到这个库来下载。我把你的文章放到我的图片分享板上时可没想到会是这样。到目前为止,我对这个网站印象不太好。

  2. 我想做一个设备,我需要自动开和关闭在预定的时间。请帮助我如何使它使用RTC芯片。

  3. 你好,

    程序正在编译和上传,但我仍然没有显示什么;只有一排方块。
    你能帮忙吗?
    谢谢你!

    1. 是的,我也有过。在库中,相关类已被重命名。

      将“RTS_DS1307”替换为“DS1307”,它应该可以正常编译。

  4. 从arduino中移除电源后,时间不正确。它显示了我过去的时间,当我上传的程序每次。ie。断电后显示的电源不正确。有什么问题吗?

    1. 嗨,安萨里

      希望这有助于
      我使用带有Arduino pro mini 3.3v的RTC_DS1307,有同样的问题,编程Arduino后时间是正确的,但当电源丢失和恢复时,RTC时间返回到最后一个程序上传的时间。
      我所做的:
      再次上传程序设置RTC时间为当前时间
      然后在电源打开的情况下拔掉连接RTC的I2C电线
      更改程序,使时间不再更新如下
      //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)))
      然后上传没有设置时间的新程序
      然后从项目中移除电源
      然后正确连接I2C线从arduino到RTC
      然后是电力项目

      这一过程应该在RTC中安装完整的面糊,并在将来丢失日期时重复进行

  5. 嗨,拉维,在连接面包板上的所有东西,并加载草图后,发生了什么,我只看到一行块(正方形)。
    我确实检查了很多时间的电线连接,更换了LCD 1602A,但什么都没有:没有时间在所有....

    是不是有什么东西我忘了?;;;;;;;


    圭多

  6. 大家好,非常感谢

    工作好。但有一个问题,以秒为单位的部分显示在01-10日。

    例如,11:12:04是正确的格式,但显示为11:12:49

    请给出解决方案

  7. 代码/程序是如何或什么启动的,因为我得到了代码验证并编译到我的板上,但我不确定如何启动它

  8. 这是我运行伺服电机的代码。但是我没有得到输出。
    谁能帮我解决这个问题?

    # include
    # include“RTClib.h”
    # include

    int servoPin = 11;
    伺服伺服;
    Int角= 0;
    int小时;
    int最小;
    int交会;
    RTC_DS1307 rtc;

    char daysOfTheWeek[7][12] ={"星期天","星期一","星期二","星期三","星期四","星期五","星期六"};

    无效的设置()

    Serial.begin (9600);
    延迟(3000);//等待控制台打开
    servo.attach (servoPin);
    如果(!rtc.begin ())

    系列。println(“找不到RTC”);
    (1);

    如果(! rtc.isrunning ())

    系列。println(" RTC失去电源,让我们设置时间! ");

    //一旦你设置了日期和时间,注释掉下面的行。
    //以下行设置RTC为草图编译的日期和时间
    清债信托公司。调整(DateTime(2021、2、6、8,59岁,00));

    //以下行设置带有显式日期和时间的RTC
    //例如,将2017年1月27日设置为12:56,你可以调用:
    / /清债信托公司。adjust(DateTime(2017,1,27,12,56,0));

    无效循环()

    DateTime now = rtc.now();

    系列。println("当前日期和时间:");
    并同时now.year()、12月);
    并同时(“/”);
    并同时now.month()、12月);
    并同时(“/”);
    并同时日期()、12月);
    系列。打印(“(”);
    并同时daysOfTheWeek [now.dayOfTheWeek ()));
    并同时”)”);
    并同时now.hour()、12月);
    并同时(“:”);
    并同时now.minute()、12月);
    并同时(“:”);
    并同时now.second()、12月);
    以();

    小时= now.hour ();
    Min = now.minute ();
    秒= now.second ();

    如果((小时= = 9 & &分= = 0 & &秒= = 2)| |(21小时= = & &分= = 0 & &秒= = 2))


    系列。println(“伺服电机正在运行”);
    //从0到180度扫描
    (角= 0;角0;角)

    servo.write(角);
    延迟(15);


    延迟(10000);

留下一个回复

您的电邮地址将不会公布。

Electronicshub图标
Baidu
map