采用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()