首页 > 技术知识 > 正文

在本教程中,我们将了解实时时钟 (RTC) 及其与 ESP32和OLED 显示器的接口。

我们将使用DS3231 RTC 模块来跟踪正确的时间,并使用 ESP32 作为我们的微控制器将其显示在 SPI OLED 上。ESP32 不仅仅是一个微控制器。它内部有Wi-Fi和蓝牙芯片以及39个GPIO引脚。它支持所有通信协议,如SPI,I2C,UART等。

什么是 RTC??

DS3231是RTC(实时时钟)模块。它用于维护大多数电子项目的日期和时间。该模块有自己的纽扣电池电源,即使主电源被移除或MCU经过硬复位,它也能保持日期和时间。因此,一旦我们在此模块中设置了日期和时间,它将始终跟踪它。RTC IC有几种类型可供选择,如DS1307、DS3231等。

使用ESP32在OLED上显示时间的方式-esp32cam oled

注意:首次使用此模块时,您必须设置日期和时间。您也可以使用RTC IC DS1307,我们之前将DS1307与Arduino一起使用。

了解OLED显示器:

术语OLED代表“有机发光二极管”,它使用与我们大多数电视中使用的相同技术,但与它们相比像素更少。拥有这些看起来很酷的显示模块真的很有趣,因为它会让我们的项目看起来很酷。

使用ESP32在OLED上显示时间的方式-esp32cam oled1

使用ESP32在OLED上显示时间的方式-esp32cam oled2

我们使用单色 7 针 SSD1306 0.96 英寸 OLED 显示屏。选择此显示器的原因是它可以在三种不同的通信协议上工作,例如SPI 3线模式,SPI四线模式和IIC模式。本教程将介绍如何在SPI 4线模式下使用该模块,因为它是最快的通信模式,也是默认的通信模式。

引脚及其功能在下表中进行了说明。

引脚编号 引脚名称 其他名称 用法 1 格德 地 模块的接地引脚 2 Vdd 直流电,5V 电源引脚(可承受 3-5V 电压) 3 SCK D0,SCL,CLK 充当时钟引脚。用于 I2C 和 SPI 4 自主权评估 D1,莫西 模块的数据引脚。用于 IIC 和 SPI 5 RES RST,重置 重置模块(在 SPI 期间很有用) 6 直流 答0 数据命令引脚。用于 SPI 协议 7 .CS 芯片选择 在 SPI 协议下使用多个模块时很有用

在本教程中,我们将简单地在4-Wire SPI模式下操作模块,其余的将留给其他教程。

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

所需材料:

ESP32

DS3231 RTC 模块

7 针 128×64 OLED 显示模块 (SSD1306)

公母线

面包板

电路图:

RTC3231与ESP板的连接电路图如下:

使用ESP32在OLED上显示时间的方式-esp32cam oled3

RTC DS3231 IC采用I2C通信模式。它具有SCL,SDA,Vcc和GND引脚。RTC 模块与 ESP32 的连接如下:

RTC 的标准与标准实验室 -> ESP32 的标准与标准实验室,即引脚 D22

RTC 的 SDA -> ESP32 的 SDA 即引脚 D21

RTC 的 GND -> ESP32 的 GND

RTC 的 Vcc -ESP32 的 > Vcc

在这里,我们使用SPI 模式将 128×64 OLED 显示模块 (SSD1306) 连接到 ESP32。因此,它将使用 7 个引脚。与 ESP32 的连接方式如下:

OLED 的 CS(片选)引脚 -ESP32 的 > 引脚 D5

OLED 的直流引脚 -ESP32 的 > 引脚 D4

OLED 的 RES 引脚 -ESP32 的 > 引脚 D2

OLED 的 SDA 引脚 -> 引脚 D23 即 ESP32 的 MOSI

OLED 的 SCK 引脚 -> 引脚 D18 即 ESP32 的 SCK

OLED 的 Vdd -ESP32 的 > Vcc

OLED 的 GND -ESP32 的 GND >

所以我们包含了所有的库

#include // for OLED display

#include // for I2C with RTC module

#include

#include // for display graphics

#include “RTClib.h” //to show time

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

#define OLED_MOSI 23

#define OLED_CLK 18

#define OLED_DC 4

#define OLED_CS 5

#define OLED_RESET 2

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

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

void setup()

{

Serial.begin(9600);

if (! rtc.begin()) {

Serial.println(“Couldnt find RTC”);

while (1);

}

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

之后,我们调用显示函数以在OLED上显示。

display.begin(SSD1306_SWITCHCAPVCC);

display.clearDisplay();

display.setTextColor(WHITE);

//display.startscrollright(0x00, 0x0F); // You can uncomment this line to scroll your text on oled

display.setTextSize(2);

display.setCursor(0,5);

display.print(” Clock “); //This will Display Clock on OLED for 3 seconds

display.display();

delay(3000);

}

最后在循环函数中,我们将时间存储在DateTime 现在预定义的变量中,并使用 setTextSize、setCursor 等显示函数显示时间。根据需要设置这些,并使用display.println功能在OLED上显示。

void loop()

{

DateTime now = rtc.now();

display.clearDisplay();

display.setTextSize(2);

display.setCursor(75,0);

display.println(now.second(), DEC);

因此,这就是您可以使用 ESP32 在 OLED上显示时间的方式,并且您知道 ESP 以其物联网功能而闻名,因此您可以使用它在互联网上发布时间。

#include

#include

#include

#include

#include “RTClib.h”

RTC_DS3231 rtc;

char daysOfTheWeek[7][12] = {“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”};

#define OLED_MOSI 23

#define OLED_CLK 18

#define OLED_DC 4

#define OLED_CS 5

#define OLED_RESET 2

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

void setup()

{

Serial.begin(9600);

if (! rtc.begin()) {

Serial.println(“Couldnt find RTC”);

while (1);

}

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

display.begin(SSD1306_SWITCHCAPVCC);

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(1);

display.setCursor(0,15);

display.println(now.day(), DEC);

display.print(daysOfTheWeek[now.dayOfTheWeek()]);

display.setTextSize(1);

display.setCursor(25,15);

display.println(“-“);

display.setTextSize(1);

display.setCursor(40,15);

display.println(now.month(), DEC);

display.setTextSize(1);

display.setCursor(55,15);

display.println(“-“);

display.setTextSize(1);

display.setCursor(70,15);

display.println(now.year(), DEC);

display.display();

}

猜你喜欢