在本篇文章中,我们将学习如何将RTC实时时钟模块DS3231连接到ESP32开发板和0.96英寸I2C OLED显示屏。我们将使用DS3231实时时钟模块跟踪正确的时间和日期,在OLED显示屏上进行显示,并使用ESP32作为微控制器。
也可以使用DS1307代替DS3231。 DS3231 RTC具有内置的闹钟功能以及温度传感器,其分辨率为0.25,精度为±3°C,这使该项目更加容易实现。
所需的组件 以下是制作此项目所需的组件: ● ESP32开发板 ● DS3231 RTC模块 ● 0.96英寸I2C OLED显示屏
DS3231 RTC模块 DS3231是一款低成本、非常精确的I2C实时时钟(RTC),具有集成的温度补偿晶体振荡器(TCXO)。该器件具有电池输入引脚,并且在器件的主电源中断时可以保持准确的计时。
RTC可以记录秒、分钟、小时、日期、月份和年份的信息。对于少于31天的月份,将自动调整月末的日期,包括闰年的更正。时钟以24小时制或12小时制运行,并带有低电平有效AM / PM指示器。提供两个可编程的时间闹钟和一个可编程的方波输出。
精密的温度补偿电压基准和比较器电路监视VCC的状态,以检测电源故障,提供复位输出并在必要时自动切换到备用电源。另外,RST引脚低电平有效,当按钮输入时产生一个微控制器复位信号。
主要特征: ● 高精度RTC管理所有计时功能 ● 实时时钟计数秒、分钟、小时、月、周、日和年,闰年补偿有效期至2100 ● 0°C到+ 40°C的精度为±2ppm ● -40°C至+ 85°C的精度为±3.5ppm ● 数字温度传感器输出:±3°C精度 ● 低电平有效RST输出/按钮复位去抖输入 ● 两个时间闹钟 ● 可编程方波输出信号 ● 简单的串行接口连接到大多数微控制器 ● 快速(400kHz)I2C接口 ● 电池备用输入,可连续计时 ● 低功耗运行可延长电池备份运行时间 ● 工作温度范围:商业(0°C至+ 70°C)和工业(-40°C至+ 85°C)
ESP32和DS3231实时时钟的电路连接 以下是DS3231模块与ESP32和OLED连接的电路图。连接非常简单。您也可以在面包板上组装电路。
DS3231和OLED显示器均为I2C模块。因此,我们只需要2个引脚即可进行连接。因此,将串行数据(SDA)引脚连接到ESP32 GPIO21引脚,并将串行时钟(SCL)连接到ESP32 GPIO22引脚。通过ESP32的3.3V引脚为OLED和RTC模块提供3.3V的电压。您也可以为DS3231和OLED模块使用5V电源。
源代码 ESP32连接DS3231 RTC模块的源代码如下。您可以复制代码并将其直接上传至ESP32开发板。但在此之前,您需要安装几个库。因此,请首先下载并添加库。 1. Adafruit_SSD1306 2. Adafruit_GFX 3. RTClib - #include <SPI.h>
- #include <Wire.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #include "RTClib.h"
- RTC_DS3231 rtc;
- char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
- #define SCREEN_WIDTH 128 // OLED display width, in pixels
- #define SCREEN_HEIGHT 64 // OLED display height, in pixels
- #define OLED_RESET -1 // Reset pin # (or -1 if sharing reset pin)
- Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
- void setup()
- {
- Serial.begin(9600);
- if (! rtc.begin()) {
- Serial.println("Couldn't find RTC");
- while (1);
- }
- if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
- {
- Serial.println(F("SSD1306 allocation failed"));
- for(;;); // Don't proceed, loop forever
- }
- rtc.adjust(DateTime(__DATE__, __TIME__));
- display.display();
- delay(2);
- display.clearDisplay();
- display.clearDisplay();
- display.setTextColor(WHITE);
- //display.startscrollright(0x00, 0x0F);
- display.setTextSize(2);
- display.setCursor(0,5);
- display.print(" Clock ");
- display.display();
- delay(3000);
- }
- void loop()
- {
- DateTime now = rtc.now();
- display.clearDisplay();
- display.setTextSize(2);
- display.setCursor(75,0);
- display.println(now.second(), DEC);
- display.setTextSize(2);
- display.setCursor(25,0);
- display.println(":");
- display.setTextSize(2);
- display.setCursor(65,0);
- display.println(":");
- display.setTextSize(2);
- display.setCursor(40,0);
- display.println(now.minute(), DEC);
- display.setTextSize(2);
- display.setCursor(0,0);
- display.println(now.hour(), DEC);
- display.setTextSize(2);
- display.setCursor(0,20);
- display.println(now.day(), DEC);
- display.setTextSize(2);
- display.setCursor(25,20);
- display.println("-");
- display.setTextSize(2);
- display.setCursor(40,20);
- display.println(now.month(), DEC);
- display.setTextSize(2);
- display.setCursor(55,20);
- display.println("-");
- display.setTextSize(2);
- display.setCursor(70,20);
- display.println(now.year(), DEC);
- display.setTextSize(2);
- display.setCursor(0,40);
- display.print(daysOfTheWeek[now.dayOfTheWeek()]);
- display.display();
- }
复制代码
基于ESP32和DS3231的实时时钟 代码上传后,RTC模块开始工作。时间和日期将显示在OLED显示屏中。不需要其他设置,也不需要任何额外的按钮或开关。
|