解决OLED的二维码显示错误问题

为了方便开发者进行二次开发,Air系列模块提供了disp接口,开发者可以使用它实现LCD/OLED屏幕的文字、图片、二维码等内容的显示。

但是由于OLED背景是黑色的,所以可能导致二维码显示出现问题,无法扫码:

看起来这个二维码的确有一点违和感。那么正确的二维码是什么样子的呢?我们来观察一下:

正确的二维码,四角是黑色方框,内是黑色的实心正方形,类似“回”字。所以扫码OLED的输出存在问题。

那么如何解决这个问题呢?把“背景”弄成白色:

如图所示,背景弄成白色以后,二维码的显示也就正常了,但是这样看起来很LOW,没有OLED的那种特殊的美感,而且耗电量也会增加(OLED原理是这样的:每一个像素,都是一个发光二极管,发光时工作,不发光时则完全不耗电。所以显示的面积越大,耗电量越多)。

不过别急,还有一个方案可供选择,那就是只把二维码部分的背景色涂黑即可。先模拟一下,p个图看看效果怎么样:

貌似还不错,很高大上,而且符合消费者日常的扫码习惯(二维码外,有一个“白边”衬托)。那么如何编码实现呢?

实际并不复杂,我们来分步解说。首先要理解它的工作原理:

如图所示,黑色背景上绘制一个白色方框,白色方框上边再绘制一个二维码,然后刷新显示即可。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
module(..., package.seeall)

require "mono_std_spi_ssd1306"

--LCD分辨率的宽度和高度(单位是像素)
WIDTH, HEIGHT = disp.getlcdinfo()

-- 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.setbkcolor(0)
disp.setcolor(0xffff)
disp.clear()
disp.puttext('hello', 0, 0)
disp.drawrect(64, 0, WIDTH - 1, HEIGHT - 1, 0xffff)
local displayWidth = 50
disp.putqrcode(data, width, displayWidth, 64 + (64 - displayWidth) / 2, (HEIGHT - displayWidth) / 2)
disp.update()
end

appQRCode()

OK,根据示例代码我们修改一下,看看效果如何:

实际效果图。很不错哦,可以顺利扫码啦。

感谢开发者 超级VIP-帅B大人 冯鸣(235382) 提供图片素材。

上次更新 2021-01-28