Toggle navigation
首页
(current)
问答
文章
话题
商城
登录
注册
X、合宙Air模块Luat开发:全网首发,通过iic直接驱动OLED,720Sl开始有显时代
Lua
720SL
驱动
iic
OLED
教程
全网首发,通过iic直接驱动OLED,720Sl开始有显时代
# 目录 [点击这里查看所有博文](https://blog.csdn.net/weixin_44570083/article/details/104285283) > 本系列博客,理论上适用于合宙的Air202、Air268、Air720x、Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持)。 > 先不管支不支持,如果你用的是合宙的模块,那都不妨一试,也许会有意外收获 我使用的是Air720SL模块,如果在其他模块上不能用,那就是底层core固件暂时还没有支持,这里的代码是没有问题的。例程仅供参考! # 一、前言 > 这里我把博客标题设置为X,是因为本系列教程按照正常的学习顺序,不应该先发OLED驱动,还有好多基础知识都还没讲到,本系列教程截至今日,才讲到模拟量采集,所以看本篇博客大家可能会有点不知所云 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225142340236.png) > 用过2g模块的同志,应该知道2g模块官方支持disp驱动库,直接调用库函数就可以很简单实现oled或者lcd驱动 > > 但是!!!4g模块暂时还没有disp驱动(后续应该会支持),所以现在是无法直接调用库函数驱动OLED的!!!!! > ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225142458600.png) > 所谓没有条件那就创造条件,正好这几天闲的没事干,研究了一下通过iic直接驱动OLED,在逻辑分析仪没有带回来的情况下,运气好到爆竟然把驱动调试出来了这里要感谢社区大神`Miuser`没有他帮助调试那么今天就见不到这篇文章了,既然驱动开发出来了本着开源的思想,就把OLED驱动分享出来,独乐乐不如众乐乐 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225142203906.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70) >这里我提供`两种`驱动OLED的方式, * 第一种驱动是实时从字库读取字模,用到谁就读谁,然后直接通过iic找到对应的地址写入,实时读写。这种驱动没有缓存,所占用的内存极小,同时刷屏速度也较低,刷屏速度取决与读取字库的速度,只要文件没有读取出来,就算iic速度再快也不行,这就是传说中的木桶短板效应 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225122128636.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70) > 木桶定律是讲一只水桶能装多少水取决于它最短的那块木板 。一只木桶想盛满水,必须每块木板都一样平齐且无破损,如果这只桶的木板中有一块不齐或者某块木板下面有破洞,这只桶就无法盛满水。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225142917102.png) * 第二种驱动方式是建立一个128*64 bit的缓存区,所需要的缓存是1K字节ram,这种方法刷新速度理论上要比第一种驱动要快,虽然第二种驱动流程多了一步,但是用户只能在最后一步能感受到刷屏已经开始,所以第二种驱动方式给人的感觉刷屏是更快的 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225122552131.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70) > 但是第二种驱动方式是全屏刷新,每次刷新数据都较多,所以在低速iic上,刷新速度优势不是特别明显,高速iic刷新速度是低速iic的刷新速度的四倍 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225122503330.png) > 我现在使用的是测试版本v0009,`目前官方发布的版本是v0008,很不幸v0008的iic驱动时序有问题,并不能点亮oled`,据内部消息近期应该会更新v0009到时候小伙伴们就能愉快的玩耍了 > 我现在使用的v0009其实也有问题,高速iic并不能点亮oled,所以我这里第二种驱动方式优势并不明显,想体验丝滑般流畅,还得等等 # 二、编写第1版测试程序(不带缓存) > 第一版测试程序实际我只做了英文字库驱动,也不支持多字库兼容,也不支持画图形。后来因为改写第二版驱动,个人时间有限,第一版驱动中文字库支持还是由社区大神`Miuser`实现的,不过目前的功能也比较简单,`只支持16X16的中文和16X8的ascii字库`,后面我也懒得改了,就暂时这样 ## 1、目录说明 > 文章末尾我会提供库文件以及字库的下载地址 > 第1版测试程序目录结构如下 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225130206623.png) * `ASCII_lib.bin`: 16*8 Ascii字库二进制文件,直接随同lua脚本一起下载即可 * `GB2312_lib.bin`: 16*16 GB2312字库二进制文件,直接随同lua脚本一起下载即可 * `i2c_ssd1306_oled.lua`: IIC ssd1306 OLED屏驱动库 * `main.lua`: DEMO文件 注意:文件名不建议更改,如果更改了文件名,需要把驱动库中的用户配置区也一并更改,此字库`不兼容第二版oled驱动程序`,不要随意替换,`不支持第三方字库` ## 2、用户配置 本驱动支持2g模块和4g模块,需要用户改动的库文件如下,只要把字库文件地址改下就行了 ```c ------------------------------------------------------------------------------------ -------------------------------用户配置区域------------------------------------------ ------------------------------------------------------------------------------------ --local fontfile_ascii = "/ldata/ASCII_lib.bin" --字库文件的地址,2G模块 --local fontfile_gb2312 = "/ldata/GB2312_lib.bin" --字库文件的地址,2G模块 local fontfile_ascii = "/lua/ASCII_lib.bin" --字库文件的地址,4G模块 local fontfile_gb2312 = "/lua/GB2312_lib.bin" --字库文件的地址,4G模块 local iicspeed = i2c.SLOW --iic速度,100K --local iicspeed = i2c.FAST --iic速度,400K。在720sl上点不亮,2g模块可以使用高速iic local i2cid = 0 --iicid,需要根据接线而定,默认iic1 local i2cslaveaddr = 0x3C --从机地址,如果是八位地址,需要向右移动一位。我这个模块说明书给的地址是0x78,右移动一位就是0x3c ``` ## 3、函数说明 接下来我做一下函数说明 ```c ------------------------------------------------------------------------------------ -------------------------------函数说明--------------------------------------------- ------------------------------------------------------------------------------------ --[[ * @description: 清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! * @param {type} 无 * @return: 无 function OLED_Clear() ]] --[[ * @description: 初始化OLED, * @param {type} :无 * @return: 无 function OLED_Init() ]] --[[ * @description: 在指定位置显示一个字符,包括部分字符 * @param {type} :-----x:0~127 ----------------------y:0~6 ----------------------0第一行,2第二行,4第三行,6第四行 ----------------------Show_char:要显示的字符 ----------------------isChinese:是中文就填入1,英文就忽略 * @return: 无 function OLED_ShowChar(x, y, Show_char, isChinese) ]] --[[ * @description: 在指定坐标起始处显示字符串 * @param {type} :-----x:0~127 ----------------------y:0~6 ----------------------0第一行,2第二行,4第三行,6第四行 ----------------------Show_char:要显示的字符串,支持中文 * @return: 无 function OLED_ShowString(x, y, ShowStr) ]] ``` ## 4、编写测试程序代码 ```c --必须在这个位置定义PROJECT和VERSION变量 --PROJECT:ascii string类型,可以随便定义,只要不使用,就行 --VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义 PROJECT = "LED" VERSION = "0.0.1" require "sys" require "common" --加载日志功能模块,并且设置日志输出等级 --如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可 require "log" LOG_LEVEL = log.LOGLEVEL_TRACE local oled = require "i2c_ssd1306_oled"--包含库文件 local function Test_Task() oled.OLED_Init() oled.OLED_Clear() while true do log.info("Test_Task_run") oled.OLED_ShowChar(0, 0, '6',0)--显示一个asill字符 oled.OLED_ShowString(40, 0, "abcdefghijklmnopqrstuvwxyz")--显示英文字符串,超出一行会自动换行 oled.OLED_ShowString(0, 4, common.utf8ToGb2312("合宙,你好") )--显示中文字符串 sys.wait(2000) end end local function user_main() --显示内容 sys.wait(10000) sys.taskInit(Test_Task) end --启动系统框架 sys.taskInit(user_main) sys.init(0, 0) sys.run() ``` ## 5、下载程序到开发板 实验效果如下 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225124705910.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70) # 二、编写第2版测试程序(带缓存) > 第2版驱动,支持在任意地方画矩形。 > 支持显示不同大小的中文和英文字库,目前做了`12X6、16X8、24X12的ascii字库支持 和12X12、16X16、24X24的中文字库显示` > 近期不打算改了,后续可能还会增加二维码显示,有能力朋友可以先试试,搞出来跟我讲下,顺便学习学习 ## 1、目录说明 > 文章末尾我会提供库文件以及字库的下载地址 > 第2版测试程序目录结构如下 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020022513205237.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70) * `ASCII_12X6.bin`: 12*6 Ascii字库二进制文件,直接随同lua脚本一起下载即可 * `ASCII_16X8.bin`: 16*8 Ascii字库二进制文件,直接随同lua脚本一起下载即可 * `ASCII_24X12.bin`: 24*12 Ascii字库二进制文件,直接随同lua脚本一起下载即可 * `GB2312_12X12.bin`: 12*12 GB2312字库二进制文件,直接随同lua脚本一起下载即可 * `GB2312_16X16.bin`: 16*16 GB2312字库二进制文件,直接随同lua脚本一起下载即可 * `GB2312_24X24.bin`: 24*24 GB2312字库二进制文件,直接随同lua脚本一起下载即可,这个文件过大,全部下载就会超出了脚本区大小,单独下载应该没问题(我没有测试),也就是说只能下载这一个字库,其他的五个字库可以一同下载 * `i2c_ssd1306_oled.lua`:IIC ssd1306 OLED屏驱动库 * `main.lua`:DEMO文件 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225132632653.png) 注意:文件名不建议更改,如果更改了文件名,需要把驱动库中的用户配置区也一并更改,此字库`不兼容第一版oled驱动程序`,不要随意替换,`不支持第三方字库` ## 2、用户配置 本驱动支持2g模块和4g模块,需要改动的库文件如下,只要把字库文件地址改下就行了 ```c ------------------------------------------------------------------------------------ -------------------------------用户配置区域------------------------------------------ ------------------------------------------------------------------------------------ --local Size_address = "ldata" --字库文件的地址,2G模块 local Size_address = "lua" --字库文件的地址,4G模块 local Size_12X6_name = "ASCII_12X6.bin" --ascll字库名称 local Size_16X8_name = "ASCII_16X8.bin" local Size_24X12_name = "ASCII_24X12.bin" --通过Luatools烧写的所有文件,都存放在此区域,目前总空间为524KB,所以中文字库不能三个全部一起下载 local FontSize_12X12_name = "GB2312_12X12.bin" --GB2312中文字库名称 local FontSize_16X16_name = "GB2312_16X16.bin" local FontSize_24X24_name = "GB2312_24X24.bin" local iicspeed = i2c.SLOW --iic速度,100K --local iicspeed = i2c.FAST --iic速度,400K。在720sl上点不亮,2g模块可以使用高速iic local i2cid = 0 --iicid,需要根据接线而定,默认iic1 local i2cslaveaddr = 0x3C --从机地址,如果是八位地址,需要向右移动一位。我这个模块说明书给的地址是0x78,右移动一位就是0x3c ``` ## 3、函数说明 接下来我做一下函数说明 ```c ------------------------------------------------------------------------------------ -------------------------------函数说明--------------------------------------------- ------------------------------------------------------------------------------------ --[[ * @description: 更新缓存数据,到oled,操作后,必须更新,否则不会生效 * @param {type} :无 * @return: 无 function OLED_Refresh_Gram() *]] --[[ * @description: 开启OLED显示 * @param {type} 无 * @return: 无 function OLED_Display_On() ]] --[[ * @description: 关闭OLED显示 * @param {type} 无 * @return: 无 function OLED_Display_Off() ]] --[[ * @description: 清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! * @param {type} 无 * @return: 无 function OLED_Clear() ]] --[[ * @description: 画矩形 * @param {type} :确保x1<=x2 y1<=y2 1<=x1<=128 1<=y1<=64 dot:0,清空 1,填充 * @return: 无 function OLED_Fill(x1, y1, x2, y2, dot) ]] --[[ * @description: 在指定位置显示一个字符,包括部分字符 * @param {type} :-----x:1~128 ----------------------y:1~64 ----------------------Show_char:要显示的字符 ----------------------size:选择字体 12/16/24 ----------------------mode:0,反白显示 1,正常显示 * @return: 无 function OLED_ShowChar(x, y, Show_char, size, mode) ]] --[[ * @description: 在指定坐标起始处显示字符串 * @param {type} :--x:1~128 -------------------y:1~64 -------------------ShowStr:要显示的字符串 -------------------size:选择字体 12/16/24 -------------------mode:0,反白显示 1,正常显示 * @return: 无 function OLED_ShowString(x, y, ShowString, size, mode) ]] --[[ * @description: 在指定坐标起始处显示一个汉字 * @param {type} :--x:1~128 -------------------y:1~64 -------------------UTF8_ShowFont:要显示的字符串 -------------------size:选择字体 12/16/24 -------------------mode:0,反白显示 1,正常显示 * @return: 无 function OLED_ShowFont(x, y, UTF8_ShowFont, size, mode) ]] --[[ * @description: 在指定坐标起始处显示一堆汉字 * @param {type} :--x:1~128 -------------------y:1~64 -------------------UTF8_ShowFonts:要显示的一堆汉字, -------------------size:选择字体 12/16/24 -------------------mode:0,反白显示 1,正常显示 * @return: 无 function OLED_ShowFonts(x, y, UTF8_ShowFonts, size, mode) ]] --[[ * @description: 初始化OLED, * @param {type} :无 * @return: 无 function OLED_Init() ]] ``` ## 4、编写测试程序代码 ```c --必须在这个位置定义PROJECT和VERSION变量 --PROJECT:ascii string类型,可以随便定义,只要不使用,就行 --VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义 PROJECT = "LED" VERSION = "0.0.1" require "sys" --加载日志功能模块,并且设置日志输出等级 --如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可 require "log" LOG_LEVEL = log.LOGLEVEL_TRACE local oled = require "i2c_ssd1306_oled" local function Test_Task() oled.OLED_Init()--初始化 while true do log.info("Test_Task_run") oled.OLED_ShowString(1, 1, "abcdefghijklmnopqrstuvwxyz", 12, 1)--正常显示一堆12*6的ascii字符,会自动换行 oled.OLED_ShowChar(50, 20, '6', 16, 0)--反白显示一个16*8的ascii字符 oled.OLED_ShowFont(90, 20, "哈", 16, 1)--正常显示一个16*16的中文汉字 oled.OLED_ShowFonts(1, 40, "合宙,你好", 12, 0)--反白显示一堆12*12的中文汉字,会自动换行 oled.OLED_Fill(70, 40, 90, 60, 1)--画一个正方形 oled.OLED_Refresh_Gram()--更新显存 sys.wait(2000) end end local function user_main() --显示内容 sys.wait(10000) sys.taskInit(Test_Task) end --启动系统框架 sys.taskInit(user_main) sys.init(0, 0) sys.run() ``` ## 5、下载程序到开发板 实验效果如下 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020022513513421.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70) # 四、总结 ## 1、本片博客涉及到的OLED驱动 下载地址:[点击这里](https://download.csdn.net/download/weixin_44570083/12190546) 开发不易,收几个积分,望理解 ## 2、第1种驱动能用的库函数 * `OLED_Clear()`:清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! * `OLED_Init()`:初始化OLED * `OLED_ShowChar(x, y, Show_char, isChinese)`:在指定位置显示一个字符,包括部分字符 * `OLED_ShowString(x, y, ShowStr)`:在指定坐标起始处显示字符串 优点:占用内存极小,没有缓存,功能简单 缺点:速度慢 ## 3、第2种驱动能用的库函数 * `OLED_Refresh_Gram()`:更新缓存数据,到oled,操作后,必须更新,否则不会生效 * `OLED_Display_On()`:开启OLED显示 * `OLED_Display_Off()`:关闭OLED显示 * `OLED_Clear()`:清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! * `OLED_Fill(x1, y1, x2, y2, dot)`:画矩形 * `OLED_ShowChar(x, y, Show_char, size, mode)`:在指定位置显示一个字符,包括部分字符 * `OLED_ShowString(x, y, ShowString, size, mode)`:在指定坐标起始处显示字符串 * `OLED_ShowFont(x, y, UTF8_ShowFont, size, mode)`:在指定坐标起始处显示一个汉字 * `OLED_ShowFonts(x, y, UTF8_ShowFonts, size, mode)`:在指定坐标起始处显示一堆汉字 * `OLED_Init()`:初始化OLED 优点:速度快,比第一种驱动多一个功能,后续会继续增加新的功能 缺点:占用1k内存,有缓存 ## 4、再次提醒 * 现在时间是2020年2月25日,到目前为止官方的720sl固件只发布到v0008版本,因为v0008版本iic时序有问题,所以并不能通过本驱动点亮OLED。 * 目前我使用的v0009内测版本,只能通过低速iic点亮oled,高速iic并不能点亮,所以速度快的优势体现不出来。我不清楚正式版本会不会修复这个问题。 * 按照官方手册说明,高速iic比低速iic速度块4倍,修复这个问题后,oled刷新应该是丝滑般流畅 > 不会下载的[点击这里](https://blog.csdn.net/weixin_44570083/article/details/104285283),进去查看我的第二篇博文`2、Air720SL模块Luat开发:第一个Luat的Hello World`里面讲了怎么下载 > 这里只是我的学习笔记,拿出来给大家分享,欢迎大家批评指正,本篇教程到此结束
发表于 2020-02-25 14:47
阅读 ( 2709 )
分类:
默认分类
8 推荐
收藏
你可能感兴趣的文章
11、合宙Air模块Luat开发:通过http协议获取天气信息
2415 浏览
记录720S系列使用阿里云升级过程中遇到的坑
1880 浏览
10、合宙Air模块Luat开发:JSON字符串的生成与解析
2274 浏览
9、合宙Air模块Luat开发:认识NVS数据管理模块
1983 浏览
8、合宙Air模块Luat开发:基于官方库的二次封装,使串口更加易用
2531 浏览
7、合宙Air模块Luat开发:定时器的使用方法
2121 浏览
相关问题
air202,用mqtt协议连接onenet平台(lua)。
1 回答
请问lua中number类型的浮点数有没有快速的函数将其转换成按字节存储的table变量
1 回答
关于字符串中按位写入数值的问题
1 回答
Lua数据处理问题
2 回答
0 条评论
请先
登录
后评论
陈夏
26 篇文章
作家榜
»
技术销售Delectate
43 文章
陈夏
26 文章
国梁
24 文章
miuser
21 文章
晨旭
20 文章
朱天华
19 文章
金艺
19 文章
杨奉武
18 文章
×
发送私信
发给:
内容:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!