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文件选择上

 

posted on 2020-05-27 02:13  广源时代  阅读(1038)  评论(0编辑  收藏  举报

导航

支付宝 QQ群