GPRS(Air202) Lua开发: OLED显示二维码,信号强度,电池电量
原理图
显示效果
1.开机显示二维码(二维码为模块IMEI)
2,开机5S后显示正在初始化
左上角为GPRS信号强度;右上角作为显示电池电量(采集的模块AD电压值)
3.模块注册上GPRS以后
程序说明
bat0-bat12 为电量图片 0-100%
single5.bmp 为信号强度图片
1.初始化 ssd1306
--- 模块功能: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.主运行程序
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("%02d",tm.hour) local min = string.format("%02d",tm.min) if hour~=nil and min~=nil then local time = hour.. ":" ..min log.info("testNtp.printTime",time) log.info("testNtp.printTime", string.format("%04d/%02d/%02d,%02d:%02d:%02d", 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文件选择上