恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

基于Arduino的无接触电子骰子:从传感器到显示的完整实现

  • 首页
  • 资讯中心
  • /
  • 基于Arduino的无接触电子骰子:从传感器到显示的完整实现

相关资讯

CodeReview 一次短暂失语:AI 正在悄悄侵蚀程序员的系统手感 2026/8/19 13:26:02
4-1-Computer Class Built-in Variables-uid 2026/8/19 13:26:02
压缩包密码忘了怎么办?免费开源的 ArchivePasswordTestTool 帮你自动找回 2026/8/19 13:26:02

最新资讯

AI 内容工业化时代火遍运营圈,飙算工具箱凭笔记批量创作 + 矩阵分发强势出圈
基于Arduino的实验室自动化整理系统:从硬件选型到状态机编程实践
Linux系统-设备树介绍(四)
北斗芯片换代:从基础定位到高精度时空信息服务的核心技术跃迁
Zaboo:基于Rust与P2P的跨设备隐私优先自动化工具实践
基于ESP32的低成本模块化机器人开发平台Pedro Robot设计与实现

今日推荐

Windows 安卓应用安装终极方案:5分钟上手免费APK安装器,三步告别模拟器
WarcraftHelper 魔兽争霸3优化实战指南
抖音批量下载实战手册:用douyin-downloader把6小时手工劳动压缩到15分钟

本周热门

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码
【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码
隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

基于Arduino的无接触电子骰子:从传感器到显示的完整实现

发布时间:2026/8/19 13:31:02
基于Arduino的无接触电子骰子:从传感器到显示的完整实现 1. 项目缘起为什么需要“无接触”骰子如果你玩过桌面游戏无论是《龙与地下城》这样的角色扮演游戏还是《大富翁》这类家庭聚会游戏都离不开一个核心道具骰子。传统的骰子需要你用手去投掷、去拾取、去读取点数。但在一些特定场景下这个简单的动作会变得不那么方便。想象一下你正在厨房处理食材手上沾满了面粉或油污却需要为游戏投出一个点数或者在疫情期间多人轮流接触同一个骰子总让人心里有点膈应又或者你只是想为你的智能桌面、互动装置增加一个充满科技感的随机数生成器。“无接触电子骰子”这个项目就是为了解决这些痛点而生。它本质上是一个基于Arduino的随机数发生器通过非接触式传感器比如红外、超声波或手势传感器来触发结果通过LED点阵、数码管或OLED屏幕直观显示。这不仅仅是一个简单的“电子骰子”其核心价值在于“无接触”的交互方式它让随机数的获取过程变得更卫生、更有趣也更具有科技感和自动化潜力。我自己最初做这个项目是为了给家里的桌游之夜增加点新意后来发现它还能很好地用于教学展示Arduino如何连接传感器、处理信号并驱动显示设备。整个项目的硬件成本可控代码逻辑清晰非常适合作为Arduino入门后的第一个综合性实战项目。接下来我将从硬件选型、电路搭建、代码编写到调试优化完整地拆解如何制作一个稳定、灵敏且美观的无接触电子骰子。2. 核心硬件选型与电路设计思路制作一个电子骰子我们需要几个核心模块主控、触发传感器、显示单元以及电源。市面上Arduino板卡和传感器琳琅满目如何选择最适合我们这个项目的组合这里我基于稳定性、成本、易用性和最终效果给出我的方案和背后的思考。2.1 主控板为什么是Arduino Uno在众多热词中Arduino Uno的出现频率极高这并非偶然。对于本项目我强烈推荐使用Arduino Uno或其兼容板作为主控。选择理由资源充足与引脚兼容性Uno拥有14个数字I/O口和6个模拟输入口足以连接传感器、显示模块并为未来扩展如添加蜂鸣器反馈预留空间。其标准的引脚布局使得各类扩展板Shield和传感器模块能够即插即用降低了连接复杂度。社区支持与稳定性Uno是Arduino家族中最经典、资料最丰富的型号。无论是arduino ide下载、arduino编程遇到的问题还是特定库的安装你几乎都能找到现成的解决方案。其ATmega328P芯片性能稳定足以流畅运行本项目逻辑。学习成本低对于初学者而言从Uno开始能建立最标准的Arduino开发认知。虽然esp32、stm32功能更强大但初期配置环境如arduino ide搭建esp32可能会遇到更多环境问题分散对核心逻辑的注意力。关于其他板卡的思考ESP32如果你希望骰子能联网将投掷结果同步到手机或云端那么ESP32是更好的选择。但这引入了Wi-Fi配置、网络通信等复杂度偏离了“简单易用的实体交互设备”这一核心目标。arduino开发esp32虽然可行但属于进阶话题。STM32性能强劲但在Arduino IDE中使用需要额外安装核心支持包stm32怎么添加库对新手不够友好。除非你对功耗和性能有极致要求否则Uno是更稳妥的起点。2.2 触发传感器三种无接触方案的深度对比“无接触”是本项目的灵魂传感器的选择直接决定了交互体验。主流方案有红外对管、超声波模块和手势传感器。传感器类型典型型号工作原理优点缺点适用场景红外接近TCRT5000发射红外光接收反射光通过反射强度判断前方是否有物体。成本极低几毛钱电路简单响应速度快。检测距离短通常1-3cm易受环境光干扰不同颜色和材质的物体反射率不同可能导致误触发。需要非常近距离如掠过式触发成本敏感的项目。超声波测距HC-SR04发射超声波并接收回波通过时间差计算距离。检测距离远2cm-4m精度较高不受光线影响。成本稍高模块有一定体积连续测量时需注意时序防止信号冲突。需要在一定距离如10-30cm外挥手触发的场景体验更自然。手势识别APDS-9960集成红外LED和传感器通过检测反射光图案的变化来识别手势上、下、左、右、靠近。交互体验最炫酷可直接识别“挥手”动作无需物体真正靠近。成本最高需要I2C通信编程稍复杂对环境光仍有一定敏感性。追求极致科技感和复杂交互的项目如区分不同的触发手势。我的选择与理由 对于大多数初次制作的朋友我推荐HC-SR04超声波模块。它在成本、易用性和体验上取得了很好的平衡。arduino控制舵机的教程里也常用到这个模块资料非常丰富。我们不需要它精确测距只需要判断“是否有物体进入预设的触发距离范围例如10cm以内”这个逻辑非常容易实现。相比红外它不受环境光影响体验更可靠相比手势传感器它又便宜且简单。注意HC-SR04的Trig触发和Echo回响引脚需要接数字口。网上有资料说需要5V供电但实测3.3V也能工作不过为求稳定建议接在Uno的5V引脚上。2.3 显示方案如何直观地呈现点数显示骰子点数有几种常见方案各有利弊。七段数码管最经典显示数字清晰成本低。但一个数码管只能显示一位数字0-9显示1-6需要额外的译码逻辑或动态扫描。如果要模拟骰子翻滚的动画实现起来比较麻烦。LED点阵如8x8灵活性极高可以显示数字、简单的骰子图案甚至动画。通过arduino ws2812这类可寻址LED灯带也能实现效果更炫酷但编程控制相对复杂需要处理图形数据。OLED显示屏显示效果最精致可以显示任意图形、文字和动画。通过I2C接口连接只需两根信号线。你可以轻松地画出一个骰子的轮廓并将点数用圆点显示出来视觉效果最好。我的选择与理由 我推荐使用0.96英寸的I2C OLED屏幕SSD1306驱动。原因如下视觉效果好能显示逼真的骰子图形提升项目质感。编程友好有成熟的Adafruit_SSD1306和Adafruit_GFX库支持画点、画圆、画线非常方便。节省引脚I2C通信仅占用A4SDA和A5SCL两个模拟口为其他功能预留了充足空间。功能扩展性强未来可以轻松升级为显示多颗骰子结果、历史记录或游戏状态。2.4 电路连接图与电源考量整个系统的连接非常简单。以下是基于Arduino Uno、HC-SR04和I2C OLED的接线表Arduino Uno引脚连接模块模块引脚说明5VHC-SR04Vcc供电GNDHC-SR04Gnd共地数字口 D7HC-SR04Trig触发测距信号数字口 D6HC-SR04Echo接收回波信号5VOLEDVCC供电GNDOLEDGND共地A4 (SDA)OLEDSDAI2C数据线A5 (SCL)OLEDSCLI2C时钟线电源方面在开发调试阶段通过USB线供电即可。如果希望做成独立设备可以考虑使用一个9V电池配合桶形插座或者更持久的方案是使用一块18650锂电池搭配TP4056充电模块和升压模块输出5V。后者成本稍高但可重复充电更适合长期使用。3. 核心代码逻辑与随机数生成奥秘硬件连接好后大脑代码才是让项目活起来的关键。我们的程序需要完成几个核心任务循环检测触发条件、生成随机数、驱动屏幕显示动画。这里面的门道尤其是“如何生成真正随机的骰子点数”是项目的核心。3.1 主循环与状态机设计一个健壮的程序不应该把所有代码都堆在loop()里。我习惯使用“状态机”的思想来组织代码让逻辑更清晰。对于骰子来说可以定义两个主要状态等待状态不断检测超声波传感器判断是否有物体进入触发区。滚动状态一旦触发则在屏幕上快速显示一系列随机数模拟滚动最后定格在最终点数上。// 伪代码框架 enum DiceState { WAITING, ROLLING }; DiceState currentState WAITING; void loop() { switch (currentState) { case WAITING: if (checkTrigger()) { // 检测到触发手势 currentState ROLLING; startRollingAnimation(); // 进入滚动状态 } break; case ROLLING: updateRollingAnimation(); // 更新滚动动画 if (isAnimationFinished()) { // 动画结束 showFinalResult(); // 显示最终结果 currentState WAITING; // 回归等待状态 } break; } }这种结构的好处是每个状态职责明确便于调试和后续增加新状态比如增加一个“显示历史结果”的状态。3.2 随机数的“真随机”与“伪随机”这是本项目的一个关键知识点。Arduino的random()函数生成的是“伪随机数”。它需要一个“种子”来启动随机序列。如果每次上电都用默认种子那么每次重启后生成的随机数序列可能是一样的。这就是为什么有些人发现自己的电子骰子每次开机后前几次投掷的结果序列总是一样。解决方案使用模拟噪声作为随机种子。Arduino的未连接悬空的模拟输入引脚会读取到环境电磁噪声这个值是真随机的或至少是难以预测的。我们可以在setup()函数中读取一个悬空的模拟引脚如A0的值作为randomSeed()的种子。void setup() { // ... 其他初始化代码 randomSeed(analogRead(A0)); // 用模拟引脚A0的噪声初始化随机数种子 }实操心得确保你用作种子的模拟引脚如A0不要连接任何东西让它悬空。这样读取到的值波动才足够大。你也可以将这个引脚连接到一个温度传感器或麦克风arduino 拾音器上用更真实的环境变量做种子但悬空引脚是最简单有效的方法。3.3 超声波传感器触发检测的稳健写法网上很多HC-SR04的例程直接在主循环中触发和读取但在实际使用中可能会因为中断或其他延时导致测量超时或出错。一个更稳健的写法是封装一个函数并加入超时判断。const int trigPin 7; const int echoPin 6; const int triggerDistance 10; // 触发距离单位厘米 bool checkTrigger() { // 发送一个10微秒的高脉冲触发测距 digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // 读取回波脉冲宽度并设置超时例如超过30ms则认为无回波对应约5米距离 long duration pulseIn(echoPin, HIGH, 30000UL); // 计算距离声速340米/秒除以2因为是往返距离 int distance duration * 0.034 / 2; // 如果测得的距离有效且小于触发距离则返回true if (distance 0 distance triggerDistance) { // 可选加入简单防抖连续几次检测到才认为触发 return true; } return false; }注意pulseIn函数的第三个参数是超时时间微秒。这里设为3000030毫秒如果30ms内没收到回波函数会返回0。这个超时时间需要根据你期望的最大检测距离来设置。计算方式最大距离厘米* 2 * 29.1微秒/厘米。例如希望最大检测100cm则超时可设为100229.1 ≈ 5800微秒。3.4 OLED屏幕显示骰子动画使用Adafruit_SSD1306和Adafruit_GFX库可以轻松绘图。我们需要实现两个函数一个用于绘制特定点数的骰子面一个用于实现滚动动画。首先定义一个函数来画骰子。我们假设屏幕是128x64像素我们在中间画一个60x60的正方形作为骰子并在里面画圆点。#include Adafruit_GFX.h #include Adafruit_SSD1306.h #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, Wire, -1); void drawDiceFace(int number) { display.clearDisplay(); // 画骰子外框 display.drawRoundRect(34, 2, 60, 60, 10, SSD1306_WHITE); // 圆角矩形 // 根据点数画圆点 // 骰子点位的坐标相对左上角34,2的偏移量 int dotPos[7][2] {{30,30}, // 中心点用于点数1 {20,20}, {40,40}, // 左上和右下用于点数2 {20,20}, {30,30}, {40,40}, // 用于点数3 {20,20}, {20,40}, {40,20}, {40,40}, // 用于点数4 {20,20}, {20,40}, {30,30}, {40,20}, {40,40}, // 用于点数5 {20,20}, {20,30}, {20,40}, {40,20}, {40,30}, {40,40}}; // 用于点数6 int dotCount[7] {0, 1, 2, 3, 4, 5, 6}; // 索引对应点数索引0不用 for (int i 0; i dotCount[number]; i) { // 计算实际屏幕坐标 int x 34 dotPos[i][0]; int y 2 dotPos[i][1]; display.fillCircle(x, y, 4, SSD1306_WHITE); // 画实心圆点半径4像素 } display.display(); }然后在滚动状态中我们可以快速循环调用drawDiceFace(random(1,7))并逐渐减慢速度最后定格在最终结果上从而模拟出骰子翻滚减速停止的效果。4. 系统集成、调试与进阶优化当硬件连接完毕核心代码模块也准备好后我们将它们整合成一个完整的、可工作的系统。这个阶段会遇到许多在单独测试时不曾出现的问题也是经验积累的关键环节。4.1 整合代码与首次上电测试将传感器检测、状态机、随机数生成和显示函数整合到一个.ino文件中。务必注意全局变量的定义、setup()中的初始化顺序先Serial.begin用于调试再初始化OLED最后初始化传感器引脚模式。首次上传代码后建议先打开串口监视器arduino ide内置功能将超声波测距的原始距离数据打印出来。这能帮你确认传感器是否正常工作。校准你的触发距离。挥手测试看看实际检测距离是多少然后调整代码中的triggerDistance变量到一个舒适的值比如15cm。观察是否有异常值如偶尔出现极大或极小的值这可能是干扰信号。踩坑记录我曾遇到OLED屏幕不显示的问题排查后发现是I2C地址不对。大多数0.96寸OLED的地址是0x3C但有些是0x3D。在display.begin(SSD1306_SWITCHCAPVCC, 0x3C)中尝试更改地址或者用I2C扫描程序网上有现成代码来查找设备地址。4.2 防抖与防误触发策略在实际使用中手在传感器前无意掠过或者物体短暂停留都可能引发误触发。我们需要在软件上增加“防抖”逻辑。策略一持续触发判断不要检测到一次距离小于阈值就立刻触发而是改为“连续N次检测都满足条件才算触发”。这能过滤掉瞬间的干扰。int triggerCount 0; const int triggerThreshold 3; // 连续3次检测到才算 bool checkTriggerStable() { int distance measureDistance(); // 封装好的测距函数 if (distance 0 distance triggerDistance) { triggerCount; if (triggerCount triggerThreshold) { triggerCount 0; return true; } } else { triggerCount 0; // 条件不满足计数器清零 } return false; }策略二触发后冷却一次触发并完成滚动动画后设置一个“冷却时间”比如1秒在这段时间内即使检测到物体也不响应。这可以防止一次挥手动作被误判为多次触发。4.3 功耗优化与电池供电考量如果你计划用电池供电功耗就是一个必须考虑的问题。Arduino Uno在常规运行下功耗约50mA加上传感器和屏幕总功耗可能接近100mA。一块9V电池约600mAh可能只能支撑几个小时。优化建议使用睡眠模式在等待状态可以让Arduino进入空闲Idle或掉电Power-down睡眠模式。这需要配置中断将超声波传感器的触发信号连接到外部中断引脚。当有物体靠近时产生中断唤醒Arduino。这是最有效的省电方式但实现稍复杂。降低屏幕功耗OLED屏幕在显示时功耗较大。在等待状态可以调用display.clearDisplay()和display.display()来关闭像素或者直接控制屏幕的电源引脚如果模块支持。考虑更换主控如果对功耗极其敏感可以考虑使用ATtiny85等低功耗AVR芯片或者ESP32在深度睡眠模式下的功耗可以低至10μA级别但开发难度会增加。4.4 外观设计与交互增强一个成功的项目除了功能外观和交互体验也同样重要。外壳设计 可以使用3D打印一个外壳将Arduino、传感器和屏幕封装起来。设计时注意为超声波传感器留出清晰的“窗口”避免塑料外壳对声波造成干扰或折射。为屏幕开一个透明窗。预留USB口或电源开关的位置。考虑散热如果使用线性稳压长时间工作会有一定发热。交互增强声音反馈添加一个有源蜂鸣器或无源蜂鸣器。在触发时发出“嘀”一声提示在点数确定时发出不同的音调体验更完整。多骰子模式通过增加一个按钮或通过不同的触发手势如果使用APDS-9960可以切换生成1个、2个甚至3个骰子的点数并计算总和适配更多游戏规则。历史记录利用OLED屏幕在显示当前点数后按一下按钮可以翻看最近5次的投掷记录。这需要引入数组来存储历史数据。4.5 常见问题排查QA在制作过程中你可能会遇到以下问题这里提供排查思路Q1超声波传感器读数不稳定偶尔跳变到极大或极小值。A1这是最常见的问题。首先确保Vcc和Gnd连接牢固电源电压稳定。其次检查pulseIn的超时时间是否设置合理见3.3节。第三在代码中加入滤波算法比如“中值滤波”连续采样5次排序后取中间值或“均值滤波”连续采样多次取平均能极大提升数据稳定性。Q2OLED屏幕初始化失败显示乱码或完全不亮。A2第一确认I2C地址0x3C或0x3D。第二检查接线SDA和SCL是否接反A4接SDAA5接SCL。第三检查库是否安装正确。有时Adafruit_SSD1306库需要特定版本才能兼容你的屏幕驱动芯片可以尝试在库管理器中搜索并安装更新版本的库。Q3感觉“随机数”不够随机某些数字出现频率异常高。A3回归到3.2节。确保你正确使用了randomSeed(analogRead(A0))并且A0引脚是悬空的。你可以在串口监视器中打印出analogRead(A0)的值观察上电时的初始值是否每次都有较大变化。如果变化不大可以尝试读取多个模拟引脚的值进行组合运算作为更复杂的种子。Q4整体响应速度慢挥手后要等一会儿才出结果。A4检查你的滚动动画函数。如果动画帧数太多或每帧延时太长会导致整个滚动过程耗时过久。可以适当减少滚动次数比如从15次减到8次或者使用非阻塞的定时方式millis()函数来控制动画帧率而不是用delay()这样在动画期间系统还能响应其他输入虽然本项目不需要。通过以上四个部分的详细拆解从设计思路到硬件选型从核心代码到调试优化一个完整的、可玩性高的无接触电子骰子项目就清晰地呈现出来了。这个项目麻雀虽小五脏俱全涵盖了嵌入式开发中传感器数据采集、人机交互、状态控制、显示驱动等多个核心环节。当你亲手完成它看到挥手之间屏幕上的骰子图案飞速滚动并定格时那种成就感正是创客乐趣的源泉。更重要的是在这个过程中积累的排查问题、优化体验的经验会让你在后续更复杂的项目中受益匪浅。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号