显示效果
1.开机显示二维码(二维码为模块IMEI)
2,开机5S后显示正在初始化
左上角为GPRS信号强度;右上角作为显示电池电量(采集的模块AD电压值)
3.模块注册上GPRS以后
程序说明
bat0-bat12 为电量图片 0-100%
single5.bmp 为信号强度图片
1.初始化 ssd1306
代码语言:javascript复制--- 模块功能:SH 1106驱动芯片LCD命令配置
-- @author openLuat
-- @module ui.mono_std_spi_ssd1306
-- @license MIT
-- @copyright openLuat
-- @release 2018.03.27
--[[
注意:disp库目前支持I2C接口和SPI接口的屏,此文件的配置,硬件上使用的是标准的SPI引脚,不是LCD专用的SPI引脚
硬件连线图如下:
Air模块 LCD
GND--地
SPI_CS--片选
SPI_CLK--时钟
SPI_DO--数据
SPI_DI--数据/命令选择
VDDIO--电源
UART1_CTS--复位
注意:Air202早期的开发板,UART1的CTS和RTS的丝印反了
]]
module(..., package.seeall)
--[[
函数名:init
功能 :初始化LCD参数
参数 :无
返回值:无
]]
local function init()
local para = {
width = 128, --分辨率宽度,128像素;用户根据屏的参数自行修改
height = 64, --分辨率高度,64像素;用户根据屏的参数自行修改
bpp = 1, --位深度,1表示单色。单色屏就设置为1,不可修改
--bus = disp.BUS_SPI, --led位标准SPI接口,不可修改
--yoffset = 0, --Y轴偏移
--hwfillcolor = 0xffff, --填充色,黑色
-- hwfillcolor = 0xFFFF, --填充色,黑色
--pinrst = pio.P0_7, --reset,复位引脚
--pinrs = pio.P0_6, --rs,命令/数据选择引脚
bus = disp.BUS_I2C, --标准I2C接口,不可修改
yoffset = 0, --Y轴偏移
xoffset = 0, --X轴偏移
hwfillcolor = 0xffff, --填充色,黑色
slave_addr = 0x3C,
cmd_addr = 0x00,
data_addr = 0x40,
--初始化命令
initcmd = {
0xAE, --turn off oled panel
0x00, --set low column address
0x10, --set high column address
0x40, --set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
0x81, --set contrast control register
0xCF, --Set SEG Output Current Brightness
0xA1, --Set SEG/Column Mapping 0xa0×óóò·′?? 0xa1?y3£
0xC8, --Set COM/Row Scan Direction 0xc0é???·′?? 0xc8?y3£
0xA6, --set normal display
0xA8, --set multiplex ratio(1 to 64)
0x3f, --1/64 duty
0xD3, --set display offset Shift Mapping RAM Counter (0x00~0x3F)
0x00, --not offset
0xd5, --set display clock divide ratio/oscillator frequency
0x80, --set divide ratio, Set Clock as 100 Frames/Sec
0xD9, --set pre-charge period
0xF1, --Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
0xDA, --set com pins hardware configuration
0x12,
0xDB, --set vcomh
0x40, --Set VCOM Deselect Level
0x20, --Set Page Addressing Mode (0x00/0x01/0x02)
0x02,
0x8D, --set Charge Pump enable/disable
0x14, --set(0x10) disable
0xA4, --Disable Entire Display On (0xa4/0xa5)
0xA6, --Disable Inverse Display On (0xa6/a7)
0xAF, --turn on oled panel
0xAF, -- /*display ON*/
},
--休眠命令
sleepcmd = {
0xAE,
},
--唤醒命令
wakecmd = {
0xAF,
}
}
disp.init(para)
disp.setbkcolor(0)
disp.setcolor(0xffff)
disp.clear()
disp.update()
end
--控制SPI引脚的电压域
--pmd.ldoset(6, pmd.LDO_VMMC)
init()
2.主运行程序
代码语言:javascript复制module(...,package.seeall)
require"ssd1306"
require "misc"
require "mqtt"
require"common"
require"ntp"
--LCD分辨率的宽度和高度(单位是像素)
WIDTH,HEIGHT = disp.getlcdinfo()
--1个ASCII字符宽度为8像素,高度为16像素;汉字宽度和高度都为16像素
CHAR_WIDTH = 8
--[[
函数名:getxpos
功能 :计算字符串居中显示的X坐标
参数 :
str:string类型,要显示的字符串
返回值:X坐标
]]
function getxpos(str)
return (WIDTH - string.len(str) * CHAR_WIDTH) / 2
end
function setcolor(color)
if BPP~=1 then return disp.setcolor(color) end
end
--getRssi = 0
--显示信号强度
function showSingleStrength()
local getRssi = net.getRssi()
--getRssi = getRssi 10
local singleStrength = 0
if (getRssi>=0 and getRssi<=5) or (getRssi==99) then
singleStrength = 0
elseif getRssi>=6 and getRssi<=10 then
singleStrength = 1
elseif getRssi>=11 and getRssi<=16 then
singleStrength = 2
elseif getRssi>=17 and getRssi<=22 then
singleStrength = 3
elseif getRssi>=23 and getRssi<=27 then
singleStrength = 4
elseif getRssi>=28 and getRssi<=31 then
singleStrength = 5
end
disp.drawrect(0,0,30,15,0x0)--先把当前显示的信号强度清除掉
disp.putimage("/ldata/single5.bmp",0,0,-1,0,0,29-(5-singleStrength)*4,14)--显示信号5格
log.info("singleStrength",singleStrength)
end
--电池电量
-- ADC测量精度(10bit,电压测量范围为0到1.85V,分辨率为1850/1024=1.8MV,测量精度误差为20MV)
function showBatStrength()
local ADC_ID=1
adc.open(ADC_ID)-- 打开adc
-- 读取adc
-- adcval为number类型,表示adc的原始值,无效值为0xFFFF
-- voltval为number类型,表示转换后的电压值,单位为毫伏,无效值为0xFFFF;adc.read接口返回的voltval放大了3倍,所以需要除以3还原成原始电压
local adcval,voltval = adc.read(ADC_ID)
--如果voltval有效
if voltval and voltval~=0xFFFF then
--adc.read接口返回的voltval放大了3倍,所以此处除以3
voltval = (voltval-(voltval%3))/3 --mv 0-1850
voltval = voltval/154 --总共12张图片显示电压值,每一份占154
voltval = math.floor(voltval) --取整数
local str = "/ldata/bat".. voltval ..".bmp" --选择相应的图片
disp.drawrect(110,0,17 110,10,0x0)--清除
disp.putimage(str,110,0,-1,0,0,17 110,9) --显示图片
end
if tonumber((rtos.get_version()):match("Luat_V(%d )_"))>=27 then
adc.close(ADC_ID)
end
end
--开机1S后显示
function OneTimer1(param)
disp.clear()
local str = "欢迎使用Luat"
disp.puttext(common.utf8ToGb2312(str),getxpos(common.utf8ToGb2312(str)),0) --第一行居中显示 str
local imei = misc.getImei() --获取IMEI
local width, data = qrencode.encode(imei) --生成二维码数据
disp.putqrcode(data, width, 49, 40, 16) --显示二维码
disp.update() --更新显示
end
sys.timerStart(OneTimer1,1000)
--开机5S后显示
function OneTimer2(param)
disp.clear()
showSingleStrength() --信号强度
showBatStrength() --电池电量
local str2 = "正在初始化"
local str3 = "请稍后片刻"
disp.puttext(common.utf8ToGb2312(str2),getxpos(common.utf8ToGb2312(str2)),28)
disp.puttext(common.utf8ToGb2312(str3),getxpos(common.utf8ToGb2312(str3)),47)
disp.update() --更新显示
end
sys.timerStart(OneTimer2,5000)
--轮训任务
sys.taskInit(
function()
while true do
if socket.isReady() then
disp.clear()
disp.update()
while true do
showSingleStrength() --信号强度
showBatStrength() --电池电量
local str1 = "系统初始化完成"
local str2 = "尽情使用吧"
disp.puttext(common.utf8ToGb2312(str1),getxpos(common.utf8ToGb2312(str1)),28)
disp.puttext(common.utf8ToGb2312(str2),getxpos(common.utf8ToGb2312(str2)),47)
local tm = misc.getClock()
local hour = string.format("d",tm.hour)
local min = string.format("d",tm.min)
if hour~=nil and min~=nil then
local time = hour.. ":" ..min
log.info("testNtp.printTime",time)
log.info("testNtp.printTime", string.format("d/d/d,d:d:d", tm.year, tm.month, tm.day, tm.hour, tm.min, tm.sec))
disp.drawrect(getxpos(time),0,getxpos(time) string.len(time) * CHAR_WIDTH,16,0x0)--清除
disp.puttext(time,getxpos(time),0)
end
disp.update()
sys.wait(3000)
end
else
log.info("socket is not ready!!!!!!!!!")
sys.wait(1000)
end
end
end
)
ntp.timeSync()
提示
下载程序的需要把bmp文件选择上