基础资料
基于Air103开发板:Air103 - LuatOS 文档
探讨重点
对官方DISP-OLED demo中功能的复现,进行相关内容的学习及探讨。
实现功能
功能:lua快速驱动0.96寸OLED(i2c-SSD1306);
硬件准备
Air103开发板1块,面包板1块,0.96寸OLED(i2c-SSD1306),导线若干。
软件版本
AIR103:LuatOS@AIR103 base 22.10 bsp V0013
软件使用
接口文档可参考:u8g2库
-- disp库的所有API均已合并到u8g2库 -- disp库已经映射为u8g2库,所有API均代理到u8g2,请查阅u8g2库的API
初始化硬件
--[[
I2C0
I2C0_SDA(SDA,ADC1,GPIO04) (PA4,7#),黄色 D1(SDA)
I2C0_SCL(SCK,ADC0,GPIO01) (PA1,8#),绿色 D0(SCL)
--0.9寸优信电子i2c-SSD1306,蓝:3.3(较稳定)-5V,棕:GND,接线端向上,128*64
--0.9寸国立腾i2c-SPI兼容SSD1306,蓝:3.3(较稳定)-5V,棕:GND,灰:CS(不用时必须接地)。D0(SCL),D1(SDA)
]]
-- 初始化显示屏
log.info(TAG, "init ssd1306")
local setupRes =u8g2.begin({ic = "ssd1306",direction = 0,mode="i2c_hw",i2c_id=0,i2c_speed = i2c.FAST}) -- direction 可选0 90 180 270
字体相关代码
u8g2.SetFontMode(1) --int mode字体模式,启用(1)或禁用(0)透明模式
u8g2.SetDrawColor(1) --颜色值 0没有色(屏幕无显示) 1有色(默认值) 2与底色xor,出现间断虚线
u8g2.ClearBuffer()
--[2022-11-25 17:55:09.983] E/u8g2 no such font 无字体库
u8g2.SetFont(u8g2.font_opposansm8) --font, u8g2.font_opposansm8 为纯英文8号字体,还有font_opposansm10 font_opposansm12 font_opposansm16 font_opposansm18
--font_opposansm20 font_opposansm22 font_opposansm24 font_opposansm32 可选 u8g2.font_opposansm12_chinese 为12x12全中文,
--还有 font_opposansm16_chinese font_opposansm24_chinese --font_opposansm32_chinese 可选,
--u8g2.font_unifont_t_symbols 为符号.
u8g2.DrawUTF8("U8g2+LuatOS", 32, 22) --在显示屏上画一段文字,在显示屏上画一段文字,要调用u8g2.SendBuffer()才会更新到屏幕
if u8g2.font_opposansm12_chinese then
u8g2.SetFont(u8g2.font_opposansm12_chinese)
else
u8g2.SetFont(u8g2.font_opposansm10_chinese) --默认字体
end
--u8g2.SetFont(u8g2.font_opposansm12_chinese)
u8g2.DrawUTF8("中文测试", 40, 38) --
语句段显示代码及注释
u8g2.ClearBuffer()
u8g2.SetBitmapMode(1) --定义位图函数是否将写入背景色,mode字体模式,启用(1)或禁用(0)透明模式
t={
string.char(0x00,0x04,0x00,0x04,0x1F,0x04,0xC4,0x7F,0x44,0x44,0x44,0x24,0x44,0x04,0xDF,0x3F),
string.char(0x44,0x21,0x44,0x11,0x44,0x12,0x5C,0x0A,0x47,0x04,0x22,0x0A,0x20,0x11,0x90,0x60),--/*"玻0
string.char(0x00,0x02,0x00,0x04,0xDF,0x7F,0x04,0x00,0x84,0x2A,0x84,0x24,0x84,0x2A,0x9F,0x3F),
string.char(0x04,0x04,0xC4,0x7F,0x44,0x42,0x5C,0x49,0x47,0x5F,0x42,0x50,0x40,0x40,0x40,0x60),--/*"璃1
string.char(0x80,0x00,0x80,0x00,0x80,0x3F,0x80,0x00,0xF8,0x1F,0x08,0x10,0xF8,0x1F,0x08,0x10),
string.char(0xF8,0x1F,0x80,0x00,0xFF,0x7F,0xA0,0x02,0x90,0x04,0x8C,0x18,0x83,0x60,0x80,0x00),--/*"桌2
string.char(0x00,0x00,0xFF,0x7F,0x40,0x00,0x40,0x00,0x20,0x00,0xFC,0x1F,0x24,0x12,0x24,0x12),
string.char(0xE4,0x13,0x24,0x12,0x24,0x12,0xE4,0x13,0x24,0x12,0x24,0x12,0xFC,0x1F,0x04,0x10),--/*"面3
string.char(0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00),
string.char(0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x08,0x00,0x04,0x00,0x00,0x00),--/*",4
string.char(0x00,0x02,0x02,0x02,0xE4,0x3F,0x04,0x02,0xC0,0x1F,0x00,0x02,0xE7,0x7F,0x04,0x00),
string.char(0xC4,0x1F,0x44,0x10,0xC4,0x1F,0x44,0x10,0xD4,0x1F,0x4C,0x10,0x44,0x14,0x40,0x08),--/*"请5
string.char(0x10,0x00,0x10,0x00,0x10,0x00,0xF8,0x3F,0x48,0x22,0x44,0x22,0x42,0x22,0x21,0x22),
string.char(0x20,0x22,0x10,0x21,0x08,0x21,0x84,0x20,0x42,0x20,0x20,0x20,0x10,0x14,0x08,0x08),--/*"勿6
string.char(0x00,0x08,0x00,0x1F,0xFC,0x00,0x80,0x00,0xFF,0x7F,0x80,0x00,0xF8,0x0F,0x88,0x08),
string.char(0xF8,0x0F,0x88,0x08,0xF8,0x0F,0x80,0x00,0xFC,0x1F,0x80,0x00,0xFF,0x7F,0x00,0x00),--/*"重7
string.char(0x00,0x00,0xFC,0x7F,0x04,0x00,0x04,0x01,0x04,0x01,0x04,0x01,0x04,0x01,0xF4,0x3F),
string.char(0x04,0x01,0x04,0x01,0x04,0x09,0x04,0x11,0x04,0x11,0x02,0x01,0xFA,0x7F,0x01,0x00),--/*"压8
string.char(0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00),
string.char(0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00),--/*"!9
string.char(0x04,0x00,0x84,0x3F,0x04,0x10,0x3F,0x08,0x02,0x0C,0x0A,0x12,0x09,0x21,0xFF,0x40),
string.char(0x08,0x00,0x88,0x3F,0x38,0x04,0x0F,0x04,0x0A,0x04,0x08,0x04,0xC8,0x7F,0x08,0x00),--/*"轻10
string.char(0x80,0x00,0x60,0x03,0x18,0x0C,0xF7,0x77,0x00,0x00,0xF8,0x0F,0x08,0x08,0xF8,0x0F),
string.char(0x00,0x04,0xF8,0x03,0x80,0x00,0xFC,0x1F,0x80,0x00,0xFE,0x3F,0x80,0x00,0xC0,0x00),--/*"拿11
string.char(0x04,0x00,0x84,0x3F,0x04,0x10,0x3F,0x08,0x02,0x0C,0x0A,0x12,0x09,0x21,0xFF,0x40),
string.char(0x08,0x00,0x88,0x3F,0x38,0x04,0x0F,0x04,0x0A,0x04,0x08,0x04,0xC8,0x7F,0x08,0x00),--/*"轻12
string.char(0x04,0x02,0x08,0x02,0x00,0x02,0x7F,0x01,0x04,0x7F,0x84,0x10,0x7C,0x11,0x24,0x11),
string.char(0x24,0x11,0x24,0x0A,0x24,0x0A,0x24,0x04,0x22,0x0A,0x2A,0x11,0x91,0x20,0x40,0x40),--/*"放13
string.char(0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00),
string.char(0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x08,0x00,0x04,0x00,0x00,0x00),--/*",14
string.char(0x00,0x01,0x04,0x02,0x08,0x00,0xE8,0x3F,0x01,0x02,0x02,0x02,0x02,0x02,0x08,0x02),
string.char(0xC8,0x3F,0x04,0x02,0x07,0x02,0x04,0x02,0x04,0x02,0x04,0x02,0xF4,0x7F,0x00,0x00),--/*"注15
string.char(0x80,0x00,0xFC,0x1F,0x10,0x04,0x20,0x02,0xFF,0x7F,0x00,0x00,0xF8,0x0F,0x08,0x08),
string.char(0xF8,0x0F,0x08,0x08,0xF8,0x0F,0x40,0x00,0x8A,0x20,0x8A,0x48,0x09,0x48,0xF0,0x0F),--/*"意16
string.char(0x40,0x00,0x80,0x00,0xFC,0x3F,0x04,0x20,0x42,0x10,0x40,0x00,0x40,0x00,0xFF,0x7F),
string.char(0x20,0x04,0x10,0x04,0x18,0x02,0x60,0x02,0x80,0x01,0x40,0x06,0x30,0x08,0x0E,0x10),--/*"安17
string.char(0x80,0x00,0x80,0x00,0x40,0x01,0x20,0x02,0x10,0x04,0x08,0x08,0xF4,0x17,0x83,0x60),
string.char(0x80,0x00,0x80,0x00,0xF8,0x0F,0x80,0x00,0x80,0x00,0x80,0x00,0xFE,0x3F,0x00,0x00),--/*"全18
string.char(0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00),
string.char(0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00),--/*"!19
string.char(0x40,0x00,0x40,0x00,0xE0,0x0F,0x10,0x04,0x1C,0x02,0x20,0x01,0xC0,0x02,0x30,0x01),
string.char(0x8E,0x1F,0x40,0x10,0x30,0x08,0x4C,0x04,0x80,0x02,0x80,0x01,0x70,0x00,0x0E,0x00),--/*"多20
string.char(0x80,0x10,0x42,0x10,0xE4,0x11,0x24,0x11,0xE0,0x7D,0x20,0x11,0xE7,0x11,0x24,0x13),
string.char(0x24,0x15,0xF4,0x15,0x84,0x11,0x54,0x11,0x2C,0x11,0x14,0x11,0x40,0x15,0x80,0x08),--/*"谢21
string.char(0x00,0x00,0x7F,0x00,0x14,0x1F,0x14,0x10,0x7F,0x10,0x55,0x10,0x55,0x10,0x55,0x1F),
string.char(0x75,0x11,0x43,0x01,0x41,0x01,0x7F,0x01,0x41,0x41,0x41,0x41,0x7F,0x7E,0x41,0x00),--/*"配22
string.char(0x80,0x00,0x80,0x00,0x40,0x01,0x20,0x02,0x10,0x04,0x0C,0x18,0xF3,0x67,0x00,0x00),
string.char(0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F,0x08,0x08),--/*"合23
string.char(0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00),
string.char(0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00)--/*"!24
}
for i = 1, #t/2 do
row=(math.ceil(2*i/#t[1])-1) --取整数部分,得到需显示的行数
col=i%(128/#t[1])
--col= (col==0) and 8 or col --等同于 if col==0 then col=8 end
col=(col==0 and {8} or {col})[1] --通用三目运算符
u8g2.DrawXBM((col-1)*#t[1],row*#t[2],#t[1],#t[2], t[i*2-1]..t[i*2]) --行数增加后,从0,0重新输出
-- u8g2.SendBuffer() --逐字输出,间隔100ms
-- sys.wait(100)
end
-- u8g2.DrawXBM(0, 0, 16,16, t[1]..t[2])
-- u8g2.DrawXBM(16, 0, 16,16, t[3]..t[4])
u8g2.SendBuffer() --一次性输出
sys.wait(2000)
PCtoLCD2002设置
对应设置
正则表达式测试:正则表达式在线测试 | 菜鸟工具
缓冲区绘制QRCode
u8g2.DrawDrcode(x, y, str, size)
缓冲区绘制QRCode
参数
传入值类型 解释
int x坐标
int y坐标
string 二维码的内容
int 可选,显示大小,不可小于21,默认21
返回值
返回值类型 解释
nil 无返回值
例子
-- qrcode测试
sys.wait(1000)
u8g2.ClearBuffer()
u8g2.DrawUTF8("二维码",60,20) --u8g2.font_opposansm10_chinese
u8g2.DrawUTF8("测试",60,34) --u8g2.font_opposansm10_chinese
--二维码大小和链接地址的长度有关
u8g2.DrawDrcode(0,0, "https://wiki.luatos.com/chips/air103/mcu.html",60); --35可显示,50稍放大,60向右侧移动,66满屏显示,但底部显示不全
u8g2.SendBuffer()
PS:json函数示例
print(json.null)
local t = {
string.char(0x00,0x04,0x00,0x04,0x1F,0x04,0xC4,0x7F,0x44,0x44,0x44,0x24,0x44,0x04,0xDF,0x3F),
string.char(0x44,0x21,0x44,0x11,0x44,0x12,0x5C,0x0A,0x47,0x04,0x22,0x0A,0x20,0x11,0x90,0x60),--/*"玻0
string.char(0x00,0x02,0x00,0x04,0xDF,0x7F,0x04,0x00,0x84,0x2A,0x84,0x24,0x84,0x2A,0x9F,0x3F),
string.char(0x04,0x04,0xC4,0x7F,0x44,0x42,0x5C,0x49,0x47,0x5F,0x42,0x50,0x40,0x40,0x40,0x60),--/*"璃1
string.char(0x80,0x00,0x80,0x00,0x80,0x3F,0x80,0x00,0xF8,0x1F,0x08,0x10,0xF8,0x1F,0x08,0x10),
string.char(0xF8,0x1F,0x80,0x00,0xFF,0x7F,0xA0,0x02,0x90,0x04,0x8C,0x18,0x83,0x60,0x80,0x00),--/*"桌2
string.char(0x00,0x00,0xFF,0x7F,0x40,0x00,0x40,0x00,0x20,0x00,0xFC,0x1F,0x24,0x12,0x24,0x12),
string.char(0xE4,0x13,0x24,0x12,0x24,0x12,0xE4,0x13,0x24,0x12,0x24,0x12,0xFC,0x1F,0x04,0x10),--/*"面3
string.char(0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00),
string.char(0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x08,0x00,0x04,0x00,0x00,0x00),--/*",4
string.char(0x00,0x02,0x02,0x02,0xE4,0x3F,0x04,0x02,0xC0,0x1F,0x00,0x02,0xE7,0x7F,0x04,0x00),
string.char(0xC4,0x1F,0x44,0x10,0xC4,0x1F,0x44,0x10,0xD4,0x1F,0x4C,0x10,0x44,0x14,0x40,0x08)--/*"请5
}
local s = json.encode(t)
local st = json.decode(s)
print(s)
print(s[1]) --nil 序列化后的json字符串非table,只删除了注释部分,本质上还是string
print(#st)
--print(#st[1]())
print(#st[2])
print(st[1][1],st[3][3]) --将字符串反序列化为对象,按table方式访问
print(string.format("0x%02X",st[3][3])) --将字符串转化为16进制string
问题
u8g2.drawGtfontGb2312(str,size,x,y) 错误提示-已解决。
u8g2.drawGtfontUtf8(str,size,x,y) 错误提示-已解决。
main.lua:258: attempt to call a nil value (field ' drawGtfontGb2312')
该错误提示在官方仓库提了issue很快得到解决。原因很简单,没有使用高通的字体芯片,手边没有,就不测试了,应该没问题,记录一下。