搜索
bottom↓
回复: 0

《ESP32-S3使用指南—MicroPython版 V1.0》第十五章 OLED实验

[复制链接]

出0入234汤圆

发表于 5 天前 | 显示全部楼层 |阅读模式
本帖最后由 正点原子 于 2024-8-20 17:32 编辑

2.jpg
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
1.png
3.png

第十五章 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所示:

1.png
表15.1.1 OLED模块接口方式设置表

       表15.1.1中:“1”代表接VCC,而“0”代表接GND。该模块的外观图如图24.1.1所示:

第十五章 OLED实验977.png
图15.1.1 正点原子 OLED模块外观图

       正点原子 OLED模块默认设置是:BS1和BS2接VCC,即使用8080并口方式,如果你想要设置为其他模式,则需要在OLED的背面,用烙铁修改BS1和BS2的设置。模块的原理图如图15.1.2所示:

第十五章 OLED实验1102.png
图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构造函数
  1. mp_obj_t oled_make_new(const mp_obj_type_t *type,size_t n_args,size_t n_kw,
  2. const mp_obj_t *all_args )
  3. {
  4.     /* 创建对象的参数 */
  5.     enum
  6.     {
  7.         ARG_iic,
  8.     };

  9.     static const mp_arg_t allowed_args[] = {
  10.         { MP_QSTR_iic, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_OBJ_NULL} },
  11.     };
  12.     mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
  13. mp_arg_parse_all_kw_array(n_args, n_kw, all_args,
  14.                           MP_ARRAY_SIZE(allowed_args), allowed_args, args);
  15.    
  16.     /* 创建对象 */
  17.     oled_self = m_new_obj(oled_obj_t);
  18.     oled_self->base.type = &oled_type;
  19.     /* 设置对象参数 */
  20. mp_obj_base_t *oled_obj   =
  21.                       (mp_obj_base_t*)MP_OBJ_TO_PTR(args[ARG_iic].u_obj);

  22.     if (oled_obj == MP_OBJ_NULL)
  23.     {
  24.         mp_raise_ValueError(MP_ERROR_TEXT("I2C init ???"));
  25.     }

  26.     oled_self->iic_obj        = oled_obj;
  27.     /* 初始化OLED */
  28.     oled_init();
  29.    
  30.     return MP_OBJ_FROM_PTR(oled_self);
  31. }
复制代码
       从上述源代码中可以得知,该构造函数只有一个参数,即传入IIC驱动的控制块。我们可以通过这个控制块调用IIC驱动下的收发函数。然后,我们还创建了一个XL9555对象,用于实例化对象并引用类的方法。最后,调用了oled_init函数来初始化OLED模块。

       2,OLED写时序
  1. /**
  2. * @brief       oled IIC写数据
  3. * @param       i2c_num :IIC端口号
  4. * @param       data    :发送的数据或者命令
  5. * @param       len     :发送数据的大小
  6. * @retval      ESP_OK:发送成功;其他:发送失败
  7. */
  8. esp_err_t oled_write(uint8_t* data, size_t len)
  9. {
  10.     int data_len = 0;
  11.     mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(oled_self->iic_obj);
  12. mp_machine_i2c_p_t *i2c_p = (mp_machine_i2c_p_t *)
  13. MP_OBJ_TYPE_GET_SLOT(self->type, protocol);

  14.     mp_machine_i2c_buf_t bufs = {
  15.         .len = len,
  16.         .buf = data,
  17.     };

  18. data_len = i2c_p->transfer(self,OLED_ADDR,1,
  19. &bufs, MP_MACHINE_I2C_FLAG_STOP);
  20.    
  21.     if (data_len != 0)
  22.     {
  23.         return ESP_OK;
  24.     }
  25.     else
  26.     {
  27.         return ESP_FAIL;
  28.     }
  29. }
复制代码
       此函数也是通过调用IIC控制块下的收发函数来发送数据和命令。其他函数,如画线、画点等,请参考oled.c/.h文件。

       15.2.2 C模块构造与类的方法

       1,atk_oled类的构造函数
       在 MicroPython 中oled对象的构造函数如下:
  1. class atk_oled.init(iic)
  2. 使用示例:
  3. i2c0 = I2C(0, scl = Pin(42), sda = Pin(41), freq = 400000)
  4. oled = atk_oled.init(i2c0)
复制代码
       该构造函数的参数描述,如下表所示。

2.png
表15.1.1 atk_oled.init构造函数参数描述

       返回值:OLED对象。

       2,oled类的方法

       ①:打开OLED背光。
       其函数原型如下:
  1. oled.on()
复制代码

       ②:关闭OLED背光。
       其函数原型如下:
  1. oled.off()
复制代码

       ③:OLED清屏。
       其函数原型如下:
  1. oled.clear()
复制代码

       ④:OLED画点。
       其函数原型如下:
  1. oled.point(x,y,t)
复制代码
       该函数的参数描述,如下表所示。

3.png
表15.1.2 oled.point函数参数描述

       ⑤:OLED填充函数
       其函数原型如下:
  1. oled.fill(x1,y1,x2,y2,dot)
复制代码
       该函数的参数描述,如下表所示。

4.png
表15.1.3 oled.fill函数参数描述

       ⑥:OLED显示单字符
       其函数原型如下:
  1. oled.char(x,y,chr,size,mode)
复制代码
       该函数的参数描述,如下表所示。

5.png
表15.1.4 oled.char函数参数描述

       ⑦:OLED显示数字
       其函数原型如下:
  1. oled.num(x,y,num,len,size)
复制代码
       该函数的参数描述,如下表所示。

6.png
表15.1.5 oled.num函数参数描述

       ⑧:OLED显示字符串
       其函数原型如下:
  1. oled.string(x,y,p,size)
复制代码
       该函数的参数描述,如下表所示。

7.png
表15.1.6 oled.string函数参数描述

       ⑨:更新显存到OLED
       其函数原型如下:
  1. oled.refresh_gram()
复制代码

       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模块直接对插(靠左插!),连接如下图所示。

第十五章 OLED实验4892.png
图15.3.1 OLED模块与开发板连接示意图

       我们只需要将OLED模块插上去就好了。实物连接如下图所示。

第十五章 OLED实验4948.png
图15.3.2 OLED模块与开发板连接实物图

       15.4 软件设计

       15.3.1 程序流程图
       程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:

第十五章 OLED实验5084.png
图15.3.1.1 程序流程图

       15.3.2 程序解析
       本书籍的代码都在main.py脚本下编写的,读者可在光盘资料下找到对应的源码。OLED实验main.py源码如下:
  1. from machine import Pin,I2C
  2. import atk_xl9555 as io_ex
  3. import atk_oled as oled
  4. import time


  5. """
  6. * @brief       程序入口
  7. * @param       无
  8. * @retval      无
  9. """
  10. if __name__ == '__main__':
  11.    
  12.     # 初始化LED并输出高电平
  13.     led = Pin(46,Pin.OUT,value = 1)
  14.     # IIC初始化
  15.     i2c0 = I2C(0, scl = Pin(42), sda = Pin(41), freq = 400000)
  16.     i2c1 = I2C(1, scl = Pin(4), sda = Pin(5), freq = 400000)
  17. # start:以下是使用正点原子OLED模块IIC通讯所必备的设置,
  18. 如果使用四线OLED模块,可删除start~end区域的代码
  19.     xl9555 = io_ex.init(i2c0)
  20.     dc = Pin(38,Pin.OUT,value = 0)

  21.     # 复位OLED
  22.     xl9555.write_bit(io_ex.OV_RESET,0)
  23.     time.sleep_ms(100)
  24.     xl9555.write_bit(io_ex.OV_RESET,1)
  25.     time.sleep_ms(100)
  26.     # end
  27.    
  28.     # 初始化OLED,默认设置:oled.init(port = 1,sda = 5,scl = 4,freq = 200000)
  29.     display = oled.init(i2c1)
  30.    
  31.     # 显示实验信息
  32.     display.string(0,0,str("ALIENTEK"),24)
  33.     display.string(0,24,str("0.96' OLED TEST"),16)
  34.     display.string(0,40,str("ATOM 2023/09/13"),12)
  35.     display.string(0,52,str("ASCII:"),12)
  36.     display.string(64,52,str("CODE:"),12)
  37.     display.refresh_gram()
  38.    
  39.     t = ' '
  40.    
  41.     while True:
  42.         
  43.         # 显示ASCII字符
  44.         display.char(36,52,t,12,1)
  45.         # 显示ASCII字符的码值
  46.         display.num(94,52,ord(t),3,12)
  47.         # 更新显示到OLED
  48.         display.refresh_gram()

  49.         t = chr(ord(t) + 1)

  50.         if t > '~':
  51.         
  52.             t = ' '
  53.         
  54.         time.sleep_ms(500)
复制代码
       main.py主要功能就是在OLED上显示一些实验信息字符,然后开始从空格键开始不停的循环显示ASCII字符集,并显示该字符的ASCII值。最后LED闪烁提示程序正在运行。
       需要注意的是:上述的示例是使用正点原子OLED实现的(SPI模式,需用户修改硬件),如果用户想使用四线OLED,也可以使用上述的代码,需使用杜邦线连接四线的OLED模块。

       15.5 下载验证
       下载代码后,LED不停的闪烁,提示程序已经在运行了。同时OLED模块显示ASCII字符集等信息,如下图所示。

第十五章 OLED实验6781.png
图15.5.1 OLED显示效果

       OLED显示了三种尺寸的字符:24*12(ALIENTEK)、16*8(0.96’ OLED TEST)和12*6(剩下的内容)。说明我们的实验是成功的,实现了三种不同尺寸ASCII字符的显示,在最后一行不停的显示ASCII字符以及其码值。
       通过这一章的学习,我们学会了正点原子OLED模块的使用,在调试代码的时候,又多了一种显示信息的途径,在以后的程序编写中,大家可以好好利用。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 06:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表