在本教程中,我们将学习实时时钟(RTC)及其与ESP32和OLED显示屏的接口。
我们将使用DS3231 RTC模块来跟踪正确的时间,并通过使用ESP32作为微控制器将其显示在SPI OLED上。ESP32不仅仅是一个微控制器。它内部具有Wi-Fi和蓝牙芯片以及39个GPIO引脚。它支持所有通信协议,如SPI,I2C,UART等。如果您不熟悉ESP32,请首先阅读我们的ESP32入门教程。
什么是RTC?
DS3231是RTC (实时时钟)模块。它用于维护大多数电子项目的日期和时间。该模块具有自己的纽扣电池电源,即使断开主电源或MCU进行了硬复位,它也可以使用该电源保持日期和时间。因此,一旦我们在此模块中设置了日期和时间,它就会一直跟踪它。有多种类型的RTC IC,例如DS1307,DS3231等。
我们先前 在以下项目中将DS3231 RTC与Arduino结合使用 :
- 使用Arduino的自动宠物喂食器
- Arduino数据记录器
注意: 首次使用此模块时,必须设置日期和时间。您还可以使用RTC IC DS1307,我们之前已将DS1307与Arduino一起使用。
了解OLED显示器:
OLED一词代表“ 有机发光二极管”, 它使用了与我们大多数电视相同的技术,但与之相比像素更少。拥有这些看起来很酷的显示模块真的很有趣,因为它将使我们的项目看起来很酷。我们在这里涵盖了有关OLED显示器及其类型的完整文章。
我们使用的是单色7针SSD1306 0.96英寸OLED显示屏。选择此显示器的原因是它可以在三种不同的通信协议上工作,例如SPI 3线模式,SPI四线模式和IIC模式。本教程将介绍如何以SPI 4线模式使用该模块,因为它是最快的通信模式,也是默认模式。
引脚及其功能在下表中说明。
针号 |
引脚名称 |
其他名称 |
用法 |
1个 |
nd |
地面 |
模块的接地引脚 |
2 |
Vdd |
Vcc,5V |
电源引脚(可承受3-5V) |
3 |
SCK |
D0,SCL,时钟 |
充当时钟引脚。用于I2C和SPI |
4 |
SDA |
D1,MOSI |
模块的数据引脚。用于IIC和SPI |
5 |
RES |
复位 |
重置模块(在SPI期间有用) |
6 |
直流电 |
A0 |
数据命令引脚。用于SPI协议 |
7 |
CS |
片选 |
在SPI协议下使用多个模块时很有用 |
在本教程中,我们将仅以4线SPI模式操作模块,其余部分将留给其他教程。
Arduino社区已经为我们提供了许多库,可以直接使用它们来简化此过程。我试用了一些库,发现Adafruit_SSD1306库非常易于使用,并且具有少量图形选项,因此在本教程中将使用相同的库。但是,如果您的项目有内存/速度限制,请尝试使用U8g库,因为它的运行速度更快且占用的程序内存更少。
我们还将OLED与Raspberry pi和Arduino连接。
所需材料:
- ESP32
- DS3231 RTC模块
- 7针128×64 OLED显示模块(SSD1306)
- 公母线
- 面包板
电路原理图:
RTC3231连接ESP板的电路图如下:
RTC DS3231 IC使用I2C通信模式。它具有SCL,SDA,Vcc和GND引脚。RTC模块与ESP32的连接如下:
- RTC的SCL-> ESP32的SCL,即引脚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的PIN D5
- OLED的DC引脚-> ESP32的PIN D4
- OLED的RES引脚-> ESP32的PIN D2
- OLED的SDA引脚-> PIN D23,即ESP32的MOSI
- OLED的SCK引脚-> PIN D18,即ESP32的SCK
- OLED的Vdd-> ESP32的Vcc
- OLED的GND-> ESP32的GND
ESP32需要板文件。签入ESP32开发套件的Arduino IDE的板管理器下拉菜单。如果不存在,请遵循以下链接中给出的步骤:
circuitdigest.com/microcontroller-projects/getting-started-with-esp32-with-arduino-ide
您还可以在此项目中使用ESP12,在此处了解如何使用ESP12。
代码说明:
本文末尾提供了ESP32的完整代码。在这里,我们解释了代码的几个重要部分。
我们需要在代码中使用几个库,这些库可以从以下链接下载:
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
所以我们包含了所有库
#包括
然后定义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); 如果(!rtc.begin()){ Serial.println(“找不到RTC”); 而(1); } rtc.adjust(DateTime(__ DATE__,__TIME__));
之后,我们调用显示功能以在OLED上显示。
display.begin(SSD1306_SWITCHCAPVCC); display.clearDisplay(); display.setTextColor(WHITE); //display.startscrollright(0x00,0x0F); //您可以取消注释此行以在oled display.setTextSize(2); 上滚动文本。display.setCursor(0,5); display.print(“ Clock”); //这将在OLED上显示时钟3秒钟 display.display(); 延迟(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以其IoT功能而闻名,因此您可以使用它在Internet上发布时间。在下一篇文章中,我们将向您展示不使用任何RTC模块在ESP上显示Internet时间。