在本教程中,我们将了解实时时钟 (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();
}
华为手环B6疑似将在7月30北京发布
全球第三大移动运营商携手是德科技加速部署5G网络
lvds是什么意思?
为何空气消毒机选用LCD段码液晶屏,它有何优势
今日传感财经:温度传感器概念报涨;屏下摄像概念报涨;气体传感器概念报涨
使用ESP32在OLED上显示时间的方式
iOS10.3正式版更新释出!iPhone用户别错过6大新功能!
使用BGA开始PCB布局布线
恩智浦有线机顶盒(STB)硅调谐器TDA18250A
深度解读移动通信技术发展的文化传媒及未来趋势
免费录音软件下载有哪些
谷歌部署3D打印创建可穿戴传感器
全球首发竹纤维振膜 真香顶配OPPO Enco Free3发布
音响该如何挑选 千元级别音响分享
【机器视觉】欢创播报 | 英伟达为中国开发特供芯片
STV6110A/STV0903 全新卫星数字高清电视机顶盒
华为怎么了?华为荣耀8,竟然比华为荣耀V8还更贵了!
农业局农残检测仪器设备的特点是什么
到底是买华为P10还是三星S8?得好好想想
Visual Studio Code正在兴起,成为最受欢迎的编辑器