arduino使用oled代码_使用Arduino生成QR二维码并在OLED上进行显示

QR码(Quick Response Code)是二维码的一种,它已成为我们生活中必不可少的一部分,您可能已经下意识地熟悉了它们。现在您可能在超市闲逛,或者正在阅读最喜欢的书,甚至可能正在使用Google Pay、微信或支付宝进行在线支付,等等。这时碰巧会看到这个很奇怪的方形的东西,那这个东西到底是什么呢...为了更好地理解,我们将使用Arduino和OLED制作一个有趣的小项目,并介绍以下内容:

●    QR码的基本概念。

●    怎么运行的。

●    如何使用Arduino制作自己的QR代码。

●    最后,将其显示在OLED液晶屏上。

那么,QR码到底是什么?

QR码(Quick Response Code)是由DENSO WAVE于1994年为日本汽车工业开发的矩阵二维编码,用于高速读取数据。与标准条形码相比,QR码可以非常有效地压缩数据,为此,它使用四种标准化编码模式(数字、大写字母和数字、字节/二进制和日文汉字/假名),该技术是开源的,即所有人都可以使用,因此QR码比常规条形码的显着优势是数据容量更大,容错性更高。

c6d33fee1904cdab29bae52b86e33b37.png

QR代码如何工作?

QR码(以及其他数据矩阵码)被设计为通过特殊工具读取,而非人工读取,因此通过视觉观察,我们只能了解到很少的信息,尽管每种代码都包含一些有趣的共同点,但在各个方面都存在差异。通过观察上面的QR码,我们可以看出其中的一些功能:

1.   定位标识(Finder Pattern):在代码的三个角中都带有一个实心框的大方框,由于其中只有三个,因此很容易确认它是QR码,很明显确定该二维码以哪种方式定位。

2.   校正标识(Alignment Pattern):这可以确保二维码在任意角度都可以被读取。

3.   定时标识(Timing Pattern):在三个定位标识之间水平和垂直分布,读写器可以使用这些行确定代码的大小。

4.   版本信息:当前有40多种不同的QR代码标准版本,此部分代码确定正在使用的QR代码版本,通常使用版本1-7。

5.   格式信息:格式标识包含有关存储容错级别和数据掩码的信息。

6.   数据区域:代码的此部分包含所有数据元素以及纠错代码。

7.   闷声区(Quit Zone):每个QR代码中的间距都是强制性的,以区分其周围的代码。

下图提供了清晰的二维码结构信息:

db61fa3d32814dd99b3affc0e6463d2c.png

该代码的其他部分是数据及容错字码。

生成自己的QR码

按照下面提到的步骤生成属于您自己的QR码。

要生成QR码,请转至the-qrcode-generator.com网站,在网站的顶部,您会看到有一系列的选项,在本文中,我们将为URL生成QR码,因此:

1.  单击“URL”选项卡,然后将URL链接地址“https://www.yiboard.com/forum.php”粘贴到“Enter URL”部分中。

2.  点击Save。

3.  给输出文件起个名字。

4.  文件格式选择PNG。

5.  然后点击Save。

50393320b30936d2b8d5328c336ae73d.png

Arduino控制器只能编译原始图像,然后才能将其显示在OLED显示屏。因此,要将QR码显示到OLED,我们需要遵循一些简单的步骤,并将PNG图像转换为Arduino可读的位图数组。位图数组转换可以通过以下两个步骤完成:

1.  将PNG转换为BMP格式。

2.  将BMP图像转换为十六进制代码的数组。

将PNG转换为BMP格式

要将下载的PNG图像转换为BMP图像,请访问online-convert.com网站,然后在页面中找到Image converter,点击下拉菜单,然后选择Convert to BMP

您将看到一个新页面,如下图所示:

624a5b6803dccd85bc889f33296c1a5b.png

1.  单击Choose Files选项卡,然后选择下载的图像;

2.  在Optional settings中,输入所需的尺寸(我们使用的是128x64 OLED);

3.  点击Start conversion

系统将显示以下页面,几秒钟后,将下载转换后的图像,如果下载没有自动开始,请单击“download your file”选项:

59c32cd0e040938dfb08038897f7cefd.png

接下来,我们可以将BMP文件转换为可被Arduino读取的HEX代码数组了。

将BMP图像转换为十六进制代码数组

要将下载的BMP图像转换为HEX数组,请转到diyusthad网站,然后单击Tools -> image2cpp

11f030d6c07d044d3dd40125c13caff9.png

页面上显示四个选项,我们将详细讨论它们。

1.  选择图片

2.  图片设定

3.  预览

4.  输出文件

选择图片部分

在本部分中,我们选择刚刚转换为BMP的图像:

32842f08e97d2f120dabbba24b8e2ce6.png

图片设定部分

在本节中,我们将画布大小(Canvas size)、背景颜色、缩放比例和居中选项设置为所需值。

1.  画布大小(我们将像素设置为128x64,因为我们使用的像素密度为128x64的OLED)。

2.  在本部分中,我们可以设置OLED的背景颜色(我们将其选择为白色)。

3.  缩放比例设置为原始大小。

4.  最后,在center选项中,勾选水平和垂直复选框,这将使图像显示在中心。

782ea0dbbc5dd08b48fef3893ab442da.png

预览部分

在预览部分中,我们可以看到图片的清晰预览,该图像将显示在OLED中,如下所示:

de2be1bb060e505ebc9d22f91e102b32.png

输出部分

在输出部分,我们将生成并复制生成的代码,请按照以下步骤操作:

1.  在Code output format(代码输出格式)中将其设置为Arduino代码。

2.  Identifier标识符(此选项为生成的数组设置名称,我们将其保留为默认值)。

3.  Draw mode绘制模式(将绘制模式选项设置为水平)。

4.  最后,我们单击Generate code按钮,这将生成最终的输出代码。

6225da6e79afb42252ecc74f27747593.png

电路图

下图显示了Arduino Nano和SSD1306之间的连接:

fcd89f2d4b0a0dceebcd511d08676bbb.png

代码说明

为了在OLED上显示图像,我们需要使用Arduino库,该库可以从GitHub存储库下载。下载该库的U8glib-1.19.1.zip版本,并将其导入Arduino IDE中。在下面的部分中,我们将修改代码以将前文生成的HEX数组显示给OLED。本文结尾给出了完整的代码。该代码的详细说明如下。

首先,包括下载的库。

#include "U8glib.h" // including the U8glib library

然后为OLED定义所有必需的引脚。

#define OLED_CLK_PIN 13  //Arduino Digital Pin D13: SCK#define OLED_MOSI_PIN 11 //Arduino Digital Pin D11: MOSI#define OLED_RES_PIN 10 //Arduino Digital Pin D10: SS#define OLED_SDC_PIN 9  //Arduino Digital Pin D9: OC1A#define OLED_CSS_PIN 8 //Arduino Digital Pin 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, 0xf0, 0x00, 0x1c, 0x01, 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, 0xf0, 0x7f, 0x33, 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, 0xf3, 0x01, 0x8f, 0xb1, 0x80, 0x33, 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, 0xf3, 0x01, 0x8f, 0xc1, 0x98, 0x33, 0x81, 0xcf, 0xff, 0xff, 0xff, 0xff,……..………..

Draw()函数使用u8g.drawBitmapP函数在OLED上绘制位图图像(QR码)。

void draw(void) {  // graphic commands to redraw the complete screen should be placed here  u8g.drawBitmapP( 0, 0, 16, 64, circuitdigest);…..……

最后,在loop()函数中,调用相关函数在OLED上绘制图像。

void loop() {  u8g.firstPage();  //A call to this procedure, marks the beginning of the picture loop.  do {    draw();  } while( u8g.nextPage() ); // A call to this procedure, marks the end of the body of the picture loop.  // rebuild the picture after some delay  delay(1000);}

完成代码后,将Arduino插入计算机的USB端口,选择您的COM端口并上传代码。如果正确完成所有操作,则将在OLED上显示有效的QR码。

4ffce1b002d5d479eec6887b9bc380b3.png

希望您喜欢这个项目,如果有任何问题,请在本文下面进行回复。

欢迎打赏+点赞+留言+转发!

更多内容请点击“” 》》

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是手势识别的Arduino代码使用OLED显示屏: ``` #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <SparkFun_APDS9960.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET 4 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); SparkFun_APDS9960 apds; void setup() { Serial.begin(9600); if (!apds.init()) { Serial.println("Failed to initialize APDS-9960 sensor."); } apds.enableGestureSensor(true); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.display(); } void loop() { if (apds.isGestureAvailable()) { switch (apds.readGesture()) { case DIR_UP: display.clearDisplay(); display.setCursor(0, 0); display.println("UP"); display.display(); break; case DIR_DOWN: display.clearDisplay(); display.setCursor(0, 0); display.println("DOWN"); display.display(); break; case DIR_LEFT: display.clearDisplay(); display.setCursor(0, 0); display.println("LEFT"); display.display(); break; case DIR_RIGHT: display.clearDisplay(); display.setCursor(0, 0); display.println("RIGHT"); display.display(); break; case DIR_NEAR: display.clearDisplay(); display.setCursor(0, 0); display.println("NEAR"); display.display(); break; case DIR_FAR: display.clearDisplay(); display.setCursor(0, 0); display.println("FAR"); display.display(); break; default: break; } } } ``` 这个代码使用了SparkFun的APDS9960手势传感器来检测手势,并使用Adafruit的SSD1306 OLED显示屏来显示检测到的手势。在setup()函数中,初始化了传感器和显示屏。在loop()函数中,检测手势并根据手势在显示屏上显示相应的方向。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值