基于树莓派与古德微平台的智能视力测试仪设计与实现

发布时间:2026/7/29 15:06:59
基于树莓派与古德微平台的智能视力测试仪设计与实现 1. 项目概述当视力表遇上树莓派几年前我还在社区做创客教育的时候经常需要带孩子们做一些既有趣又有实际意义的项目。传统的视力测试就是一张挂在墙上的“E”字表需要标准距离、标准光照还得有人帮忙指方向流程繁琐且依赖人工。当时我就想能不能用我们手头的树莓派和传感器做一个能自动完成测试、记录结果甚至带点趣味交互的“智能视力测试仪”呢这个想法在2020年借助古德微图形化编程平台得以实现它让复杂的硬件编程变得像搭积木一样简单特别适合像我这样更偏重应用和教学而非底层代码开发的爱好者。这个项目本质上是一个融合了测距、显示与交互的嵌入式系统。它的核心逻辑是通过超声波传感器精确测量用户与屏幕或显示设备之间的距离确保测试在标准距离如5米或2.5米下进行。然后系统在OLED屏幕上随机显示不同朝向、不同大小的“E”字用户通过手势板或按钮来反馈自己看到的“E”字开口方向。系统根据用户回答的正确与否自动调整“E”字的大小即视标等级最终计算出用户的视力值并显示出来。整个过程无需他人协助数据客观还能把测试记录保存下来方便追踪视力变化。它非常适合几类朋友一是对树莓派和物联网感兴趣的硬件爱好者想找一个有明确应用场景的练手项目二是中小学的科技老师或家长希望带孩子做一个结合了健康与科技的综合实践课题三是任何觉得传统视力测试麻烦想自己动手捣鼓点实用小玩意儿的人。即使你之前没怎么接触过编程通过古德微的图形化界面也能比较顺畅地理解整个系统的逻辑并把它搭建出来。2. 核心硬件选型与功能解析一套好用的智能视力测试仪硬件是骨架。选型不仅要考虑功能实现还得兼顾成本、易得性和开发的便利性。下面我结合当时的实践详细拆解每个模块的选择理由和关键参数。2.1 控制核心为什么是树莓派主控选择树莓派几乎是必然的。首先它是一台完整的微型计算机运行Linux系统处理能力远超单片机。这意味着我们可以轻松地运行图形化编程环境古德微、驱动OLED显示复杂的视标图形、处理多线程的传感器数据读取和用户交互未来扩展数据存储、网络上传等功能也毫无压力。其次树莓派的GPIO通用输入输出接口丰富且标准通过简单的杜邦线就能连接各种传感器和外设省去了自己设计电路板的麻烦。最后树莓派拥有极其庞大的社区和资料库无论遇到什么问题几乎都能找到解决方案这对项目成功至关重要。当时我用的是一块树莓派4B当时3B也很流行。4B的性能对于这个项目绰绰有余其关键的GPIO引脚排针与早期型号兼容。你需要关注的是系统安装。我推荐使用Raspberry Pi OS原Raspbian这是官方优化过的系统对硬件支持最好。很多朋友问能不能装Ubuntu对于这个项目我强烈建议就用官方的Raspberry Pi OS Lite无桌面版或带桌面的版本稳定性第一。网上关于修改软件源、安装中文输入法如ibus-pinyin出现闪退等问题大多发生在非官方系统或桌面环境配置不当的情况下我们用古德微平台主要通过浏览器操作对桌面环境依赖不高用最稳定的系统能避免很多坑。注意树莓派5已经发布性能更强但GPIO引脚定义与4B/3B完全兼容所以这个项目在树莓派5上也能完美运行。不过树莓派5的功耗和散热设计有所不同初期使用时确保供电充足建议官方电源并做好散热。2.2 “眼睛”HC-SR04超声波测距模块确保测试距离标准是保证视力结果准确性的第一步。我们选择了最常见的HC-SR04超声波传感器。它的原理很简单触发引脚Trig发送一个至少10微秒的高电平脉冲模块会自动发射8个40kHz的超声波脉冲并检测回波。当接收到回波时回声引脚Echo会输出一个高电平其持续时间与距离成正比。计算距离的公式是距离厘米 高电平时间 * 声速 / 2。声速在常温下约340米/秒即34000厘米/秒。因为声音是往返所以要除以2。在树莓派上我们可以通过编程测量Echo引脚高电平的持续时间微秒然后代入公式距离 (持续时间 / 1000000.0) * 34000 / 2简化后约为持续时间 * 0.017厘米。选择HC-SR04是因为它成本极低十几块钱、接口简单VCC, Trig, Echo, GND四根线、资料丰富。但它也有缺点测量角度较大容易受到周围物体干扰测量精度在厘米级但对于视力测试要求的米级距离如2.5米或5米来说完全够用。接线时要注意HC-SR04是5V逻辑电平而树莓派GPIO是3.3VEcho引脚直接接GPIO可能会损坏树莓派。安全的做法是使用一个简单的分压电路在Echo引脚和树莓派GPIO之间串联一个1kΩ电阻再从GPIO引脚对地接一个2kΩ电阻将5V信号分压至约3.3V。2.3 “试卷”SSD1306 OLED显示屏显示视标“E”字的屏幕我们选择了0.96英寸的SSD1306 OLED屏128x64像素。为什么是OLED而不是LCD首先OLED是自发光对比度极高黑色纯粹显示清晰的“E”字图案时视觉体验更好更接近标准视力表的印刷质感。其次它功耗低视角广模块体积小巧。SSD1306驱动芯片是行业标准有成熟的Python库如Adafruit_CircuitPython_SSD1306和古德微的图形化积木支持。这个屏幕通过I2C接口与树莓派连接只需要四根线VCC, GND, SCL, SDA。I2C的好处是总线制可以并联多个设备且引脚占用少。在树莓派上需要先启用I2C接口通过sudo raspi-config配置。OLED显示汉字或自定义图形如“E”字需要取模。所谓取模就是把一个图形转换成对应的二进制点阵数据。网上有很多在线取模工具你可以输入一个“E”字选择阴码亮点为1、逐列式、16x16或32x32像素等参数生成一串十六进制代码将这串代码存入程序的数组中就能调用显示。古德微平台通常内置了图形绘制积木可以直接画矩形和线条来组合成“E”字这比取模更直观但灵活性稍差。2.4 “答题器”手势识别传感器或按键模块用户如何告知系统他看到的“E”字开口方向有两种主流方案。第一种是使用手势传感器如PAJ7620。这种传感器可以识别上、下、左、右、前、后等简单手势。在测试中用户可以通过在传感器上方挥手向左挥代表开口向左来作答科技感和互动性很强尤其受孩子们欢迎。但手势识别需要一定的学习成本且在不同光照和距离下稳定性需要调试。第二种是更简单可靠的四方向按键模块或四个独立的轻触开关。分别代表上、下、左、右四个方向。用户直接按下对应方向的按键即可。这种方案成本最低操作无歧义可靠性最高。对于以功能实现和准确性为首要目标的项目我推荐使用按键方案。我们将四个按键分别连接到树莓派的四个GPIO引脚并设置为输入模式内部启用上拉电阻这样按键未按下时引脚读数为高电平按下时接地变为低电平。2.5 供电与连接树莓派4B建议使用官方5V/3A的Type-C电源以保证稳定运行特别是当连接了多个外设时。所有传感器和屏幕的供电如果模块支持3.3V尽量从树莓派的3.3V引脚取电以减少电平转换的麻烦和潜在风险。连接线建议使用颜色区分的杜邦线母对母便于管理和排查故障。最好准备一块面包板用于临时连接和测试最终可以焊接在一块洞洞板上做成一个整体。3. 软件环境搭建与古德微平台配置硬件连接好后我们需要让树莓派“活”起来并配置好古德微这个强大的图形化编程工具。3.1 树莓派基础系统设置首先将下载好的Raspberry Pi OS镜像用BalenaEtcher等工具烧录到Micro SD卡。插入卡、连接显示器、键盘鼠标和网络后启动树莓派。完成系统初始设置包括修改密码、设置时区、连接Wi-Fi等。一个关键步骤是启用所需的硬件接口打开终端输入sudo raspi-config。选择Interface Options-I2C 选择“是”以启用I2C用于OLED屏幕。同样在Interface Options中确保SSH已启用这样我们就可以通过局域网远程登录树莓派无需一直连着显示器。可选在Performance Options-Overclock中可以根据需要适当超频但非必须。接下来更换软件源以加速安装更新。编辑源列表文件sudo nano /etc/apt/sources.list将文件中的archive.raspberrypi.org和raspbian.raspberrypi.org域名替换为国内镜像地址例如清华源或中科大源。然后更新软件列表sudo apt update sudo apt upgrade -y。3.2 古德微平台部署与连接古德微Goodway是一个基于Blockly的图形化编程平台它封装了树莓派GPIO、传感器、显示屏等硬件的底层操作让我们可以通过拖拽积木来编程。当时我们需要在树莓派上安装一个“古德微服务端”一个本地运行的Web服务然后在同一局域网内的电脑浏览器上访问树莓派的IP地址进行编程。具体的安装命令可能随版本更新而变化当时通常是在终端执行一行由古德微提供的安装脚本。安装完成后在树莓派上运行服务记下树莓派的IP地址在终端输入hostname -I查看。在电脑浏览器中输入http://树莓派IP地址:8080端口号以实际为准就能看到古德微的编程界面了。在古德微界面中我们需要先“绑定设备”实际上就是让网页前端与树莓派本地的服务建立连接。连接成功后就可以在“积木”区找到“传感器”、“显示器”、“逻辑控制”等分类开始拖拽编程。3.3 关键软件库的安装虽然古德微封装了很多功能但有些底层驱动库仍需手动安装以确保硬件能被正确识别和调用。主要是OLED屏幕的驱动库。通过SSH登录树莓派终端执行以下命令安装必要的Python库和工具sudo apt install python3-pip python3-pil -y sudo pip3 install adafruit-circuitpython-ssd1306 sudo pip3 install pillow # 用于图像处理某些显示方式可能需要安装完成后可以运行一个简单的Python测试脚本检查I2C总线是否识别到了OLED设备地址通常是0x3Csudo i2cdetect -y 1如果看到3c出现在表格中说明连接成功。4. 图形化编程逻辑设计与实现这是项目的核心我们将整个测试流程分解成一个个积木块。古德微的编程思想是“事件驱动”和“流程控制”。4.1 主程序流程框架搭建首先我们需要构建一个清晰的程序主循环逻辑。在古德微中通常用一个“重复执行”的积木作为主框架。初始化阶段程序开始时设置OLED屏幕初始化指定I2C地址和尺寸清空屏幕。设置超声波传感器的Trig和Echo引脚编号。设置四个方向按键对应的GPIO引脚为输入模式。初始化一些变量如当前视力等级、测试距离、正确次数、错误次数等。距离检测循环在正式测试前先进入一个等待循环。持续用超声波传感器测量距离并在OLED上显示实时距离和提示语例如“请站在2.5米处”。只有当检测到的距离在目标距离如2.5米的正负一定容差范围内比如±10厘米时才跳出循环进入测试环节。视力测试逻辑这是最复杂的部分。我们需要一个列表来存储不同大小“E”字对应的像素尺寸或视力值如5.0对应最小的E。程序随机选择一个视力等级并根据这个等级计算出“E”字在OLED上应该用多少像素宽和高的线条来绘制。同时程序还要随机生成“E”字的开口方向上、下、左、右。显示与交互调用古德微的绘图积木在OLED屏幕中央绘制出指定大小和方向的“E”字。然后程序等待用户输入。这里使用一个“等待直到”积木条件为四个按键中有任意一个被按下。判断与反馈获取被按下的按键编号判断其是否与当前“E”字的开口方向一致。如果一致则播放一个正确提示音可以通过连接一个无源蜂鸣器实现或在屏幕上显示“√”并将正确次数加1如果不一致则给出错误提示错误次数加1。根据连续正确或错误的情况按照视力表的标准逻辑如连续正确识别同一行多个视标则进入更小一行来调整当前视力等级。结果计算与显示当达到测试结束条件例如错误达到一定次数或测试了预设的行数后根据能辨认的最小视标所对应的视力值计算出最终视力例如 5.0 - (等级 * 0.1)。将结果清晰地显示在OLED屏幕上并可以存储在树莓派的文本文件中记录测试日期和时间。4.2 核心功能积木块详解超声波测距古德微通常有对应的“超声波传感器”积木直接填入Trig和Echo的引脚号它返回的就是距离值厘米。我们需要将其与预设距离比较。OLED绘图绘制“E”字可以分解为画四条直线或一个矩形加两条线。古德微的显示积木里有“画线”、“画矩形”功能需要填入起始坐标(x0, y0)、结束坐标(x1, y1)和颜色1点亮0熄灭。通过计算我们可以确定一个基准点然后根据“E”字的大小和方向计算出四条线的坐标。例如一个朝右的“E”字可以看作一条垂直的左边线和三条连接在左边线上的水平短线上、中、下。按键防抖机械按键在按下时会产生信号抖动可能导致一次按下被误读为多次。在古德微中可以在检测到按键按下后加入一个“等待50毫秒”的延迟再次读取引脚状态如果仍然是按下状态才确认为有效按键。这是一种简单的软件防抖。随机数生成用于随机选择“E”字方向和下一级的测试视标大小。古德微的“运算”积木里有随机数功能。4.3 数据存储与扩展思考基本的存储我们可以用古德微的“文件”操作积木将每次的测试结果时间、视力值追加写入到一个CSV格式的文本文件中。这样数据就持久化保存在树莓派的SD卡里了。更进一步我们可以考虑扩展数据可视化写一个简单的Python脚本在树莓派上或导出数据到电脑上读取CSV文件用Matplotlib库生成视力变化趋势折线图。网络功能让树莓派连接网络测试完成后通过邮件或即时通讯工具如Telegram Bot将结果发送给家长或用户自己。语音提示接入一个USB麦克风或语音合成模块如SYN6288在测试环节加入语音指导使体验更友好。5. 系统集成、调试与优化心得当所有硬件连接好程序也编写完毕后真正的挑战才刚刚开始让整个系统稳定、可靠地工作。5.1 硬件组装与布线规范为了避免干扰和接触不良建议遵循以下原则电源分离大功率器件如树莓派本身和小信号传感器尽量从不同的排针取电或者使用独立的稳压模块。如果所有设备都从树莓派取电当OLED屏幕点亮、超声波模块工作时可能会引起电源波动导致树莓派重启。信号线远离电源线GPIO信号线特别是I2C的SDA、SCL线尽量与5V电源线分开走线或者垂直交叉减少电磁干扰。固定连接测试阶段用面包板没问题但最终作品建议使用焊锡将杜邦线焊接到传感器引脚上或者使用排针和排母可靠连接。松动的连接是硬件调试中最头疼的问题。共地确保树莓派和所有传感器、屏幕的GND地线都连接在一起这是电路正常工作的基础。5.2 软件调试与问题排查即使图形化编程简化了过程调试仍是必不可少的环节。OLED不显示检查接线确认VCC、GND、SCL、SDA四根线是否正确连接。SCL和SDA是否接反检查I2C地址运行sudo i2cdetect -y 1确认OLED模块的地址通常是0x3C或0x3D。在古德微初始化OLED的积木中填入正确的地址。检查电源有些OLED模块需要5V供电有些3.3V即可但信号线都是3.3V。确认供电电压是否符合模块要求。超声波读数不准或跳动大环境干扰确保传感器前方没有障碍物且测试环境不是极端空旷的回音壁或布满吸音材料的房间。避免在风扇、空调出风口附近测试气流会影响声波。供电不足尝试给HC-SR04单独供电外接5V电源但将其GND与树莓派GND相连。软件滤波在古德微中可以连续读取5次距离去掉一个最大值和一个最小值然后取剩下3次的平均值作为最终结果这能有效平滑数据。按键响应不灵或连击硬件防抖在按键两端并联一个0.1uF的瓷片电容可以吸收抖动。软件防抖优化除了简单的延时可以设计一个状态机。记录按键的“上次状态”和“当前状态”只有当状态从“未按下”变为“按下”时才视为一次有效按键这可以防止长按被识别为多次按下。古德微服务连接失败检查IP地址确保电脑和树莓派在同一个局域网下。用树莓派的终端再次确认IP。检查防火墙临时关闭电脑和路由器上的防火墙试试。重启服务在树莓派终端里查找古德微服务的进程并重启它。5.3 校准与提升测试准确性一个严肃的视力测试仪校准至关重要。距离校准用一把标准的卷尺测量传感器到人眼位置的实际距离与超声波读出的距离对比。如果存在固定偏差可以在程序里设置一个“校准偏移量”进行补偿。视标大小校准这是最关键的。你需要知道在标准测试距离如2.5米下对应视力5.0的“E”字在OLED屏幕上应该占多大像素。标准视力表有严格的视角定义1分角。可以通过公式计算视标高度米 距离米 * tan(视角)。将计算出的物理高度根据OLED屏幕的物理尺寸和像素分辨率换算成像素高度。例如在2.5米处5.0的“E”字高度约为7.3毫米。如果你的OLED屏幕是0.96英寸约24.4毫米高分辨率64像素那么每像素约0.381毫米。7.3毫米就约等于19个像素。你就应该用19个像素的高度来绘制5.0的“E”字。其他视力等级按比例缩放。环境光影响OLED在强光下可能看不清。可以考虑为屏幕加一个遮光罩或者选择在室内光线均匀、避免阳光直射的环境下使用。6. 项目总结与延伸应用做完这个项目它不仅仅是一个视力测试工具更是一个典型的物联网终端应用范例。它涵盖了传感器数据采集超声波、人机交互按键/手势、信息显示OLED、逻辑控制树莓派古德微和本地数据存储的完整链路。在实际使用中我发现最大的成就感来自于看到非技术背景的人比如孩子或老人能够独立完成一次视力测试并且对结果信服。这比单纯让一个LED灯闪烁要有意义得多。这个项目的框架具有很强的可扩展性。比如把超声波传感器换成激光测距模块如VL53L0X精度和抗干扰能力会提升一个档次把OLED屏幕换成一块小的HDMI显示屏就能显示更丰富、更标准的视力表界面甚至结合一个摄像头模块如树莓派官方摄像头可以尝试做更前沿的瞳距测量、眼球追踪等辅助功能。对于想深入的朋友我建议可以尝试脱离古德微图形化环境用Python直接编写代码调用RPi.GPIO库、smbus库用于I2C和PIL库用于绘图。这会让你对底层硬件通信有更深的理解。另一个方向是设计一个美观的外壳用3D打印或激光切割做一个盒子把树莓派和所有模块集成进去形成一个真正的产品原型。最后分享一个我踩过的坑早期版本我用的是更便宜的SR04超声波模块在室内安静环境下还行但一旦有点环境噪音读数就飘得厉害。后来换成了精度和抗干扰稍好的US-015模块虽然贵一点但稳定性提升非常明显。所以在预算允许的情况下关键传感器上不要一味追求最低成本可靠性才是项目能否持续使用的关键。硬件项目就是这样调试和优化的时间往往比搭建要长但解决问题的过程恰恰是收获最大的部分。