跳转至

二维码生成和显示

一、简易 UI-二维码概述

在 Air724UG-LuatOS 平台上,qrencode 库是一个高效易用的二维码生成工具,通过其提供的 API 接口,开发者能够轻松生成包含丰富信息的二维码,满足多样化的应用需求。

二、准备硬件环境

“古人云:‘工欲善其事,必先利其器。’在深入介绍本功能示例之前,我们首先需要确保以下硬件环境的准备工作已经完成。”

2.1 Air724UG 开发板

本 demo 使用的是 Air724UG_A14 开发板,如下图所示:

点击链接购买:EVB_Air724UG_A14 开发板淘宝购买链接

此开发板的详细使用说明参考:Air724UG 产品手册中的开发板硬件资料中《EVB_Air724UG_A14 开发板使用说明.pdf》;开发板使用过程中遇到任何问题,可以直接参考这份使用说明 pdf 文档。

2.2 SIM 卡

请准备一张可正常上网的 SIM 卡,该卡可以是物联网卡或您的个人手机卡。

特别提醒:请确保 SIM 卡未欠费且网络功能正常,以便顺利进行后续操作。

2.3 PC 电脑

准备一台电脑;

电脑操作系统为:WIN10 以及以上版本的 WINDOWS 系统。

注意:电脑有 USB 口,并且可以正常上网!!!

2.4 数据通信线

请准备一根用于连接 EVB_Air724UG_A14 开发板和 PC 电脑的数据线,该数据线将实现业务逻辑的控制与交互。

  • USB 数据线:此数据线不仅用于为测试板供电,还用于查看数据日志。其一端为 Micro-B 接口(俗称老安卓口),用于连接 EVB_Air724UG_A14 开发板;另一端为标准 USB 接口,连接 PC 电脑。

2.5 准备一个 7735 的屏幕(7735 型号有带后缀的也可以的)

  • 注:EVB_Air724UG_A14 的开发板显示屏接线口只有 7 个口
  • 将屏幕的 GND 对齐 开发板的 GND 接上, 最后显示屏的 BLK,会悬空(如果不调节亮度,悬空默认最亮,其他亮度 这个口接 PWM)
  • 在使用 EVB_Air724UG_A14 开发套件时如下图所示插入即可

2.6 组装硬件环境

2.6.1 请按 SIM 卡槽指示方向正确插入 SIM 卡,避免插反损坏

通常,插入 SIM 卡的步骤如下:

  • 将 SIM 卡的金属卡槽下滑打开。
  • 平稳地将 SIM 卡放入卡槽。
  • 上滑关闭卡槽。

2.6.2 USB 数据线,连接电脑和 EVB_Air724UG_A14 开发板,如下图所示:

2.6.3 EVB_Air724UG_A14 开发板和显示屏连接,如下图所示:

三、准备软件环境

“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。

3.1 Luatools 工具

要想烧录 LuatOS 固件到 4G 模组中,需要用到合宙的强大的调试工具:Luatools;

下载地址:Luatools v3 下载调试工具

Luatools 工具集具备以下几大核心功能:

  • 一键获取最新固件:自动连接合宙服务器,轻松下载最新的合宙模组固件。
  • 固件与脚本烧录:便捷地将固件及脚本文件烧录至目标模组中。
  • 串口日志管理:实时查看模组通过串口输出的日志信息,并支持保存功能。
  • 串口调试助手:提供简洁的串口调试界面,满足基本的串口通信测试需求。

Luatools 下载之后, 无需安装, 解压到你新建的文件中,点击 Luatools_v3.exe 运行,出现如下界面,就代表 Luatools 安装成功了:

3.2 烧录代码

首先要说明一点: 脚本代码, 要和固件的 LuatOS-Air_V4030_RDA8910_BT_TTS_FLOAT.pac 文件一起烧录。

整体压缩文件:如图所示。

3.2.1 压缩文件:完整脚本文件包

右键点我,另存为,下载完整压缩文件包

3.2.2 找到烧录的固件文件

官网下载,底层 core 下载地址:LuatOS 底层 core 注:本 demo 使用如图所示固件

3.2.3 正确连接电脑和 4G 模组电路板

使用带有数据通信功能的数据线,不要使用仅有充电功能的数据线;

3.2.4 识别 4G 模组的 boot 引脚

在下载之前,要用模组的 boot 引脚触发下载,具体到 EVB_Air724UG_A14 开发板。

  • 当我们模块没开机时,按着下载模式键然后长按开机键开机。
  • 当我们模块开机时,按着下载模式键然后点按重启键即可。

3.2.5 识别电脑的正确端口

判断是否进入 BOOT 模式:

  • 模块上电,此时在电脑的设备管理器中,查看串口设备,如下图:

  • 先按下载模式再按一下重启,会出现一个端口表示进入了 boot 下载模式,如下图所示:

  • 这时候, 硬件连接上就绪状态,恭喜你,可以进行烧录了!

3.2.6 新建项目

首先,确保你的 Luatools 的版本大于或者等于 3.0.6 版本.

在 Luatools 的左上角上有版本显示的,如图所示:

Luatools 版本没问题的话, 就点击 Luatools 右上角的“项目管理测试”按钮,如下图所示:

这时会弹出项目管理和烧录管理的对话框,如下图:

3.2.7 开始烧录

  • 选择 Air724ug 开发板对应的底层 core 和 main.lua 脚本文件。下载到板子中。

  • 一直按下载模式按键,再按一下重启,然后点击下载底层和脚本,如图所示:

  • 出现如图所示,表示已进入 boot 模式,可以松开下载模式按键,等待下载完成。

  • 下载完成,如图所示

四、简易 UI-二维码基本用法

4.1 本教程实现的功能定义:

  • 在 Air724UG-LuatOS 平台上,qrencode 库作为二维码生成的核心工具,扮演着至关重要的角色。它设计得既高效又易于集成,为用户提供了极其便捷的接口来生成各种格式的二维码。本次介绍的宗旨是助力开发者快速掌握并熟练运用 qrencode 库的 API 接口,以便能够利用这些接口轻松生成包含各种信息的二维码,从而在 Air724UG-LuatOS 平台上实现出色的二维码生成与应用功能。

4.2 文章内容引用

4.3 API 接口详解

4.3.1 qrencode.encode(data [,version,level])

解说:

  • 二维码生成。

参数:二维码版本(取值 0~40,默认为 0),二维码纠错等级(取值 0~3,默认为 0)

返回值:

举例:

local width, data = qrencode.encode('http://www.openluat.com')

返回值:

五、简易 UI-二维码整体演示

5.1 简易 UI-二维码生成成果演示与深度解析:视频 + 图文全面展示

5.1.1 成果运行精彩呈现

5.1.2 完整实例深度剖析

  • main.lua

功能实现:主要实现调用显示屏初始化和二维码生成功能函数。

--必须在这个位置定义PROJECT和VERSION变量
--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
PROJECT = "QRCODE"
VERSION = "1.0.0"

--加载日志功能模块,并且设置日志输出等级
--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
require "log"
LOG_LEVEL = log.LOGLEVEL_TRACE
--[[
如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
]]
--log.openTrace(true,1,115200)

require "sys"

require "net"
--每1分钟查询一次GSM信号强度
--每1分钟查询一次基站信息
net.startQueryAll(60000, 60000)

--此处关闭RNDIS网卡功能
--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
ril.request("AT+RNDISCALL=0,1")

--加载控制台调试功能模块(此处代码配置的是uart2,波特率115200)
--此功能模块不是必须的,根据项目需求决定是否加载
--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
--使用说明参考demo/console下的《console功能使用说明.docx》
--require "console"
--console.setup(2, 115200)

--加载网络指示灯和LTE指示灯功能模块
--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
require "netLed"
pmd.ldoset(2,pmd.LDO_VLCD)
netLed.setup(true,pio.P0_1,pio.P0_4)
--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
--LTE指示灯功能模块中,配置的是注册上4G网络,灯就常亮,其余任何状态灯都会熄灭

--加载错误日志管理功能模块【强烈建议打开此功能】
--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
require "errDump"
errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)

require"color_lcd_spi_st7735"
require"testqQrcode"

--启动系统框架
sys.init(0, 0)
sys.run()
  • color_lcd_spi_st7735.lua

功能实现:ST 7735 驱动芯片 LCD 命令配置

--- 模块功能:ST 7735驱动芯片LCD命令配置
-- @author openLuat
-- @module ui.color_lcd_spi_st7735
-- @license MIT
-- @copyright openLuat
-- @release 2018.03.27

--[[
注意:disp库目前支持I2C接口和SPI接口的屏,此文件的配置,硬件上使用的是LCD专用的SPI引脚,不是标准的SPI引脚
硬件连线图如下:
Air模块           LCD
GND-------------地
LCD_CS----------片选
LCD_CLK---------时钟
LCD_DATA--------数据
LCD_DC----------数据/命令选择
VDDIO-----------电源
LCD_RST---------复位
]]

module(...,package.seeall)

--[[
函数名:init
功能  :初始化LCD参数
参数  :无
返回值:无
]]
local function init()
    local para =
    {
        width = 128, --分辨率宽度,128像素;用户根据屏的参数自行修改
        height = 160, --分辨率高度,160像素;用户根据屏的参数自行修改
        bpp = 16, --位深度,彩屏仅支持16位
        bus = disp.BUS_SPI4LINE, --LCD专用SPI引脚接口,不可修改
        xoffset = 0, --X轴偏移
        yoffset = 0, --Y轴偏移
        freq = 26000000, --spi时钟频率,支持110K到13M(即110000到13000000)之间的整数(包含110000和13000000)
        pinrst = pio.P0_6, --reset,复位引脚
        pinrs = pio.P0_1, --rs,命令/数据选择引脚
        --camera_preview_no_update_screen = 1, --0表示摄像头预览刷屏;1表示摄像头预览不刷屏
        --初始化命令
        --前两个字节表示类型:0001表示延时,0000或者0002表示命令,0003表示数据
        --延时类型:后两个字节表示延时时间(单位毫秒)
        --命令类型:后两个字节命令的值
        --数据类型:后两个字节数据的值
        initcmd =
        {
            0x00020011,
            0x00010078,
            0x000200B1,
            0x00030002,
            0x00030035,
            0x00030036,
            0x000200B2,
            0x00030002,
            0x00030035,
            0x00030036,
            0x000200B3,
            0x00030002,
            0x00030035,
            0x00030036,
            0x00030002,
            0x00030035,
            0x00030036,
            0x000200B4,
            0x00030007,
            0x000200C0,
            0x000300A2,
            0x00030002,
            0x00030084,
            0x000200C1,
            0x000300C5,
            0x000200C2,
            0x0003000A,
            0x00030000,
            0x000200C3,
            0x0003008A,
            0x0003002A,
            0x000200C4,
            0x0003008A,
            0x000300EE,
            0x000200C5,
            0x0003000E,
            0x00020036,
            -- set rotation
            -- 0x000300C0,
            0x00030000,
            0x000200E0,
            0x00030012,
            0x0003001C,
            0x00030010,
            0x00030018,
            0x00030033,
            0x0003002C,
            0x00030025,
            0x00030028,
            0x00030028,
            0x00030027,
            0x0003002F,
            0x0003003C,
            0x00030000,
            0x00030003,
            0x00030003,
            0x00030010,
            0x000200E1,
            0x00030012,
            0x0003001C,
            0x00030010,
            0x00030018,
            0x0003002D,
            0x00030028,
            0x00030023,
            0x00030028,
            0x00030028,
            0x00030026,
            0x0003002F,
            0x0003003B,
            0x00030000,
            0x00030003,
            0x00030003,
            0x00030010,
            0x0002003A,
            0x00030005,
            0x00020029,
        },
        --休眠命令
        sleepcmd = {
            0x00020010,
        },
        --唤醒命令
        wakecmd = {
            0x00020011,
        }
    }
    disp.init(para)
    disp.clear()
    disp.update()
end

--控制SPI引脚的电压域
pmd.ldoset(15,pmd.LDO_VLCD)
init()
  • testqQrcode.lua

功能实现:调用 disp.putqrcode 接口函数生成 (http://www.openluat.com)的二维码,并在显示屏显示。

--[[
模块名称:二维码生成并显示到屏幕上
模块最后修改时间:2020.3.31
]]

module(...,package.seeall)

--LCD分辨率的宽度和高度(单位是像素)
local WIDTH, HEIGHT = 132,162

--- qrencode.encode(string) 创建二维码信息
-- @param string 二维码字符串
-- @return width 生成的二维码信息宽度
-- @return data 生成的二维码数据
-- @usage local width, data = qrencode.encode("http://www.openluat.com")
local width, data = qrencode.encode('http://www.openluat.com')

--- disp.putqrcode(data, width, display_width, x, y) 显示二维码
-- @param data 从qrencode.encode返回的二维码数据
-- @param width 二维码数据的实际宽度
-- @param display_width 二维码实际显示宽度,显示宽度开根号需要是整数
-- @param x 二维码显示起始坐标x
-- @param y 二维码显示起始坐标y

--- 二维码显示函数
local function appQRCode()
    disp.clear()
    local displayWidth = 100
    disp.putqrcode(data, width, displayWidth, (WIDTH-displayWidth)/2, (HEIGHT-displayWidth)/2)
    disp.update()   
end

appQRCode()

六、总结

在 Air724UG-LuatOS 中,qrencode 库使开发者能够便捷地生成二维码,包括设置编码内容、调整二维码尺寸与容错率、输出格式选择以及附加的二维码美化功能。通过合理利用这些接口,开发者可以创建出既美观又实用的二维码,满足用户在多种应用场景下的需求。同时,也需关注接口之间的合理搭配,以确保二维码生成的高效性和准确性。

七、常见问题

7.1 无法生成二维码。

查看烧录的底层固件是否支持二维码生成。

八、扩展

  • 无。

给读者的话

本篇文章由永仔开发;

本篇文章描述的内容,如果有错误、细节缺失、细节不清晰或者其他任何问题,总之就是无法解决您遇到的问题;

请登录合宙技术交流论坛,点击文档找错赢奖金-Air724UG-LuatOS-软件指南-多媒体应用-二维码生成和显示

用截图标注+文字描述的方式跟帖回复,记录清楚您发现的问题;

我们会迅速核实并且修改文档;

同时也会为您累计找错积分,您还可能赢取月度找错奖金!