在本教程中,我们将了解实时时钟 (RTC) 及其与 ESP32和OLED 显示器的接口。
我们将使用DS3231 RTC 模块来跟踪正确的时间,并使用 ESP32 作为我们的微控制器将其显示在 SPI OLED 上。ESP32 不仅仅是一个微控制器。它内部有Wi-Fi和蓝牙芯片以及39个GPIO引脚。它支持所有通信协议,如SPI,I2C,UART等。
什么是 RTC??
DS3231是RTC(实时时钟)模块。它用于维护大多数电子项目的日期和时间。该模块有自己的纽扣电池电源,即使主电源被移除或MCU经过硬复位,它也能保持日期和时间。因此,一旦我们在此模块中设置了日期和时间,它将始终跟踪它。RTC IC有几种类型可供选择,如DS1307、DS3231等。
注意:首次使用此模块时,您必须设置日期和时间。您也可以使用RTC IC DS1307,我们之前将DS1307与Arduino一起使用。
了解OLED显示器:
术语OLED代表“有机发光二极管”,它使用与我们大多数电视中使用的相同技术,但与它们相比像素更少。拥有这些看起来很酷的显示模块真的很有趣,因为它会让我们的项目看起来很酷。
我们使用单色 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板的连接电路图如下:
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("Couldn't 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("Couldn't 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();
}
全部0条评论
快来发表一下你的评论吧 !