|
本帖最后由 正点原子 于 2024-8-20 17:32 编辑
1)实验平台:正点原子ESP32S3开发板
2)购买链接:https://detail.tmall.com/item.htm?id=768499342659
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-347618-1-1.html
4)正点原子官方B站:https://space.bilibili.com/394620890
5)正点原子手把手教你学ESP32S3快速入门视频教程:https://www.bilibili.com/video/BV1sH4y1W7Tc
6)正点原子FPGA交流群:132780729
第十五章 OLED实验
在本章实验中,我们将通过编写MicroPython驱动程序来实现OLED显示。在开发板上,我们已经预留了OLED模块接口,因此需要准备一个OLED显示模块。我们将一起点亮OLED,并实现ASCII字符的显示。
15.1 OLED模块简介
15.2 OLED C模块解析
15.3 硬件设计
15.4 软件设计
15.5 下载验证
15.1 OLED模块简介
OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display,OLED)。OLED可按发光材料分为两种:小分子OLED和高分子OLED(也可称为PLED)。OLED是一种利用多层有机薄膜结构产生电致发光的器件,它很容易制作,而且只需要低的驱动电压,OLED由于同时具备自发光(不需背光源)、对比度高、厚度薄、视角广、反应速度快、功耗低、柔性好等优异特性,目前主要用于显示领域,OLED在节能照明领域的开发也成为全球趋势。
本章我们将介绍ALINETEK的OLED显示模块及其使用方法,该模块有以下特点:
1)模块有单色和双色两种可选,单色为纯蓝色,而双色则为黄蓝双色(分区域的双色,前16行为黄色,后48行为蓝色,且黄蓝色之间有一行不显示的间隔区)。
2)尺寸小,显示尺寸为0.96寸,而模块的尺寸仅为27mm*26mm大小。
3)高分辨率,该模块的分辨率为128*64。
4)多种接口方式,该模块提供了总共4种接口包括:6800、8080两种并行接口方式、4线SPI接口方式以及IIC接口方式(只需要2根线就可以控制OLED了!)。
5)不需要高压,直接接3.3V就可以工作了。
这里要提醒大家的是,该模块不和5.0V接口兼容,所以请大家在使用的时候一定要小心,别直接接到5V的系统上去,否则可能烧坏模块。以下4种模式通过模块的BS1和BS2设置,BS1和BS2的设置与模块接口模式的关系如表24.1.1所示:
表15.1.1 OLED模块接口方式设置表
表15.1.1中:“1”代表接VCC,而“0”代表接GND。该模块的外观图如图24.1.1所示:
图15.1.1 正点原子 OLED模块外观图
正点原子 OLED模块默认设置是:BS1和BS2接VCC,即使用8080并口方式,如果你想要设置为其他模式,则需要在OLED的背面,用烙铁修改BS1和BS2的设置。模块的原理图如图15.1.2所示:
图15.1.2 正点原子 OLED模块原理图
该模块采用8*2的2.54排针与外部连接,总共有16个管脚,在16条线中,我们只用了15条,有一个是悬空的。15条线中,电源和地线占了2条,还剩下13条信号线。在不同模式下,我们需要的信号线数量是不同的,在8080模式下,需要全部13条,而在IIC模式下,仅需要2条线就够了!这其中有一条是共同的,那就是复位线RST(RES),RST上的低电平,将导致OLED复位,在每次初始化之前,都应该复位一下OLED模块。
正点原子 OLED模块的控制器是SSD1306,本章,我们将学习如何通过ESP32S3来控制该模块显示字符和数字,本章的实例代码仅支持IIC方式与OLED模块连接,这种方式需对OLED硬件整改,整改流程请参考正点原子提供的OLED手册,在这个手册里面,已经详细介绍IIC模式的硬件设置流程。
15.2 OLED C模块解析
15.2.1 C模块解析
作者将简要介绍正点原子OLED C模块驱动。这个讲解内容会分为几个部分:OLED构造函数、写入数据。OLED C模块驱动可在A盘6,软件资料1,软件2,MicroPython开发工具01-Windows2,正点原子MicroPython驱动CModules_LibIIC路径下找到。
1,OLED构造函数
- mp_obj_t oled_make_new(const mp_obj_type_t *type,size_t n_args,size_t n_kw,
- const mp_obj_t *all_args )
- {
- /* 创建对象的参数 */
- enum
- {
- ARG_iic,
- };
- static const mp_arg_t allowed_args[] = {
- { MP_QSTR_iic, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_OBJ_NULL} },
- };
- mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
- mp_arg_parse_all_kw_array(n_args, n_kw, all_args,
- MP_ARRAY_SIZE(allowed_args), allowed_args, args);
-
- /* 创建对象 */
- oled_self = m_new_obj(oled_obj_t);
- oled_self->base.type = &oled_type;
- /* 设置对象参数 */
- mp_obj_base_t *oled_obj =
- (mp_obj_base_t*)MP_OBJ_TO_PTR(args[ARG_iic].u_obj);
- if (oled_obj == MP_OBJ_NULL)
- {
- mp_raise_ValueError(MP_ERROR_TEXT("I2C init ???"));
- }
- oled_self->iic_obj = oled_obj;
- /* 初始化OLED */
- oled_init();
-
- return MP_OBJ_FROM_PTR(oled_self);
- }
复制代码 从上述源代码中可以得知,该构造函数只有一个参数,即传入IIC驱动的控制块。我们可以通过这个控制块调用IIC驱动下的收发函数。然后,我们还创建了一个XL9555对象,用于实例化对象并引用类的方法。最后,调用了oled_init函数来初始化OLED模块。
2,OLED写时序
- /**
- * @brief oled IIC写数据
- * @param i2c_num :IIC端口号
- * @param data :发送的数据或者命令
- * @param len :发送数据的大小
- * @retval ESP_OK:发送成功;其他:发送失败
- */
- esp_err_t oled_write(uint8_t* data, size_t len)
- {
- int data_len = 0;
- mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(oled_self->iic_obj);
- mp_machine_i2c_p_t *i2c_p = (mp_machine_i2c_p_t *)
- MP_OBJ_TYPE_GET_SLOT(self->type, protocol);
- mp_machine_i2c_buf_t bufs = {
- .len = len,
- .buf = data,
- };
- data_len = i2c_p->transfer(self,OLED_ADDR,1,
- &bufs, MP_MACHINE_I2C_FLAG_STOP);
-
- if (data_len != 0)
- {
- return ESP_OK;
- }
- else
- {
- return ESP_FAIL;
- }
- }
复制代码 此函数也是通过调用IIC控制块下的收发函数来发送数据和命令。其他函数,如画线、画点等,请参考oled.c/.h文件。
15.2.2 C模块构造与类的方法
1,atk_oled类的构造函数
在 MicroPython 中oled对象的构造函数如下:
- class atk_oled.init(iic)
- 使用示例:
- i2c0 = I2C(0, scl = Pin(42), sda = Pin(41), freq = 400000)
- oled = atk_oled.init(i2c0)
复制代码 该构造函数的参数描述,如下表所示。
表15.1.1 atk_oled.init构造函数参数描述
返回值:OLED对象。
2,oled类的方法
①:打开OLED背光。
其函数原型如下:
②:关闭OLED背光。
其函数原型如下:
③:OLED清屏。
其函数原型如下:
④:OLED画点。
其函数原型如下:
该函数的参数描述,如下表所示。
表15.1.2 oled.point函数参数描述
⑤:OLED填充函数
其函数原型如下:
- oled.fill(x1,y1,x2,y2,dot)
复制代码 该函数的参数描述,如下表所示。
表15.1.3 oled.fill函数参数描述
⑥:OLED显示单字符
其函数原型如下:
- oled.char(x,y,chr,size,mode)
复制代码 该函数的参数描述,如下表所示。
表15.1.4 oled.char函数参数描述
⑦:OLED显示数字
其函数原型如下:
- oled.num(x,y,num,len,size)
复制代码 该函数的参数描述,如下表所示。
表15.1.5 oled.num函数参数描述
⑧:OLED显示字符串
其函数原型如下:
该函数的参数描述,如下表所示。
表15.1.6 oled.string函数参数描述
⑨:更新显存到OLED
其函数原型如下:
15.3 硬件设计
1. 例程功能
本章实验功能简介:使用IIC模式驱动OLED模块,不停的显示ASCII码和码值。LED闪烁,提示程序运行。
2. 硬件资源
1)LED灯
LED-IO1
2)XL9555
IIC_INT-IO0(需在P5连接IO0)
IIC_SDA-IO41
IIC_SCL-IO42
3)OLED
IIC_SCL-IO4
IIC_SDA-IO5
OLED_RST-IO0_5(XL9555)
3. 原理图
OLED模块的原理图在前面已有详细说明了,这里我们介绍OLED模块与我们开发板的连接,开发板上有一个OLED/CAMERA的接口(P2接口)可以和正点原子OLED模块直接对插(靠左插!),连接如下图所示。
图15.3.1 OLED模块与开发板连接示意图
我们只需要将OLED模块插上去就好了。实物连接如下图所示。
图15.3.2 OLED模块与开发板连接实物图
15.4 软件设计
15.3.1 程序流程图
程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:
图15.3.1.1 程序流程图
15.3.2 程序解析
本书籍的代码都在main.py脚本下编写的,读者可在光盘资料下找到对应的源码。OLED实验main.py源码如下:
- from machine import Pin,I2C
- import atk_xl9555 as io_ex
- import atk_oled as oled
- import time
- """
- * @brief 程序入口
- * @param 无
- * @retval 无
- """
- if __name__ == '__main__':
-
- # 初始化LED并输出高电平
- led = Pin(46,Pin.OUT,value = 1)
- # IIC初始化
- i2c0 = I2C(0, scl = Pin(42), sda = Pin(41), freq = 400000)
- i2c1 = I2C(1, scl = Pin(4), sda = Pin(5), freq = 400000)
- # start:以下是使用正点原子OLED模块IIC通讯所必备的设置,
- 如果使用四线OLED模块,可删除start~end区域的代码
- xl9555 = io_ex.init(i2c0)
- dc = Pin(38,Pin.OUT,value = 0)
- # 复位OLED
- xl9555.write_bit(io_ex.OV_RESET,0)
- time.sleep_ms(100)
- xl9555.write_bit(io_ex.OV_RESET,1)
- time.sleep_ms(100)
- # end
-
- # 初始化OLED,默认设置:oled.init(port = 1,sda = 5,scl = 4,freq = 200000)
- display = oled.init(i2c1)
-
- # 显示实验信息
- display.string(0,0,str("ALIENTEK"),24)
- display.string(0,24,str("0.96' OLED TEST"),16)
- display.string(0,40,str("ATOM 2023/09/13"),12)
- display.string(0,52,str("ASCII:"),12)
- display.string(64,52,str("CODE:"),12)
- display.refresh_gram()
-
- t = ' '
-
- while True:
-
- # 显示ASCII字符
- display.char(36,52,t,12,1)
- # 显示ASCII字符的码值
- display.num(94,52,ord(t),3,12)
- # 更新显示到OLED
- display.refresh_gram()
- t = chr(ord(t) + 1)
- if t > '~':
-
- t = ' '
-
- time.sleep_ms(500)
复制代码 main.py主要功能就是在OLED上显示一些实验信息字符,然后开始从空格键开始不停的循环显示ASCII字符集,并显示该字符的ASCII值。最后LED闪烁提示程序正在运行。
需要注意的是:上述的示例是使用正点原子OLED实现的(SPI模式,需用户修改硬件),如果用户想使用四线OLED,也可以使用上述的代码,需使用杜邦线连接四线的OLED模块。
15.5 下载验证
下载代码后,LED不停的闪烁,提示程序已经在运行了。同时OLED模块显示ASCII字符集等信息,如下图所示。
图15.5.1 OLED显示效果
OLED显示了三种尺寸的字符:24*12(ALIENTEK)、16*8(0.96’ OLED TEST)和12*6(剩下的内容)。说明我们的实验是成功的,实现了三种不同尺寸ASCII字符的显示,在最后一行不停的显示ASCII字符以及其码值。
通过这一章的学习,我们学会了正点原子OLED模块的使用,在调试代码的时候,又多了一种显示信息的途径,在以后的程序编写中,大家可以好好利用。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|