一板网电子技术论坛

风筝
发表于: 2020-2-24 21:26:11 | 显示全部楼层

在本篇文章中,我们将学习如何将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)。该器件具有电池输入引脚,并且在器件的主电源中断时可以保持准确的计时。

ds3231.jpg


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连接的电路图。连接非常简单。您也可以在面包板上组装电路。

Circuit-Diagram-ESP32-DS3231.jpg


DS3231和OLED显示器均为I2C模块。因此,我们只需要2个引脚即可进行连接。因此,将串行数据(SDA)引脚连接到ESP32 GPIO21引脚,并将串行时钟(SCL)连接到ESP32 GPIO22引脚。通过ESP32的3.3V引脚为OLED和RTC模块提供3.3V的电压。您也可以为DS3231和OLED模块使用5V电源。

DS3231-ESP32-OLED.jpg


源代码

ESP32连接DS3231 RTC模块的源代码如下。您可以复制代码并将其直接上传至ESP32开发板。但在此之前,您需要安装几个库。因此,请首先下载并添加库。

1.  Adafruit_SSD1306

2.  Adafruit_GFX

3.  RTClib

  1. #include <SPI.h>
  2. #include <Wire.h>
  3. #include <Adafruit_GFX.h>
  4. #include <Adafruit_SSD1306.h>
  5. #include "RTClib.h"

  6. RTC_DS3231 rtc;
  7. char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

  8. #define SCREEN_WIDTH 128  // OLED display width, in pixels
  9. #define SCREEN_HEIGHT 64  // OLED display height, in pixels
  10. #define OLED_RESET    -1  // Reset pin # (or -1 if sharing reset pin)
  11. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


  12. void setup()
  13. {

  14. Serial.begin(9600);

  15. if (! rtc.begin()) {
  16. Serial.println("Couldn't find RTC");
  17. while (1);
  18. }

  19. if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
  20. {
  21.     Serial.println(F("SSD1306 allocation failed"));
  22.     for(;;); // Don't proceed, loop forever
  23. }

  24. rtc.adjust(DateTime(__DATE__, __TIME__));

  25. display.display();
  26. delay(2);
  27. display.clearDisplay();


  28. display.clearDisplay();
  29. display.setTextColor(WHITE);
  30. //display.startscrollright(0x00, 0x0F);
  31. display.setTextSize(2);
  32. display.setCursor(0,5);
  33. display.print("  Clock ");
  34. display.display();
  35. delay(3000);
  36. }

  37. void loop()
  38. {
  39. DateTime now = rtc.now();

  40. display.clearDisplay();
  41. display.setTextSize(2);
  42. display.setCursor(75,0);
  43. display.println(now.second(), DEC);

  44. display.setTextSize(2);
  45. display.setCursor(25,0);
  46. display.println(":");

  47. display.setTextSize(2);
  48. display.setCursor(65,0);
  49. display.println(":");

  50. display.setTextSize(2);
  51. display.setCursor(40,0);
  52. display.println(now.minute(), DEC);

  53. display.setTextSize(2);
  54. display.setCursor(0,0);
  55. display.println(now.hour(), DEC);

  56. display.setTextSize(2);
  57. display.setCursor(0,20);
  58. display.println(now.day(), DEC);

  59. display.setTextSize(2);
  60. display.setCursor(25,20);
  61. display.println("-");

  62. display.setTextSize(2);
  63. display.setCursor(40,20);
  64. display.println(now.month(), DEC);

  65. display.setTextSize(2);
  66. display.setCursor(55,20);
  67. display.println("-");

  68. display.setTextSize(2);
  69. display.setCursor(70,20);
  70. display.println(now.year(), DEC);

  71. display.setTextSize(2);
  72. display.setCursor(0,40);
  73. display.print(daysOfTheWeek[now.dayOfTheWeek()]);

  74. display.display();
  75. }
复制代码

基于ESP32和DS3231的实时时钟

代码上传后,RTC模块开始工作。时间和日期将显示在OLED显示屏中。不需要其他设置,也不需要任何额外的按钮或开关。

DS3231-ESP32-OLED-RTC.jpg


跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 22 | 回复: 28



手机版|

GMT+8, 2021-1-18 09:52 , Processed in 0.076175 second(s), 32 queries . Powered by Discuz! X3.4

YiBoard一板网 © 2015-2020 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表