风筝
发表于: 2021-9-8 16:17:17 | 显示全部楼层

在本篇文章中,我们将介绍实时时钟 (RTC)模块以及OLED显示屏与ESP32控制器的连接使用方法。


我们将使用ESP32作为微控制器,DS3231实时时钟模块记录正确的时间,然后在SPI OLED显示屏上进行显示。 ESP32不仅仅是一个微控制器,同时内部有Wi-Fi和蓝牙芯片以及39个GPIO引脚。它支持所有常见通信协议,如SPI、I2C、UART等。


什么是RTC?

DS3231是一款RTC(实时时钟)模块。它记录大多数电子项目的日期和时间。该模块自带纽扣电池电源,即使主电源被移除或MCU复位,它也能保持日期和时间。因此,一旦我们在此模块中设置了日期和时间,它将始终对其进行记录。RTC芯片型号众多,如DS1307、DS3231等。


我们之前曾在以下项目中将 DS3231 RTC 与 Arduino 一起使用:

DS3231-RTC-Module.jpg


OLED显示屏简介

OLED,全称是Organic Light emitting diode(有机发光二极管),它使用的技术与我们大多数电视中使用的技术相同,但像素更少。使用这些显示模块会很有趣,因为它会让我们的项目看起来很酷。

Monochrome-7-pin-SSD1306-0.96-OLED-display.jpg


我们使用的是单色SSD1306 0.96英寸OLED显示屏。选择这款显示器的原因是它可以工作在SPI 3线模式、SPI 4线模式和IIC模式三种不同的通信协议上。本教程将介绍如何在SPI 4线模式下使用该模块。


Arduino社区已经为我们提供了很多库,可以直接使用这些库来简化这个过程。我尝试了一些库,发现Adafruit_SSD1306库非常易于使用,并且有一些图形选项,因此我们将在本文中使用该库。但是,如果您的项目有内存/速度限制,请尝试使用U8g库,因为它运行速度更快,占用的程序内存更少。


所需的组件

●    ESP32开发板

●    DS3231 RTC模块

●    OLED显示屏模块 (SSD1306)

●    面包板


电路连接图

RTC3231实时时钟模块与ESP32开发板连接的电路图如下:

DS3231-Module-based-ESP32-Real-Time-Clock-circuit-diagram.jpg


DS3231模块使用I2C通信,包含4个引脚,分别是SCL、SDA、Vcc和GND引脚。 DS3231模块的SCL和SDA分别连接到ESP32开发板的D22和D21引脚,DS3231模块的电源引脚VCC和GND连接到ESP32的VCC和GND。


OLED显示屏模块 (SSD1306) 通过SPI模式连接到ESP32开发板。与ESP32的连接参考原理图。

ESP32-Real-Time-Clock-using-DS3231-Module.jpg


代码说明

我们需要中使用几个库来简化代码流程,可以从以下链接下载:

1. Adafruit_SSD1306:https://github.com/adafruit/Adafruit_SSD1306

2. SPI : https://github.com/PaulStoffregen/SPI

3. Adafruit_GFX : https://github.com/adafruit/Adafruit-GFX-Library

4. RTClib : https://github.com/adafruit/RTClib


首先在代码中包含所有的库的头文件

  1. #include <SPI.h>   // for OLED display
  2. #include <Wire.h>  // for I2C with RTC module
  3. #include <Adafruit_GFX.h>
  4. #include <Adafruit_SSD1306.h>  // for display graphics
  5. #include "RTClib.h"       //to show time
复制代码

然后定义OLED相关的所有引脚。您不需要为RTC模块定义引脚,因为这些引脚已在WIRE库中定义。

  1. #define OLED_MOSI  23
  2. #define OLED_CLK   18
  3. #define OLED_DC    4
  4. #define OLED_CS    5
  5. #define OLED_RESET 2
  6. Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
复制代码

setup()函数中,我们将调用一个函数rtc.adjust(DateTime(__DATE__, __TIME__)) 它将根据我们的PC时间设置时间。

  1. void setup()
  2. {
  3. Serial.begin(9600);

  4. if (! rtc.begin()) {
  5. Serial.println("Couldn't find RTC");
  6. while (1);
  7. }

  8. rtc.adjust(DateTime(__DATE__, __TIME__));
复制代码

然后我们调用显示函数在OLED屏上显示时间。

  1. display.begin(SSD1306_SWITCHCAPVCC);
  2. display.clearDisplay();
  3. display.setTextColor(WHITE);
  4. //display.startscrollright(0x00, 0x0F); // You can uncomment this line to scroll your text on oled                  
  5. display.setTextSize(2);
  6. display.setCursor(0,5);
  7. display.print("  Clock "); //This will Display Clock on OLED for 3 seconds
  8. display.display();
  9. delay(3000);
  10. }
复制代码

最后在loop()函数中,我们将时间存储在DateTime变量中,然后使用setTextSize、setCursor等显示函数显示时间。根据需要设置这些,然后使用display.println()函数在OLED屏上显示。

  1. void loop()
  2. {
  3. DateTime now = rtc.now();

  4. display.clearDisplay();
  5. display.setTextSize(2);
  6. display.setCursor(75,0);
  7. display.println(now.second(), DEC);
复制代码

以上就是如何使用ESP32和RTC模块在OLED屏上显示时间的全部内容。ESP32以其物联网功能而闻名,因此您可以使用它从互联网上获取时间。如果有任何问题,请随时在本帖下面进行回复。


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

本版积分规则

主题 54 | 回复: 107



手机版|

GMT+8, 2024-3-29 21:12 , Processed in 0.165310 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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