采用DS1307和OLED显示器的ESP32实时时钟(RTC)
ESP32带有内置的RTC模块,但只有在有电源的情况下才能工作。如果断电,时钟将被重置,无法保持正确的时间。因此,如果您想跟踪时间或控制任何基于时间的设备,那么请尝试DS1307 RTC传感器。但是,您可能会考虑将备用电池与ESP32板连接起来,但如果电源短缺,这并不是最好的情况。最好的选择是使用DS1307传感器,因为它带有内置电池,可以持续使用至少一年。
为了让事情变得更清楚,ESP32的内部实时时钟(RTC)即使在主处理器断电或深度睡眠时也可以跟踪时间。您可以使用ESP32 RTC来跟踪时间,而不会使用太多电源或影响主处理器。但它仍然需要能量来运行,不是那么多,但内部RTC运行所需的能量是最小的。
因此,我们只剩下使用外部RTC模块的解决方案。让我们看看将ESP32板与DS1307 RTC模块连接的步骤。
内容:
- 什么是RTC DS1307模块
- 如何用ESP32接口RTC DS1307和OLED显示器
- 寻找OLED显示器的I2C地址
- OLED和RTC DS1307模块与ESP32接口
- 线路图
- 代码
- 硬件
- 结论
1. 什么是RTC DS1307模块
DS1307是一种低功耗器件,可以准确地跟踪时间和日期。它使用二进制编码的十进制(BCD)格式。它可以告诉你时间的详细格式,如秒,分,甚至小时和天。您还可以打印完整格式的日期,如月和年。它也知道什么时候是闰年,直到2100年。要与DS1307通信,可以使用I2C协议。
DS1307有一个内置电池,可以在没有外部5V电源的情况下为它供电大约一年。使用此备用电池,即使在主电源关闭时也能保持时间。它还有56字节的SRAM来存储一些数据。DS1307是一个方便的设备,当与Arduino或ESP32板结合使用时,它有许多应用。例如,这些数据可以用于数据记录、报警系统或工业控制。如果您需要可靠的计时,DS1307是一个很好的选择。
RTC DS1307模块规范
RTC DS1307模块由RTC IC、EEPROM、晶体振荡器和备用电池座组成。
以下是这些部分的详细说明:
DS1307 RTC IC: DS1307 RTC IC是一个8针芯片,使用I2C协议跟踪时间和日期。它的功耗非常小,低于500nA。它可以以秒、分、小时显示时间,并以日、月、年显示日期。它还可以在24小时和12小时格式之间切换。
24C32 EEPROM IC: 24C32 EEPROM IC是来自Atmel的32字节芯片,用于存储设置、时间和日期。它还使用I2C协议。
32.768kHz晶体:32.768kHz晶体振荡器为DS1307 RTC IC提供时钟频率。
电池座:电池座可容纳CR2032电池。它是一个3V的锂硬币电池。它为DS1307 RTC IC提供持续的电源。
DS18B20传感器配置:DS18B20传感器配置允许您焊接和使用DS18B20温度传感器。它不是预焊的。您可以焊接通孔封装并从模块的DS引脚获得温度。
下面的列表给出了DS1307 RTC传感器的一些快速规格:
- 工作电压:4.5-5.5 V,一般为5v
- 电流消耗:小于1.5 mA
- 精度:0-40°C,取决于晶体
- 电池:CR2032 (3v硬币)
- 内存:56字节的非易失性RAM
- 接口:I2C串口
- 输出:1hz输出引脚
- 可编程方波输出:电池备电模式下功耗小于500na
- 断电检测:自动断电检测和开关电路
- 电量感应电路:缺电时自动切换备用电源
- 闰年补偿:有效期至2100年
RTC DS1307模块输出
该模块有几个不同功能的引脚。
- VCC是需要3.3V到5.5V之间的直流电压为模块供电的引脚。
- GND为低压引脚或接地引脚。
- SDA和SCL是通过I2C总线传输数据和时钟信号的引脚。
- 如果在RTC模块上有DS1307传感器,则DS是测量温度的引脚。
- SQ是产生频率为1hz, 4khz, 8khz或32khz的方波信号的引脚,具体取决于您如何编程。
- BAT是使用3V电池的引脚,在主电源关闭时保持时间准确。
2. 如何用ESP32接口RTC DS1307和OLED显示器
要将ESP32与DS1307和OLED显示器连接,可以使用ESP32板的内置I2C引脚。DS1307和OLED显示屏都是基于i2c的器件。然后可以在I2C总线上使用I2C主从协议进行通信。
在我们转向ESP32与DS1307和OLED显示器的接口之前,首先您必须安装一些所需的库。
安装所需的库
您将需要两个库,一个用于RTC模块,另一个用于OLED显示器。使用带有RTC模块的OLED,您可以创建惊人的交互式时钟预览。如果您不打算在屏幕上显示时间,那么您可以跳过这个库的安装。
以下是您将需要的两个库:
- RTClib(由Adafruit)是一个Arduino IDE库,用于从RTC设置和获取时间。它还提供了用于操作日期、时间和持续时间的类。使用该库,可以对实时时钟(RTC)模块进行接口和编程,如DS1307和DS3231。
- SSD1306(由Adafruit)是Arduino的库,您可以使用它与Arduino或任何其他微控制器板进行接口和编程OLED显示器。
要在Arduino IDE中下载和安装这两个库,首先打开Library Manager搜索RTClib库,然后单击install:
您将获得仅安装库或其依赖项的选项。单击Install All按钮以完全安装库。这样,如果您修改依赖于此库的依赖项的代码,您将不会得到任何错误。
类似地,搜索SSD1306库。这个库是OLED显示器所需要的。单击Install继续。
这一次,您也将得到相同的确认消息。单击Install All选项。
现在,用于OLED和DS1307的库都已安装并准备使用。但在此之前,首先要找出OLED显示器的I2C地址。
3. 寻找OLED显示器的I2C地址
I2C地址是I2C总线上每个设备的唯一标识符。它允许主设备通过向其地址发送数据与特定的从设备通信。I2C地址的目的是为了避免同一总线上的多个设备之间的冲突和混淆。
为了获得I2C设备的地址,您可以使用一个简单的草图来扫描总线并打印它找到的设备的地址。或者,您可以检查设备的数据表以查看其默认或可配置的地址。
在我们的例子中,运行I2C扫描器代码后,OLED屏幕的以下I2C地址显示在Arduino IDE终端上。
大多数时候,您很有可能也会为您的OLED屏幕获得相同的0x3C地址。
4. OLED和RTC DS1307模块与ESP32接口
1. 将DS1307模块和OLED显示器的SDA和SCL引脚连接到ESP32的I2C引脚上。通常,这些是GPIO 21和GPIO 22,但如果需要,您也可以在代码中分配任何其他引脚。
2. 将DS1307的VCC和GND以及OLED显示器连接到ESP32的3.3V和GND引脚上。
3. 将CR2032纽扣电池插入DS1307模块,为实时时钟提供备用电源。
4. 将本教程中的示例代码上传到ESP32板。修改自定义输出的代码。
上传完成后,时钟会从设定的时间开始计时,并在OLED屏幕上显示时间。
5. 线路图
带有DS1307的ESP32电路图很简单,只需要连接四根电线。您可以缩短OLED和DS1307传感器的I2C线SDA和SCL。同样,要为这两个传感器供电,可以使用ESP32板的3V3和GND引脚。如果需要,您也可以使用单独的电源。
注意:如果不超过ESP32的电流限制,从ESP32的3.3V引脚为RTC DS1307供电是安全的。但是如果你想在一个安全的地方,你可以为RTC模块使用一个单独的电源,或者尝试低功耗DS3231传感器,其工作范围在3.3到5.5 VDC之间。
下图说明了ESP32与RTC DS1307传感器的连接。
同样,如果要连接OLED屏幕显示时间,可以使用与ESP32板相同的I2C引脚和电源引脚。
6. 代码
使用下面的代码,我们将在RTC上设置当前日期和时间。设置好时间后,代码将在Arduino IDE终端上显示时间。在上传代码之前,需要用当前日期和时间更新代码。
# include“RTClib.h”
RTC_DS1307 DS1307_RTC;
char Week_days[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
无效设置(){
Serial.begin (115200);
的ifndef ESP8266
而(串行);
# endif
if (!DS1307_RTC.begin()) {
系列。println("找不到RTC");
(1);
}
DS1307_RTC.adjust (DateTime (F (__DATE__), F (__TIME__)));
}
Void loop () {
DateTime now = DS1307_RTC.now();
并同时now.year()、12月);
并同时(“/”);
并同时now.month()、12月);
并同时(“/”);
并同时日期()、12月);
系列。打印(“(”);
并同时Week_days [now.dayOfTheWeek ()));
并同时”)”);
并同时now.hour()、12月);
并同时(“:”);
并同时now.minute()、12月);
并同时(“:”);
并同时now.second()、12月);
以();
延迟(1000);
}
这段代码使用RTClib库与DS1307实时时钟模块进行接口,该模块跟踪日期和时间。
setup函数从初始化波特率开始。之后,在本节中,我们定义了将计算机的日期和时间与DS1307传感器同步的函数。这将上传代码编译的时间到RTC传感器。
您可以使用循环函数从RTC获取日期和时间。然后,您可以在串行监视器上显示如下:年/月/日(星期几)小时:分钟:秒。记住在每个循环之后添加一秒钟的延迟,这样代码就不会运行得太快。
在OLED显示器上显示当前时间
为了在OLED屏幕上显示相同的时间,我们必须为OLED屏幕添加额外的代码部分。只需上传给定的代码。此代码将在您的OLED屏幕上显示当前时间。
请记住,这里我们使用0.96英寸128×64 I2C SSD OLED显示模块。如果您使用其他大小,请相应地修改代码。此外,检查I2C地址并在给定的代码中修改它。在我们的例子中,我们有一个I2C地址0x3C用于OLED屏幕。
# include
# include
# include
# include“RTClib.h”
#define SCREEN_WIDTH
#define SCREEN_HEIGHT
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
RTC_DS1307 RTC;
char日[7][12]= {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
无效设置(){
Serial.begin (115200);
RTC.begin()) {
系列。println("找不到RTC");
(1);
}
RTC.adjust (DateTime (F (__DATE__), F (__TIME__)));
如果(!显示。begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
系列。println(F("SSD1306分配失败"));
(,);
}
延迟(1000);
display.clearDisplay ();
display.setTextSize (2);
display.setTextColor(白色);
显示。setCursor(30日20);
display.println(“Linuxhint”);
display.display ();
延迟(3000);
display.clearDisplay ();
}
Void loop() {
DateTime now = rpc .now();
display.clearDisplay ();
display.setTextSize (2);
显示。setCursor (0,0);
display.print(日期());
display.print(“/”);
display.print (now.month ());
display.print(“/”);
display.print (now.year ());
display.println(天[now.dayOfTheWeek ()));
显示。println (' ');
显示。setCursor (0, 40);
if (now.hour()