【DS3231 RTC实时时钟模块与Arduino接口构建数字时钟】

前言

在当今世界,时间就是一切,而对于特定的电子产品,时间至关重要;就像我们人类一样,他们也需要一种方法来记录时间。那么电子产品是如何做到的呢?答案是 DS3231,一种实时时钟,通常称为 RTC,是一种内置于集成电路或 IC 中的计时设备。它用于许多对时间要求严格的应用程序和设备,例如服务器、GPS 和数据记录器。让我们看看是什么让它滴答作响。

DS3231 RTC模块介绍

DS3231 是一款 I2C 实时时钟 (RTC),具有内置温度补偿晶体振荡器 (TCXO) 和低成本且异常精确的晶体。当模块的电源中断时,设备有电池输入并保持精确的时间。该器件的长期精度因包含晶体振荡器而得到提高。RTC 跟踪秒、分钟、小时、天、日期、月和年。对于少于 31 天的月份,月末日期会自动修改,包括闰年更正。时钟具有 AM/PM 指示,可在 24 小时或 12 小时模式下工作。包括两个可编程的时间警报,以及一个可编程的方波输出。I2C 双向总线用于串行传输地址和数据。

DS3231 模块引脚排列

DS3231 模块有 6 个引脚,用于从模块获取数据并为电路板供电。DS3231的引脚排列如下:
在这里插入图片描述在这里插入图片描述当我们使用示波器探测 DS3231 模块的 32k 引脚时,我们会从 IC 的内部振荡器获得 32kHz 信号。

在这里插入图片描述

DS3231 模块组成

典型 DS3231 RTC 模块板的关键组件是 DS3231 IC 和 AT24C32 EEPROM IC,用于存储时间和日期数据。其他组件包括电源开启 LED、一些电阻器、电容器、电池座和用于连接到微控制器的引脚。
在这里插入图片描述当模块的主电源停止时,DS3231 包含电池输入并保持准确的时间。内置电源检测电路不断检查 VCC 的状态,以识别断电并自动切换到备用电源。因此,即使断电,您的 MCU 仍然能够保持时间跟踪。DS3231 RTC 模块上有一个 CR2032 电池座。用于 20 毫米 3V 锂纽扣电池的电池座位于电路板的底部。任何 CR2032 电池都可以使用。

充电能力:

该模块的设计方式是,当外部供电时,它可以为安装在模块上的电池充电。但是使用不可充电的 CR2032 电池时必须小心,因为模块也会为电池充电。CR2032 是不可充电的 3V 电池,但可充电电池可充电至 4.2V。要阻止模块对 CR2032 不可充电电池充电,应拆焊 U4(220R) 电阻或 D1 (1N4148) 二极管。

关于 DS3231 的常见问题

问:DS1307 和 DS3231 有什么区别?

DS3231 和 DS1370 之间最显着的区别在于计时精度。为了计时,DS1307 有一个外部 32kHz 晶体振荡器,而 DS3231 有一个内部振荡器。

问:DS3231 的精度如何?

DS3231 和 DS3234 中的温度补偿晶体振荡器 (TCXO) 符合要求,在 0°C 至 +40°C 的温度范围内精度高达 ±2 ppm。

问:DS3231 使用什么电池?

DS3231 使用 CR2032 可充电电池,但如果要使用不可充电电池,则需要对模块进行小幅修改。

DS3231 模块原理图

在这里插入图片描述

对 DS3231 进行编程和设置时间

在 DS3231 模块中设置时间相当简单。您需要做的就是在以下配置中将其连接到 Arduino。
在这里插入图片描述
完成上述连接后,您需要将 Arduino UNO 连接到您的 PC,打开 Arduino IDE,并安装 Arduino DS3231 Time Set Library。打开 Arduino IDE 并从菜单栏中选择 Library Manager。现在查找RTCLib和 DS3231 并获取最新版本,如下图所示。

在这里插入图片描述

DS3231中设置时间的代码

代码非常简单。它将设置时间,然后将其显示在串行监视器上。

rtc.adjust(DateTime(F(__DATE__),F(__TIME__)));

rtc 对象在这一行中根据您计算机上的时间设置时间。它将更改您系统的当前时钟时间。

rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));

您可以通过按以下顺序将日期时间值传递给函数来手动设置此行中的时间:年、月、日、小时、分钟和秒。我们将在下面的代码中设置系统的时间。结果,我们注释掉了这一行。

#include <RTClib.h>
#include <Wire.h>
RTC_DS3231 rtc;
char t[32];
void setup()
{
  Serial.begin(9600);
  Wire.begin();
  rtc.begin();
  rtc.adjust(DateTime(F(__DATE__),F(__TIME__)));
  //rtc.adjust(DateTime(2019, 1, 21, 5, 0, 0));
}
void loop()
{
  DateTime now = rtc.now();
  sprintf(t, "%02d:%02d:%02d %02d/%02d/%02d", now.hour(), now.minute(), now.second(), now.day(), now.month(), now.year());  
  Serial.print(F("Date/Time: "));
  Serial.println(t);
  delay(1000);
}

使用 DS3231 和 LCD 制作一个 DIY Arduino 数字时钟

Arduino数字时钟电路图 :
在这里插入图片描述将 RTC 模块的 SCL 连接到 Arduino A5
将 RTC 模块的 SDA 连接到 Arduino A4
将 VCC 连接到 5v,将 GND 连接到 GND
将 LCD 的 RS 连接到 Arduino 的引脚 7
将 LCD 的 E 连接到 Arduino 的引脚 6
将 LCD 的 D7 连接到 Arduino 的引脚 2
将 LCD 的 D6 连接到 Arduino 的引脚 3
将 LCD 的 D5 连接到 Arduino 的引脚 4
将 LCD 的 D4 连接到 Arduino 的引脚 5
将 VSS、K、RW、D0、D1、D2、D3 连接到 GND
将 VDD 和 A 连接到 5v
将 VO 连接到电位器输出引脚(用于控制文本的对比度)

在 LCD 上显示时间的代码

我们在代码中包含以下头文件,Wire.h 用于使用 I2C 与模块通信,LiquidCrystal.h用于在 LCD 显示器上显示时间,RTClib.h用于设置显示器时间并对其进行格式化。

#include <Wire.h>
#include <LiquidCrystal.h>
#include <RTClib.h>

代码中的这一行指定 LCD 的哪个引脚连接到 Arduino 的哪个引脚。

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

如果项目因连接中断而启动,代码将在串行监视器中打印 RTC Module not Present。

if (! rtc.begin())
  {
    Serial.println(" RTC Module not Present");
    while (1);
  }

如果 RTC 掉电,模块中的时间出错,代码会自动设置模块中的时间,并从计算机时钟中获取时间。因此,请确保在设置时间时将 PC 上的时钟设置在正确的时间。

if (rtc.lostPower())
  {
    Serial.println("RTC power failure, reset the time!");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }

这部分代码将 LCD 上的光标设置为 0,并以 Date/Month/Year 格式打印日期。

void displayDate()
 {
  lcd.setCursor(0,0);
  lcd.print("Date:");
  lcd.print(now.day());
  lcd.print('/');
  lcd.print(now.month());
  lcd.print('/');
  lcd.print(now.year());
 }

这部分代码将光标设置为 1,并以 Hour:Minute:Second 格式打印时间。

 void displayTime()
 {
  lcd.setCursor(0,1);
  lcd.print("Time:");
  lcd.print(now.hour());
  lcd.print(':');
  lcd.print(now.minute());
  lcd.print(':');
  lcd.print(now.second());
  lcd.print("    ");
 }

上传代码后,您将能够在 LCD 屏幕上看到日期和时间。
在这里插入图片描述

完整代码

#include <Wire.h>


#include <LiquidCrystal.h>


#include <RTClib.h>


DateTime now;


RTC_DS3231 rtc;


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


void displayDate(void);


void displayTime(void); 


void setup ()


{


  Serial.begin(9600);


  lcd.begin(16,2);


  if (! rtc.begin()) 


  {


    Serial.println(" RTC Module not Present");


    while (1);


  }


  if (rtc.lostPower()) 


  {


    Serial.println("RTC power failure, reset the time!");


    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));


  }


}


void loop () 


{


  now = rtc.now();


  displayDate();


  displayTime();


}


 void displayDate()


 {


  lcd.setCursor(0,0);


  lcd.print("Date:");


  lcd.print(now.day());


  lcd.print('/');


  lcd.print(now.month());


  lcd.print('/');


  lcd.print(now.year());


 }


 void displayTime()


 {


  lcd.setCursor(0,1);


  lcd.print("Time:");


  lcd.print(now.hour());


  lcd.print(':');


  lcd.print(now.minute());


  lcd.print(':');


  lcd.print(now.second());


  lcd.print("    ");


 } 


 


To set the Time


#include <RTClib.h>


#include <Wire.h>


RTC_DS3231 rtc;


char t[32];


void setup() 


{


  Serial.begin(9600);


  Wire.begin();


  rtc.begin();


  rtc.adjust(DateTime(F(__DATE__),F(__TIME__)));


  //rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); 


}


void loop()


{


  DateTime now = rtc.now();


  sprintf(t, "%02d:%02d:%02d %02d/%02d/%02d",  now.hour(), now.minute(), now.second(), now.day(), now.month(), now.year());   


  Serial.print(F("Date/Time: "));


  Serial.println(t);


  delay(1000);


}


  • 10
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
DS3231是一款高精度实时时钟模块,常用于需要精确时间的应用场合。与NodeMCU结合使用,可以实现诸如闹钟、定时开关等功能。下面是一个基于Arduino语言的DS3231与NodeMCU的代码示例: ```C++ #include <Wire.h> #include "RTClib.h" RTC_DS3231 rtc; void setup() { Serial.begin(9600); Wire.begin(D2, D1); // SDA, SCL rtc.begin(); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // 设置当前时间 } void loop() { DateTime now = rtc.now(); // 获取当前时间 Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(' '); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); delay(1000); } ``` 在这个示例中,我们首先包含了Wire库和RTClib库,Wire库用于I2C通信,RTClib库用于操作DS3231模块。在setup()函数中,我们初始化了串口和Wire库,并且调用rtc.begin()方法初始化了DS3231模块。接下来,我们使用rtc.adjust()方法设置了当前时间,可以根据实际情况修改这个时间。在loop()函数中,我们使用rtc.now()方法获取当前时间,并且使用串口输出。最后,我们使用delay()函数让程序等待1秒钟,然后再次读取时间并输出。 注意,在使用NodeMCU与DS3231模块时,需要将DS3231的SDA和SCL引脚分别连接到NodeMCU的D2和D1引脚。如果需要使用其他GPIO引脚,可以在Wire.begin()方法中修改。此外,需要在Arduino IDE中选择正确的NodeMCU开发板和端口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值