如何使用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