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

让黑色背景的OLED正确显示二维码内容。

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

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

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

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

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

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

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

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

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

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

示例代码:

  1. module(..., package.seeall)
  2. require "mono_std_spi_ssd1306"
  3. --LCD分辨率的宽度和高度(单位是像素)
  4. WIDTH, HEIGHT = disp.getlcdinfo()
  5. -- qrencode.encode(string) 创建二维码信息
  6. -- @param string 二维码字符串
  7. -- @return width 生成的二维码信息宽度
  8. -- @return data 生成的二维码数据
  9. -- @usage local width, data = qrencode.encode("http://www.openluat.com")
  10. local width, data = qrencode.encode('http://www.openluat.com')
  11. -- disp.putqrcode(data, width, display_width, x, y) 显示二维码
  12. -- @param data qrencode.encode返回的二维码数据
  13. -- @param width 二维码数据的实际宽度
  14. -- @param display_width 二维码实际显示宽度,实际显示宽度开根号需要是整数
  15. -- @param x 二维码显示起始坐标x
  16. -- @param y 二维码显示起始坐标y
  17. --- 二维码显示函数
  18. local function appQRCode()
  19. disp.setbkcolor(0)
  20. disp.setcolor(0xffff)
  21. disp.clear()
  22. disp.puttext('hello', 0, 0)
  23. disp.drawrect(64, 0, WIDTH - 1, HEIGHT - 1, 0xffff)
  24. local displayWidth = 50
  25. disp.putqrcode(data, width, displayWidth, 64 + (64 - displayWidth) / 2, (HEIGHT - displayWidth) / 2)
  26. disp.update()
  27. end
  28. appQRCode()

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

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

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

  • 发表于 2018-09-22 10:58
  • 阅读 ( 4212 )
  • 分类:默认分类

0 条评论

请先 登录 后评论
不写代码的码农
技术销售Delectate

43 篇文章

作家榜 »

  1. 技术销售Delectate 43 文章
  2. 陈夏 26 文章
  3. 国梁 24 文章
  4. miuser 21 文章
  5. 晨旭 20 文章
  6. 朱天华 19 文章
  7. 金艺 19 文章
  8. 杨奉武 18 文章