zoukankan      html  css  js  c++  java
  • 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文件选择上

  • 相关阅读:
    2-SAT·hihoCoder音乐节
    Music in Car
    Game with a Strip
    Oleg and Little Ponies
    组合数性质求K个数选取i*j个数分成j组的方案数
    Python学习笔记03
    Python学习笔记02
    Python 学习笔记01
    欺骗侦测
    Oracle 使用小计(4)
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/12970101.html
Copyright © 2011-2022 走看看