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文件選擇上

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM