1. 项目缘起从“显示”到“交互”的探索最近在折腾一些物联网和智能硬件的项目经常遇到一个场景需要让一个没有屏幕或屏幕很小的设备快速地向手机传递一小段信息。比如一个环境传感器节点采集到的温湿度数据或者一个智能门锁的一次性临时密码。传统的方法可能是通过蓝牙广播或者让设备自己搭建一个Wi-Fi热点让手机去连接。但这些方法要么对用户不够友好需要打开特定App搜索设备要么实现起来对硬件资源要求较高。这时二维码就成了一个非常优雅的解决方案。它本质上是一张“信息图片”任何带摄像头的智能手机都能瞬间读取无需配对、无需连接即扫即得。于是我的目光就落在了手边这块掌控板上。掌控板集成了OLED屏幕、多种传感器和丰富的扩展接口是创客教育和原型开发的利器。它的屏幕虽然不大128x64像素但显示一个简单的二维码理论上完全可行。更重要的是掌控板可以通过Mind这类图形化/代码编程工具进行开发降低了技术门槛。那么能否在掌控板上用Mind编程实现显示一个自定义内容的二维码呢这个想法听起来简单但实操起来却涉及硬件性能、图形算法和编程技巧的交叉。市面上关于掌控板的教程很多但大多集中在传感器数据读取、灯光控制等基础功能深入探讨其图形显示能力特别是动态生成并显示二维码的实践分享并不多见。这正是我决定动手尝试并记录下整个过程的原因。本文将详细拆解如何在Mind环境中驱动掌控板生成并显示任意文本内容对应的二维码并分享其中遇到的性能瓶颈、优化策略以及最终的稳定方案。2. 核心原理拆解二维码如何在微型屏幕上“画”出来在开始写代码之前我们必须先搞清楚两件事二维码是什么以及掌控板的屏幕是如何显示图像的。只有理解了底层原理后续的优化和排错才有方向。2.1 二维码的简化模型从信息到黑白矩阵我们日常见到的二维码主要指QR Code其实是一个标准的编码协议。它将一串文本或URL、联系方式等信息通过特定的纠错算法和编码规则转换成一个由黑白小方块称为“模块”组成的正方形矩阵。对于在掌控板上显示而言我们不需要自己实现完整的、符合ISO标准的QR码生成算法那过于复杂且消耗资源。我们的目标是生成一个功能性的、能被手机扫码软件正确识别的“类二维码”图像。一个可被识别的二维码图像最核心的要素是定位图案通常位于二维码的三个角是“回”字形的大方块用于扫码设备快速定位图像边界和方向。版本信息与格式信息包含纠错等级、掩模模式等元数据。数据区真正存储编码信息的部分由黑白模块填充。对于低分辨率显示如128x64和简单应用我们可以使用轻量级的库来生成一个只包含数据和基本定位图案的二维码矩阵而省略一些高级特性如微缩二维码、特定掩模优化。这样生成的二维码可能不是最标准的但对于手机扫码APP来说只要定位图案清晰、数据模块对比度高绝大多数情况下都能成功识别。2.2 掌控板OLED屏幕的显示机制内存与像素的映射掌控板搭载的是一块0.96英寸的OLED屏幕分辨率为128x64。这种屏幕是单色通常是蓝色或白色的每个像素点只有亮ON或灭OFF两种状态没有灰度等级。在编程上我们通常用一个二维数组或一段连续的内存空间来代表整个屏幕的显示缓存Frame Buffer。数组中的每一个bit位对应屏幕上的一个像素点。例如buffer[x][y] 1表示坐标(x, y)处的像素点亮起。在Mind中当我们使用“显示字符串”或“绘制图形”等积木时底层代码正是在操作这个显示缓存。最终通过调用特定的屏幕驱动函数将整个缓存的数据一次性发送给OLED屏幕的控制器屏幕才会刷新出图像。这个过程称为“刷新”或“渲染”。因此我们的任务就明确了首先生成一个代表二维码的黑白矩阵二维数组然后将这个矩阵的数据正确地“绘制”到掌控板的屏幕显示缓存中对应的位置最后刷新屏幕。这里的关键挑战在于二维码矩阵的大小例如21x21, 25x25等取决于信息长度和纠错等级和屏幕分辨率128x64的匹配与缩放。3. 环境搭建与工具选型为什么是MicroPython与qrcode库明确了原理接下来就要选择实现工具。掌控板支持多种编程方式为什么我最终选择了在Mind中使用Python模式基于MicroPython3.1 放弃图形化积木拥抱代码模式Mind的图形化积木Scratch-like对于入门和简单逻辑控制非常友好但其在处理复杂数据结构如二维数组、循环计算和调用第三方库方面能力较弱且生成的代码有时不够高效。二维码生成涉及大量数学计算和矩阵操作使用图形化积木会变得异常繁琐甚至无法实现。而Mind的“Python模式”则提供了直接编写MicroPython代码的能力。MicroPython是Python 3的精简版本专为微控制器设计保留了列表、字符串处理、函数定义等核心语法非常适合完成我们这项任务。代码模式带来了直接、灵活和高效的控制能力。3.2 引入轻量级二维码生成库qrcode自己从头编写二维码生成算法不现实。幸运的是MicroPython社区已经有了优秀的轻量级库。经过对比我选择了micropython-qrcode这个库。它纯Python实现不依赖其他底层库非常轻量经过优化后可以在掌控板这样的ESP32芯片上运行。它的核心接口非常简单import qrcode # 创建一个QRCode对象 qr qrcode.QRCode(version3, box_size1, border1) # 添加数据 qr.add_data(https://www.example.com) # 生成矩阵 qr.make() # 获取矩阵数据二维列表True/False表示黑白 matrix qr.get_matrix()这里的参数解释version控制二维码的大小版本1-40版本越大能存储的数据越多矩阵也越大。我们需要根据要编码的信息长度选择一个合适的版本避免生成的矩阵太大屏幕放不下。box_size在最终显示时每个二维码“模块”对应多少个像素点。在库内部生成矩阵时此参数为1即可我们后续自己处理缩放。border二维码四周的空白边宽度以模块为单位。至少需要1否则扫码困难。为什么选择这个库我对比过其他几个方案有的库为了追求标准性包含了太多特性导致内存占用过高有的则接口复杂。micropython-qrcode在功能性和资源消耗上取得了很好的平衡生成的matrix直接就是布尔值二维列表与我们屏幕缓存的0/1概念完美对应后续处理逻辑清晰。3.3 在Mind中安装与管理库在Mind的Python模式下安装第三方库需要一点技巧因为其在线库管理可能不包含我们需要的特定库。最可靠的方法是手动安装从GitHub等开源平台获取qrcode.py库文件的源代码。在Mind中连接掌控板进入“Python模式”。在左下角的“文件”区域将qrcode.py文件直接拖拽到“掌控板”的设备文件列表中。Mind会自动将其上传到掌控板的文件系统。在代码中就可以使用import qrcode来引入了。注意确保上传的库文件名称正确且与import语句一致。有时库文件内部可能还有依赖比如binascii但micropython-qrcode是自包含的标准MicroPython环境已满足需求。4. 核心实现步骤从字符串到屏幕亮光环境准备好后就是具体的代码实现环节。整个过程可以分解为四个清晰的步骤。4.1 步骤一生成二维码数据矩阵首先我们需要确定要显示的内容并调用库生成矩阵。import qrcode import time def generate_qr_matrix(text, version3): 根据文本生成二维码矩阵。 :param text: 要编码的字符串 :param version: QR码版本建议1-5根据文本长度调整 :return: 二维列表True代表黑色模块False代表白色 try: qr qrcode.QRCode(versionversion, box_size1, border1) qr.add_data(text) qr.make() return qr.get_matrix() except Exception as e: print(生成二维码失败:, e) return None # 示例生成一个包含网址的二维码矩阵 content Hello,掌控板 matrix generate_qr_matrix(content, version3) if matrix: print(f矩阵生成成功大小{len(matrix)}x{len(matrix[0])})关键点分析version的选择至关重要。版本号从1到40对应从21x21到177x177的模块矩阵。对于“Hello掌控板”这样的短文本版本2或3就足够了。你可以通过qrcode.QRCode().get_best_fit()等方法自动计算但为了代码简单这里手动指定。务必确保生成的矩阵尺寸加上border后不会超过后续缩放计算中屏幕可容纳的范围。border1是必须的它为二维码提供了必要的安静区方便手机摄像头识别边界。4.2 步骤二计算屏幕绘制位置与缩放比例生成的matrix是一个 N x N 的方阵N 21, 25, 29...。我们的屏幕是128x64。直接1:1显示的话如果二维码矩阵大于64就显示不下了。因此我们需要将二维码矩阵“缩放”到适合屏幕的大小并居中显示。def calculate_display_params(matrix, screen_width128, screen_height64): 计算二维码在屏幕上显示的位置和缩放比例。 :param matrix: 二维码矩阵 :param screen_width: 屏幕宽度 :param screen_height: 屏幕高度 :return: (scale, offset_x, offset_y) 缩放倍数起始X坐标起始Y坐标 if not matrix: return 1, 0, 0 qr_size len(matrix) # 二维码矩阵的边长模块数 # 计算最大可能的缩放倍数确保缩放后的尺寸不超过屏幕 # 我们希望在屏幕上留出一点边距所以用屏幕尺寸-10来计算 available_size min(screen_width, screen_height) - 10 # 缩放倍数必须是整数因为一个模块要对应整数个像素 scale available_size // qr_size # 如果计算出的scale小于1说明二维码原始矩阵太大屏幕放不下。 # 这时只能取1但显示会超出屏幕需要用户选择更低的version或更短文本。 scale max(1, scale) # 计算缩放后的实际显示尺寸 display_size qr_size * scale # 计算居中显示的起始坐标 offset_x (screen_width - display_size) // 2 offset_y (screen_height - display_size) // 2 return scale, offset_x, offset_y # 计算显示参数 scale, offset_x, offset_y calculate_display_params(matrix) print(f缩放倍数: {scale}, 起始位置: ({offset_x}, {offset_y}))设计理由整数缩放scale必须是整数。因为二维码模块是离散的不能显示“大半个像素”。这保证了图像的清晰度避免模糊。居中算法通过(屏幕尺寸 - 显示尺寸) // 2来计算起始坐标这是最简单的居中方法。//是整除运算符确保坐标是整数。边界处理available_size min(screen_width, screen_height) - 10预留了5像素的边距让二维码看起来不紧贴屏幕边缘更美观且易于识别。4.3 步骤三将矩阵绘制到屏幕缓存这是最核心的一步我们需要遍历二维码矩阵的每一个模块根据其值True/False在屏幕对应的一个scale x scale的像素方块内进行填充。在Mind的Python环境中我们通常使用display模块来控制OLED。这里假设我们已经初始化了屏幕对象oled。# 假设已初始化 oled 对象例如from mpython import *; oled OLED() def draw_qr_matrix(oled, matrix, scale, offset_x, offset_y): 将二维码矩阵绘制到OLED屏幕上。 :param oled: 初始化的OLED对象 :param matrix: 二维码矩阵 :param scale: 缩放倍数 :param offset_x: 起始X坐标 :param offset_y: 起始Y坐标 if not matrix: return # 先清屏准备绘制 oled.fill(0) # 0代表黑色背景屏幕熄灭 qr_size len(matrix) # 遍历二维码矩阵的每一个模块 for i in range(qr_size): # i 是矩阵的行索引 for j in range(qr_size): # j 是矩阵的列索引 module_value matrix[i][j] # 如果该模块为True黑色则绘制一个方块 if module_value: # 计算该模块在屏幕上对应的矩形区域 pixel_x offset_x j * scale pixel_y offset_y i * scale # 使用fill_rect方法填充一个 scale x scale 的方块 oled.fill_rect(pixel_x, pixel_y, scale, scale, 1) # 1代表白色点亮OLED是单色1为亮 # 所有模块绘制完成后刷新屏幕显示 oled.show() # 调用函数进行绘制 draw_qr_matrix(oled, matrix, scale, offset_x, offset_y)代码逻辑剖析双重循环for i in range(qr_size): for j in range(qr_size):遍历了二维码矩阵的每一个点。matrix[i][j]获取模块值。注意索引顺序i是行Y轴方向j是列X轴方向。pixel_x offset_x j * scale计算当前模块对应屏幕方块的左上角X坐标。j是列索引所以决定水平位置。pixel_y offset_y i * scale计算Y坐标。i是行索引决定垂直位置。oled.fill_rect(x, y, width, height, color)这是绘制矩形的核心函数。我们用它来画一个实心方块。当scale2时每个True模块就画一个2x2的白色方块。oled.show()这是最关键的一步在此之前的所有fill_rect操作都只是在修改内存中的显示缓存。只有调用show()才会把缓存数据一次性发送到屏幕硬件完成图像更新。4.4 步骤四整合与循环显示将以上步骤整合成一个完整的程序并可以添加循环来动态更新二维码内容或者让二维码显示一段时间后清屏。from mpython import * # 导入掌控板硬件控制库 import qrcode import time # 初始化OLED oled OLED() oled.poweron() # 打开屏幕电源 oled.init_display() # 初始化显示 def display_qr_code(text, version3, display_seconds10): 生成并显示二维码持续指定秒数 # 1. 生成矩阵 qr qrcode.QRCode(versionversion, box_size1, border1) qr.add_data(text) qr.make() matrix qr.get_matrix() if not matrix: print(无效的二维码矩阵) return # 2. 计算显示参数 qr_size len(matrix) scale (min(128, 64) - 10) // qr_size scale max(1, scale) # 确保至少为1 display_size qr_size * scale offset_x (128 - display_size) // 2 offset_y (64 - display_size) // 2 # 3. 清屏并绘制 oled.fill(0) for i in range(qr_size): for j in range(qr_size): if matrix[i][j]: pixel_x offset_x j * scale pixel_y offset_y i * scale oled.fill_rect(pixel_x, pixel_y, scale, scale, 1) oled.show() # 4. 保持显示一段时间 time.sleep(display_seconds) # 5. 清屏可选 # oled.fill(0) # oled.show() # 主程序 if __name__ __main__: # 示例1显示一个固定文本 display_qr_code(WIFI:S:MyNetwork;T:WPA;P:MyPassword;;, version4) # 示例2显示传感器数据动态内容 # while True: # temp round(温度传感器.read(), 1) # text fTemp:{temp}C # display_qr_code(text, version2, display_seconds5)这个整合后的函数display_qr_code封装了所有逻辑只需传入文本、版本号和显示时间即可完成一次完整的二维码显示。5. 性能优化与坑点排查让显示更流畅、更稳定直接使用上述基础代码在掌控板上运行可能会遇到性能问题和一些意想不到的“坑”。下面分享我在实测中遇到的挑战和解决方案。5.1 性能瓶颈生成与绘制的耗时当二维码版本较高如version5矩阵37x37且缩放倍数scale3时双重循环需要执行37 * 37 1369次每次循环内可能调用fill_rect。虽然MicroPython已经优化但在ESP32上这仍可能导致明显的延迟感觉卡顿从调用函数到屏幕完全显示出来可能需要0.5秒甚至更久。优化策略一减少绘制调用次数仔细观察当scale1时我们是在画很多个1x1的点。fill_rect( x, y, 1, 1, 1)的效率不如直接操作屏幕缓存底层的一个bit。但直接操作缓存对初学者不友好。一个折中的优化是按行优化填充。 如果一个模块是黑色并且它同一行连续多个模块都是黑色我们可以画一个长矩形而不是多个小方块。但这需要更复杂的逻辑判断。对于初版实现如果对速度不敏感可以接受基础方案的延迟。优化策略二降低二维码复杂度这是最有效的优化。尽量缩短编码文本使用更低的version。例如一个6位数字密码用version2(25x25) 足以容纳。显示速度会快很多。优化策略三预生成与缓存如果二维码内容是固定的比如设备ID可以在程序启动时生成一次矩阵并保存在内存中以后需要显示时直接使用缓存的矩阵进行绘制避免重复执行qr.make()这个计算密集型操作。5.2 显示模糊或扫码失败缩放与对齐的陷阱有时生成的二维码在屏幕上看起来“毛糙”或者手机怎么都扫不出来。问题根因缩放倍数非整数前面强调了scale必须是整数。如果因为计算错误导致scale0当二维码矩阵太大时或者用了非整数绘制坐标会出现小数被截断后导致图形错乱。坐标计算错误offset_x和offset_y计算错误导致二维码没有完全显示在屏幕内或者位置太偏。对比度问题OLED屏幕在低亮度下黑色不发光和白色发光的对比度可能不够。如果环境光太强白色的亮度不足会导致手机摄像头难以分辨。排查与解决添加调试输出在计算完scale, offset_x, offset_y后用print()打印出来。确保scale 1且offset_x 0,offset_y 0,offset_x display_size 128,offset_y display_size 64。检查绘制逻辑在双重循环内部可以临时添加一句print(i, j, pixel_x, pixel_y)来观察前几个模块的坐标计算是否正确。注意屏幕坐标原点(0,0)通常是在左上角。调整屏幕亮度掌控板的oled对象通常有oled.contrast()或oled.brightness()方法具体看驱动库。适当提高对比度或亮度能显著提升扫码成功率。oled.contrast(255) # 将对比度调到最高如果支持简化测试先用一个极简的、已知能扫出来的内容测试比如纯文本“TEST”。并暂时设置scale2或3让二维码看起来更大更清晰。5.3 内存不足与程序崩溃在生成较大版本如version5的二维码时qrcode库内部计算和矩阵存储可能会消耗较多内存。掌控板的ESP32芯片内存有限通常约500KB可用RAM如果同时还有其他变量或复杂逻辑可能导致MemoryError。应对措施监控内存使用import gc; print(gc.mem_free())查看剩余内存。在生成二维码前后分别打印观察内存变化。及时垃圾回收在生成和显示完一个二维码后如果不再需要相关的大变量如matrix可以手动删除它并触发垃圾回收。del matrix, qr gc.collect()使用更低的版本这是根本解决方法。评估你的信息长度选择能满足要求的最低版本。5.4 版本Version选择的经验法则version参数的选择是个经验活。QR码标准规定了每个版本的数据容量。一个快速估算的方法是纯数字最多约(version*4) 17个字符低纠错等级。字母数字容量约为数字的一半。二进制/中文容量更小。对于在掌控板上显示我个人的经验法则是10个以下数字/字母用version2(25x25)。10-20个字符尝试version3(29x29) 或version4(33x33)。超过20个字符先考虑能否精简信息。如果必须再尝试version5(37x37) 并做好性能下降的准备。可以在代码中写一个简单的自动选择逻辑def auto_select_version(text): length len(text) if length 15: return 2 elif length 25: return 3 elif length 40: return 4 else: return 5 # 再大可能显示效果就不好了6. 进阶应用与扩展思路基础功能实现后我们可以探索更多有趣的应用场景让这个项目不止于“显示一个静态码”。6.1 动态内容二维码实时数据显示这是物联网项目的典型应用。将掌控板传感器读取的数据实时编码成二维码显示。from mpython import * import qrcode import time import network import ntptime # 假设已连接Wi-Fi并同步了时间 def get_sensor_data_qr(): 生成包含传感器数据和时间的二维码 # 读取光敏、声音、温度传感器根据实际硬件调整 light_val light.read() sound_val sound.read() # 温度读取可能需要特定传感器这里用模拟值示例 # temp_val dht11.read_temperature() from machine import RTC rtc RTC() # 获取本地时间格式化为字符串 # 注意这里需要先通过NTP或手动设置RTC时间 # year, month, day, weekday, hour, minute, second, _ rtc.datetime() # time_str f{hour:02d}:{minute:02d}:{second:02d} # 构建二维码文本内容 # 可以按照特定格式方便手机端解析 data_text fL:{light_val}|S:{sound_val} # 加入时间: |T:{time_str} return data_text # 在主循环中 while True: dynamic_text get_sensor_data_qr() display_qr_code(dynamic_text, version3, display_seconds3) # 每3秒更新一次 time.sleep(0.5) # 短暂间隔避免刷新太快这样手机扫码后就能看到设备当前采集的环境数据非常适合数据展示或调试。6.2 交互式二维码生成通过按键输入内容结合掌控板上的A/B按键可以实现简单的交互让用户决定显示什么内容。例如按A键显示Wi-Fi信息按B键显示设备状态。from mpython import * import qrcode button_a MPythonPin(button_a_pin, Pin.IN) # 需根据实际引脚定义 button_b MPythonPin(button_b_pin, Pin.IN) qr_content_map { A: WIFI:S:MyHome;T:WPA2;P:12345678;;, B: Device:MasterCtrl_Board\nStatus:Online\nIP:192.168.1.100, } last_press_time 0 debounce_delay 300 # 防抖延时毫秒 def check_button(): global last_press_time current_time time.ticks_ms() if time.ticks_diff(current_time, last_press_time) debounce_delay: return None if button_a.value() 0: # 按键按下通常是低电平 last_press_time current_time return A elif button_b.value() 0: last_press_time current_time return B return None while True: key check_button() if key in qr_content_map: display_qr_code(qr_content_map[key], version4, display_seconds10) time.sleep(0.1) # 降低CPU占用6.3 优化显示效果反色与抖动算法有时为了在特定背景下更醒目或者模拟“深色模式”我们可以显示反色的二维码即亮背景上的暗码。这很简单只需在绘制时把逻辑反过来matrix[i][j]为True时画黑色不点亮为False时画白色点亮。但要注意很多扫码软件对反色二维码的识别率会下降尤其是边框对比度不足时。更高级的优化是抖动算法。当scale不是整数倍时比如scale1.5这不可能或者想实现灰度效果虽然OLED不支持会用到抖动。但在我们当前的单色、整数缩放场景下这不是必须的。了解这个概念有助于未来应对更复杂的显示需求。7. 项目总结与最终代码模板回顾整个项目从原理分析、工具选型到代码实现和优化我们完成了一个在资源受限的嵌入式设备掌控板上动态生成并显示二维码的完整方案。其核心价值在于提供了一种极简的、无需网络配对的信息传递方式拓展了智能硬件的人机交互维度。最终优化版的完整代码模板如下它包含了错误处理、性能提示和良好的结构 掌控板自定义二维码显示程序 依赖micropython-qrcode库 (上传qrcode.py到设备) 硬件掌控板 (ESP32 with OLED) 环境Mind Python模式 from mpython import * import qrcode import time import gc # 初始化硬件 oled OLED() oled.poweron() oled.init_display() # 提高对比度有助于扫码识别 oled.contrast(255) # 定义核心函数 def display_qr_code(text, version3, display_seconds10): 在OLED上生成并显示指定文本的二维码。 Args: text: 要编码的字符串。建议不要太长。 version: QR码版本 (1-10)。越小越快显示越清晰。根据文本长度选择。 display_seconds: 二维码持续显示的秒数。 print(f准备生成二维码文本长度{len(text)} 版本{version}) # 1. 生成二维码矩阵 try: qr qrcode.QRCode(versionversion, box_size1, border1) qr.add_data(text) qr.make() matrix qr.get_matrix() except Exception as e: print(f二维码生成失败: {e}) oled.fill(0) oled.DispChar(QR Gen Error, 0, 0) oled.show() return qr_size len(matrix) print(f二维码矩阵大小: {qr_size}x{qr_size}) # 2. 计算缩放和位置 screen_width, screen_height 128, 64 # 预留边距 available_size min(screen_width, screen_height) - 8 scale available_size // qr_size if scale 1: print(f警告二维码太大(版本{version})无法完整显示。将尝试缩放倍数1。) scale 1 # 此时二维码可能超出屏幕显示不全 display_size qr_size * scale offset_x (screen_width - display_size) // 2 offset_y (screen_height - display_size) // 2 print(f显示参数: scale{scale}, offset({offset_x},{offset_y})) # 3. 清屏并绘制 oled.fill(0) # 黑色背景 draw_start_time time.ticks_ms() for i in range(qr_size): for j in range(qr_size): if matrix[i][j]: # 如果模块是黑色True pixel_x offset_x j * scale pixel_y offset_y i * scale # 注意fill_rect的color1表示点亮像素白色 oled.fill_rect(pixel_x, pixel_y, scale, scale, 1) oled.show() draw_time time.ticks_diff(time.ticks_ms(), draw_start_time) print(f绘制完成耗时: {draw_time}ms) # 4. 保持显示 time.sleep(display_seconds) # 5. 清理内存可选 del qr, matrix gc.collect() # 主程序 / 示例用法 if __name__ __main__: # 示例1显示一个Wi-Fi连接二维码 # 格式WIFI:S:SSID;T:WPA/WEP;P:密码;; wifi_qr_text WIFI:S:MyHomeNet;T:WPA;P:SecurePass123;; display_qr_code(wifi_qr_text, version4, display_seconds15) # 清屏 oled.fill(0) oled.show() time.sleep(1) # 示例2显示简单文本 display_qr_code(Hello from mPython!, version3, display_seconds8) # 示例3显示传感器数据需连接传感器 # while True: # light_val light.read() # sensor_text fLight:{light_val} # display_qr_code(sensor_text, version2, display_seconds3) # time.sleep(1) print(程序执行完毕。)将这个代码复制到Mind的Python编辑器确保qrcode.py库文件已上传到掌控板连接设备并运行你就能看到自定义的二维码在小小的OLED屏幕上清晰显示出来了。拿起手机扫一扫那种通过自己编写的代码让硬件完成一次无线信息传递的成就感正是创客项目的乐趣所在。