X、合宙Air模块Luat开发:全网首发,通过iic直接驱动OLED,720Sl开始有显时代

目录

点击这里查看所有博文
  本系列博客,理论上适用于合宙的Air202、Air268、Air720x、Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持)。

  先不管支不支持,如果你用的是合宙的模块,那都不妨一试,也许会有意外收获
我使用的是Air720SL模块,如果在其他模块上不能用,那就是底层core固件暂时还没有支持,这里的代码是没有问题的。例程仅供参考!

一、前言

  这里我把博客标题设置为X,是因为本系列教程按照正常的学习顺序,不应该先发OLED驱动,还有好多基础知识都还没讲到,本系列教程截至今日,才讲到模拟量采集,所以看本篇博客大家可能会有点不知所云
X、合宙Air模块Luat开发:全网首发,通过iic直接驱动OLED,720Sl开始有显时代_第1张图片

  用过2g模块的同志,应该知道2g模块官方支持disp驱动库,直接调用库函数就可以很简单实现oled或者lcd驱动

  但是!!!4g模块暂时还没有disp驱动(后续应该会支持),所以现在是无法直接调用库函数驱动OLED的!!!!!

X、合宙Air模块Luat开发:全网首发,通过iic直接驱动OLED,720Sl开始有显时代_第2张图片

  所谓没有条件那就创造条件,正好这几天闲的没事干,研究了一下通过iic直接驱动OLED,在逻辑分析仪没有带回来的情况下,运气好到爆竟然把驱动调试出来了这里要感谢社区大神Miuser没有他帮助调试那么今天就见不到这篇文章了,既然驱动开发出来了本着开源的思想,就把OLED驱动分享出来,独乐乐不如众乐乐

  这里我提供两种驱动OLED的方式,

  • 第一种驱动是实时从字库读取字模,用到谁就读谁,然后直接通过iic找到对应的地址写入,实时读写。这种驱动没有缓存,所占用的内存极小,同时刷屏速度也较低,刷屏速度取决与读取字库的速度,只要文件没有读取出来,就算iic速度再快也不行,这就是传说中的木桶短板效应
    X、合宙Air模块Luat开发:全网首发,通过iic直接驱动OLED,720Sl开始有显时代_第3张图片
      木桶定律是讲一只水桶能装多少水取决于它最短的那块木板 。一只木桶想盛满水,必须每块木板都一样平齐且无破损,如果这只桶的木板中有一块不齐或者某块木板下面有破洞,这只桶就无法盛满水。
    X、合宙Air模块Luat开发:全网首发,通过iic直接驱动OLED,720Sl开始有显时代_第4张图片
  • 第二种驱动方式是建立一个128*64 bit的缓存区,所需要的缓存是1K字节ram,这种方法刷新速度理论上要比第一种驱动要快,虽然第二种驱动流程多了一步,但是用户只能在最后一步能感受到刷屏已经开始,所以第二种驱动方式给人的感觉刷屏是更快的
    X、合宙Air模块Luat开发:全网首发,通过iic直接驱动OLED,720Sl开始有显时代_第5张图片
      但是第二种驱动方式是全屏刷新,每次刷新数据都较多,所以在低速iic上,刷新速度优势不是特别明显,高速iic刷新速度是低速iic的刷新速度的四倍
    X、合宙Air模块Luat开发:全网首发,通过iic直接驱动OLED,720Sl开始有显时代_第6张图片
       我现在使用的是测试版本v0009,目前官方发布的版本是v0008,很不幸v0008的iic驱动时序有问题,并不能点亮oled,据内部消息近期应该会更新v0009到时候小伙伴们就能愉快的玩耍了
       我现在使用的v0009其实也有问题,高速iic并不能点亮oled,所以我这里第二种驱动方式优势并不明显,想体验丝滑般流畅,还得等等

二、编写第1版测试程序(不带缓存)

   第一版测试程序实际我只做了英文字库驱动,也不支持多字库兼容,也不支持画图形。后来因为改写第二版驱动,个人时间有限,第一版驱动中文字库支持还是由社区大神Miuser实现的,不过目前的功能也比较简单,只支持16X16的中文和16X8的ascii字库,后面我也懒得改了,就暂时这样

1、目录说明

   文章末尾我会提供库文件以及字库的下载地址

第1版测试程序目录结构如下
X、合宙Air模块Luat开发:全网首发,通过iic直接驱动OLED,720Sl开始有显时代_第7张图片

  • 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模块,需要用户改动的库文件如下,只要把字库文件地址改下就行了

------------------------------------------------------------------------------------
-------------------------------用户配置区域------------------------------------------
------------------------------------------------------------------------------------
--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、函数说明

  接下来我做一下函数说明

------------------------------------------------------------------------------------
-------------------------------函数说明---------------------------------------------
------------------------------------------------------------------------------------
--[[
* @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、编写测试程序代码

--必须在这个位置定义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、下载程序到开发板

  实验效果如下
X、合宙Air模块Luat开发:全网首发,通过iic直接驱动OLED,720Sl开始有显时代_第8张图片

二、编写第2版测试程序(带缓存)

   第2版驱动,支持在任意地方画矩形。
   支持显示不同大小的中文和英文字库,目前做了12X6、16X8、24X12的ascii字库支持 和12X12、16X16、24X24的中文字库显示
   近期不打算改了,后续可能还会增加二维码显示,有能力朋友可以先试试,搞出来跟我讲下,顺便学习学习

1、目录说明

   文章末尾我会提供库文件以及字库的下载地址

   第2版测试程序目录结构如下
X、合宙Air模块Luat开发:全网首发,通过iic直接驱动OLED,720Sl开始有显时代_第9张图片

  • 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文件

在这里插入图片描述
注意:文件名不建议更改,如果更改了文件名,需要把驱动库中的用户配置区也一并更改,此字库不兼容第一版oled驱动程序,不要随意替换,不支持第三方字库

2、用户配置

  本驱动支持2g模块和4g模块,需要改动的库文件如下,只要把字库文件地址改下就行了

------------------------------------------------------------------------------------
-------------------------------用户配置区域------------------------------------------
------------------------------------------------------------------------------------
--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、函数说明

  接下来我做一下函数说明

------------------------------------------------------------------------------------
-------------------------------函数说明---------------------------------------------
------------------------------------------------------------------------------------
--[[
* @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、编写测试程序代码

--必须在这个位置定义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、下载程序到开发板

  实验效果如下
X、合宙Air模块Luat开发:全网首发,通过iic直接驱动OLED,720Sl开始有显时代_第10张图片

四、总结

1、本片博客涉及到的OLED驱动

下载地址:点击这里
开发不易,收几个积分,望理解

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刷新应该是丝滑般流畅

不会下载的点击这里,进去查看我的第二篇博文2、Air720SL模块Luat开发:第一个Luat的Hello World里面讲了怎么下载
这里只是我的学习笔记,拿出来给大家分享,欢迎大家批评指正,本篇教程到此结束

你可能感兴趣的:(编程语言,lua,驱动程序)