原理圖
顯示效果
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文件選擇上