“快速响应”代码或简称为QR代码已成为我们数字生活中必不可少的一部分,现在您可能已经下意识地熟悉了它们,而现在您可能已经在本地杂货店中漫游,或者阅读您最喜欢的书,甚至您可能正在使用Google Pay,PhonePe或Paytm进行在线付款,或者正在网上冲浪等(我想我可以继续举例吗?),您碰巧来了在这个看起来很奇怪的方形事物和思想中,这个方形事物到底是什么,如果您还没有…好吧,请不要担心它一定会迟早发生,所以为了更好地理解这个主题,我们将做一个与Arduino和OLED一起有趣的小项目,并揭开了以下神秘面纱:
- QR码的基本概念。
- 这个怎么运作。
- 如何使用Arduino制作自己的QR代码。
- 最后,将其显示在OLED(SSD1306)屏幕中。
那么,QR码到底是什么?
QR码(快速响应代码)是由DENSO WAVE于1994年为日本汽车工业开发的矩阵二维编码,用于高速读取数据。与标准条形码相比,QR码可非常有效地压缩数据,为此,它使用四种标准化编码模式(数字,字母数字,字节/二进制和日文汉字),该技术被称为“开源”,即所有人均可使用,因此QR码比常规条形码的显着优势是数据容量更大,容错性更高。
QR代码如何工作?
QR码(和其他数据矩阵码)被设计为通过特殊工具而非人工读取,因此通过目视研究,我们只能理解一定数量的内容,尽管尽管每种代码都包含一些有趣的共同点,但在各种方面都存在差异通过查看circuitdigest.com的QR码,我们将研究其中的一些功能
- Finder模式:在代码的三个角中带有一个实心框的大方框,由于其中只有三个,因此很容易确认它是QR码,因此很明显,该代码以哪种方式定向。
- 对齐方式:这可以确保无论代码的方向如何可读。
- 定时模式:这在三个取景器模式之间水平和垂直运行,读者可以使用这些行确定代码的大小。
- 版本信息:当前有40种不同的QR代码标准版本,此部分代码确定正在使用的QR代码版本,通常用于市场营销版本1-7。
- 格式信息:格式合作伙伴具有有关容错和数据屏蔽的信息。
- 数据区域:代码的这一部分包含所有数据元素以及纠错代码。
- 退出区域:每个QR代码中的间距都是强制性的,以区分其周围的代码。
下图将为您提供有关代码的清晰思路
该代码的其他部分是数据和冗余代码。
在本教程中,我不会讨论许多其他功能和复杂的主题,如果您想阅读有关QR码的更多详细信息,请按照EPCglobal Singapore Council Tan Jin Soon的QR Code教程进行操作。综合杂志,2008年。
QR码规范
符号大小 |
最小 21x21单元格-最高 177x177单元(间隔为4单元) |
|
信息类型和数量 |
数字字符 |
最多7,089个字符 |
字母,标志 |
最多4,296个字符 |
|
二进制(8位) |
最多2,953个字符 |
|
汉字字符 |
最多1,817个字符 |
|
转换效率 |
数字字符模式 |
3.3个单元格/字符 |
字母数字/符号模式 |
5.5个字符/字符 |
|
二进制(8位)模式 |
8个字符/字符 |
|
汉字字符模式(13位) |
13个字符/字符 |
|
错误更正 功能性 |
L级 |
大约 最多恢复符号面积的7% |
M级 |
大约 最多恢复15%的符号区域 |
|
Q级 |
大约 最多恢复25%的符号区域 |
|
H级 |
大约 最多恢复30%的符号区域 |
|
链接功能 |
最多可分为16个符号 |
生成自己的QR码
按照下面提到的步骤生成您自己的QR码,在本示例中,我们将制作我们钟爱的Circuit Digest网站的QR码
要生成QR码,请访问该网站,如果您查看该网站的顶部,您会看到一个选项列表,在本教程中,我们将为URL生成QR码,因此我们将
- 单击“ URL”选项卡,然后将“电路摘要”的URL粘贴到“输入URL”部分中。
- 点击保存。
- 给出输出文件的文件名。
- 选择PNG作为我们的首选文件格式。
- 然后点击保存。
下图将为您提供一个清晰的过程思路
我们最亲爱的微控制器“ Arduino”不够智能,以至于只能编译原始PNG图像并将其显示在OLED显示屏中。因此,要将QR代码显示到OLED,我们需要遵循一些简单的步骤并将PNG图像转换为Arduino可读的位图数组。我们先前在将SSD1306 OLED与Arduino接口以及将图形LCD与Arduino接口时进行了此转换。我们还将SSD1306 OLED与Raspberry Pi,ESP32,NodeMCU和许多其他微控制器相连接。位图数组转换可以通过以下两个步骤完成:
- 将PNG转换为BMP格式。
- 将BMP图像转换为十六进制代码的数组。
将PNG转换为BMP格式
要将下载的PNG图像转换为BMP图像,请访问此网站,然后在图像转换器部分中
- 点击下拉菜单,然后选择
- 转换为BMP
- 点击开始
下图将为您提供一个清晰的过程思路:
您将看到一个新页面,如下图所示:
- 单击选择文件选项卡,然后选择下载的图像
- 在“可选设置”中,面板键入所需的尺寸(我们使用的是128x64 OLED)
- 点击开始转换按钮
将显示以下页面,几秒钟后,如果下载没有开始,则将下载转换后的图像,然后自动单击“下载文件”选项:
大!现在,我们可以将BMP文件转换为可被Arduino读取的HEX代码数组了。
将BMP图像转换为十六进制代码数组
要将下载的BMP图像转换为HEX阵列,请转到此网站,然后单击“工具”->“ image2cpp”
下图将为您提供一个清晰的过程思路
屏幕上将显示四个选项,我们将详细讨论它们。
- 选择图片
- 影像设定
- 预习
- 输出量
选择图像部分
在本节中,我们将选择刚刚转换为BMP的图像:
图像设置部分
在本节中,我们将画布大小,背景颜色,缩放比例和居中选项设置为所需值。
- 画布大小(我们将像素设置为128x64,因为我们使用的像素密度为128x64的OLED)。
- 在此部分中,我们可以设置OLED的背景颜色(我们将其选择为白色)。
- 缩放比例设置为原始大小。
- 最后,在中心选项中,单击水平和垂直复选框,这将使图像显示在中心。
下图将给您一个清晰的主意
预览部分
在预览部分,我们可以看到图像的清晰预览,该图像将显示在OLED中,如下所示:
输出部分
在输出部分,我们将生成并复制生成的代码,为此,请执行以下步骤:
- 代码输出格式(因为使用一种,所以将其设置为Arduino代码)。
- 标识符(此选项为生成的数组设置名称,我们将其保留为默认值)。
- 绘制模式(将绘制模式选项设置为水平)。
- 最后,我们单击生成代码按钮,这将生成最终的输出代码。
下图将给您一个清晰的主意
电路原理图
下图显示了Arduino Nano和SSD1306之间的接口连接:
Arduino纳米针 |
OLED PIN |
地线 |
地线 |
3.3伏 |
VCC |
D13 |
时钟 |
D11 |
摩西 |
D8 |
RES |
D9 |
数据中心 |
D10 |
CCS |
代码说明
为了在OLED上显示图像,我们需要Arduino库的帮助,可以从GitHub存储库下载该库。下载该库的 U8glib-1.19.1.zip 版本,并将其导入Arduino IDE。如果您不熟悉Arduino,请利用此链接来描述如何导入库。在下面的部分中,我们将修改代码以将以前生成的HEX阵列显示给OLED。本文结尾给出了完整的代码和可运行的视频。该代码的详细说明如下。
首先,包括下载的库。
#include“ U8glib.h” //包括U8glib库
然后为OLED定义所有必需的引脚。
#define OLED_CLK_PIN 13 // Arduino数字引脚D13:SCK #define OLED_MOSI_PIN 11 // Arduino数字引脚D11:MOSI #define OLED_RES_PIN 10 // Arduino数字引脚D10:SS #define OLED_SDC_PIN 9 // Arduino数字引脚D9:OC1A #define OLED_CSS_PIN 8 // Arduino数字引脚D13:ICP1
初始化u8glib库。
U8GLIB_SH1106_128X64 u8g(OLED_CLK_PIN,OLED_MOSI_PIN,OLED_RES_PIN,OLED_SDC_PIN,OLED_CSS_PIN);
然后包括生成的图像数组。
const uint8_t circuitdigest PROGMEM = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0、0x00、0x1c 0x87、0xf0、0x00、0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0、0x00、0x0c,0x01、0x87、0xf0、0x00、0x0f,0xff,0xff,0xff,0xff,0xff 0xff,0xff,0xff,0xf3、0xff,0x8f,0xf0、0x7f,0x31、0xff,0x8f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf3、0xff,0x8f,0x7、0x3f 0xff,0xcf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf3、0x81、0x8f,0x31,0x80、0x33、0x81、0xcf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf3、0x01、0x8f,0x31、0x80、0x33、0x81、0xcf,0xff,0xff,0xff,0xff,0xff,0xff 0xff,0xff,0xff,0xf3、0x01、0x8f,0xb1、0x80、0x33、0x81、0xcf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf3、0x01、0x8f,0xc1、0xc0、0xc1 0x81、0xcf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf3、0x01、0x8f,0xc1、0x98、0x33、0x81、0xcf,0xff,0xff,0xff,0xff,…… …..0xff,0xff,……..…………..0xff,0xff,……..…………..
绘图功能用于在u8g.drawBitmapP函数的帮助下在OLED上绘制位图图像(QR码)。
void draw(void){//重画整个屏幕的图形命令应放在此处u8g.drawBitmapP(0,0,16,64,circuitdigest); …..……
最后,在 loop() 函数中,调用所有必要的过程以在OLED上构建图像
void loop(){u8g.firstPage(); //对此过程的调用,标志着图片循环的开始。做{draw(); } while(u8g.nextPage()); //对该过程的调用,标记图片循环主体的结尾。//经过一段时间的delay(1000)重建图片;}
完成代码后,将Arduino插入计算机的USB端口,选择您的COM端口并上传代码。如果您正确完成了所有操作,则将在OLED上显示带有QR码的有效显示器。
我希望您喜欢这个项目并喜欢学习新知识,继续阅读并继续学习,我下次见。