如何使用DS3231实时时钟(RTC)模块与ESP32

ESP32是一款内置Wi-Fi和蓝牙功能的智能微控制器板。ESP32自带内部RTC,但其工作依赖于电源。因此,如果您想设计即使在没有电源的情况下也要运行的项目或电路,则必须使用任何外部RTC模块,如DS1307或DS3231。

我们已经做了一个关于DS1307与ESP32模块接口的教程。今天我们将讨论DS3231 RTC传感器的基础知识,并检查如何将其与ESP32板连接。

目录:

1. 什么是DS3231 RTC模块

  • 1.1. DS3231 Vs DS1307
  • 1.2. DS3231引出线

2. 如何将DS3231与ESP32连接

  • 2.1. ESP32与RTC DS3231接线图
  • 2.2. 安装所需的库

3. 硬件

4. 代码

  • 4.1. 代码的解释

5. 输出

6. 如何使用ESP32在OLED屏幕上显示RTC DS3231时间

结论

1. 什么是DS3231 RTC模块

DS3231模块提供高精度的计时功能。它包括一个集成的温度补偿晶体振荡器(TCXO),为我们提供高精度的时间。该模块使用主从配置在I2C协议上运行。即使没有主输入电源,它也可以用备用电池记录时间和日期。它通常用于依赖于时间和日期的设备。

DS3231可以显示秒、分和小时。它还可以记录日期和工作日。当处理闰年时,它会自动相应地调整时间。此外,它还可以显示12小时或24小时格式的时间,并配有AM/PM指示器。

1.1. DS3231 Vs DS1307

DS3231和DS1307都是带有备用电池支持的计时模块。然而,DS3231比DS1307更精确。主要原因是DS1307依赖于外部32kHz晶体来计时。

然而,RTC DS3231具有内部温度补偿晶体振荡器(TCXO)。这使得它受外部温度的影响较小,因此,它比DS1307每年具有几分钟的精度优势。

1.2. DS3231引出线

DS3231使用I2C协议工作。在这个RTC模块的核心,我们有精确的RTC芯片由Maxim设计。该芯片处理所有的时间功能,并使用I2C与ESP32或Arduino板进行通信。

RTC DS3231模块的主引脚为:

  • VCC:将此引脚连接到电源的正极。
  • GND:接地。
  • SDA:串行数据引脚(用于I2C通信)。
  • SCL:串行时钟引脚(也是I2C接口的一部分)。
  • SQW:方波输出引脚(可以产生周期性信号,例如用于报警或其他定时目的)。
  • 32K: 32KHz振荡器输出(用于精确定时应用)。

以下是RTC DS3231模块的主要板载组件:

  • 电池座:使模块在没有外部电源的情况下保持运行。
  • RTC芯片:该芯片维护时间和日期。
  • AT24C32 EEPROM:它为数据记录和其他目的提供非易失性存储,具有1,000,000个写周期。
  • TCXO:温度补偿振荡器,为不同的温度范围提供正确的时间。
  • 温度传感器:它读取温度读数并将其作为模块功能的一部分提供。

2. 如何将DS3231与ESP32连接

要将DS3231与ESP32连接,您需要首先安装RTClib库。安装Adafruit RTC库后,您可以使用I2C协议将ESP32板与DS3231连接。要将ESP32 I2C与RTC DS3231模块连接,可以使用ESP32 D21和D22引脚。

2.1. ESP32与RTC DS3231接线图

首先,您必须将ESP32与I2C RTC DS3231模块连接起来。按照下面给出的引脚配置进行接线:

将ESP32与RTC DS3231连接后,接线图应该如下所示。也可以通过ESP32的VIN引脚为DS3231供电。DS3231的工作电压为3.3 ~ 5.5 VDC。

2.2. 安装所需的库

一旦电路准备好,下一步是用Arduino IDE配置ESP32板。为了连接DS3231,您需要安装RTClib库。您可以使用Arduino IDE库管理器来安装它。

3. 硬件

使用ESP32设计基于ds3231的RTC时钟需要以下硬件:

  • ESP32开发板
  • RTC DS3231模块
  • CR2032电池
  • 跳线
  • 电路试验板

4. 代码

安装完RTC库后,下一步就是编写DS3231的代码并上传到ESP32板上。首先,您必须编写代码来设置当前时间。在DS3231中设置时间后,即使ESP32板关闭,它也会记住时间并继续运行。

现在打开Arduino IDE,编译并将代码刻录到ESP32板上。

# include

# include

RTC_DS3231 rtc;//初始化RTC_DS3231类的实例

无效设置(){

Serial.begin (115200);

Wire.begin ();

if (!rtc.begin()) {

系列。println("未检测到RTC ");

(1);//如果没有找到RTC,则无限期挂起

}

//取消下面一行的注释以设置初始日期和时间

/ /清债信托公司。调整(DateTime (__DATE__ __TIME__));

}

Void loop() {

//从传感器(DS3231)读取当前时间

DateTime now = rts .now();

//在同一行上打印日期和时间,用两位数字表示小时、分钟和秒

系列。print("当前日期");

并同时now.year()、12月);

并同时(“/”);

printTwoDigits (now.month ());

并同时(“/”);

printTwoDigits(日期());

系列。print("当前时间:");

printTwoDigits (now.hour ());

并同时(“:”);

printTwoDigits (now.minute ());

并同时(“:”);

printTwoDigits (now.second ());

以();

延迟(1000);//每1秒更新一次

}

无效printTwoDigits(int number) {

    if (number