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

描述

在本教程中,我们将了解实时时钟 (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(); 

}

 


 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分