
1. 项目概述与核心价值洗手这件日常小事在特定时期被赋予了更重要的意义。医生们反复强调用肥皂和流水洗手至少20秒是阻断病菌传播最有效的方法之一。但实际操作中一边搓揉双手一边默数20秒很容易分心或数错导致洗手时间不足效果大打折扣。这个痛点催生了我动手制作一个“智能洗手液定时器”的想法。这个项目的核心是打造一个无接触、带倒计时视觉反馈的洗手液分配装置。你只需将手伸到感应区机器会自动挤出定量的洗手液并启动一个从20秒开始的倒计时显示同时伴有提示音确保你完成足够时长的洗手过程。它不仅仅是一个简单的感应出液器更是一个行为引导工具将健康建议转化为直观、可执行的交互。从技术角度看这是一个典型的嵌入式系统与物联网入门实践。它以Arduino UNO微控制器为大脑通过HC-SR04超声波传感器感知手部接近控制继电器和电机完成机械按压出液并驱动两个七段数码管进行倒计时显示。整个项目完整涵盖了信号感知传感器、逻辑处理编程、功率驱动继电器、人机交互显示与声音以及机械传动等多个环节对于想深入学习电子制作、Arduino编程或智能硬件的朋友来说是一个绝佳的综合性练手项目。2. 核心组件选型与原理剖析动手之前我们需要彻底理解每个核心部件的作用和选型理由这是确保项目成功和后续灵活调整的基础。2.1 控制核心为什么是Arduino UNOArduino UNO几乎是所有电子创客项目的起点。选择它主要基于以下几点考量生态成熟资料丰富任何你遇到的问题几乎都能在网上找到解决方案或讨论社区支持强大。开发简单基于C/C语法简化而来的Arduino语言配合其集成开发环境IDE让没有深厚编程基础的人也能快速上手。烧录程序只需一根USB线无需复杂的下载器。接口标准扩展性强板载了数字I/O口、模拟输入口、PWM输出等足以驱动本项目所有外设。其5V工作电压也与大部分传感器、模块兼容。成本低廉且稳定对于此类一次性或小批量制作UNO在成本、性能和易用性上取得了最佳平衡。注意市面上有大量UNO的兼容板建议选择标识清晰的品牌避免因芯片型号或USB转串口芯片不同导致的驱动问题。2.2 感知之眼HC-SR04超声波测距模块本项目实现“无接触”感应的关键。它通过声纳原理工作触发引脚Trig发出一个短暂的高电平脉冲10μs模块会自动发射8个40kHz的超声波脉冲并检测回波。当回波被接收时回声引脚Echo会输出一个高电平脉冲其持续时间与距离成正比。距离计算公式距离 (高电平时间 × 声速) / 2。声速在空气中约为340m/s即0.034 cm/μs。所以代码中的distance (duration / 2) * 0.0343;就是将微秒级的时间转换为厘米距离。选择HC-SR04是因为它性价比极高、精度对于本项目探测手部接近完全足够且接口简单仅需一个Trig和一个Echo引脚加上VCC和GND。它的有效测距范围在2cm到400cm之间我们设定在distance 8厘米时触发这个距离既保证了感应的灵敏度又避免了因远处物体误触发。2.3 显示单元七段数码管及其驱动倒计时需要直观的数字显示。这里选用了两个共阳极七段数码管。每个数码管有7个段a, b, c, d, e, f, g和1个小数点dp本项目未使用小数点。共阳极 vs 共阴极这是关键区别。共阳极数码管的所有LED段的阳极正极连接在一起接VCC5V。当某个段的阴极负极被设置为低电平LOW时该段点亮。原始代码中digitalWrite(a, 0);即是将该段引脚置低点亮该段。如果误用了共阴极数码管所有阴极共地阳极接高电平点亮则显示会完全相反或全亮。限流电阻的必要性每个段都是一个LED。必须串联限流电阻代码清单中提到的1kΩ电阻以保护LED和Arduino的IO口。1kΩ电阻在5V下能提供约5mA电流足以让数码管清晰显示且不会过流。如果没有电阻瞬间大电流可能烧毁LED或损坏Arduino引脚。直接驱动与扫描驱动本项目采用了最直接但也最占用IO口的方法——每个段都用一个独立的Arduino引脚控制。两个数码管显示不同数字因此需要14个IO口7段×2。这几乎耗尽了UNO的所有数字IO。如果未来需要扩展功能应考虑使用数码管驱动芯片如TM1637、MAX7219或动态扫描方式可以大幅节省IO口。2.4 功率开关5V单路继电器模块Arduino的IO口只能提供最大40mA的电流无法直接驱动电机。继电器模块在这里充当了一个由小电流来自Arduino控制大电流电机电路的“电子开关”。工作原理当Arduino给继电器的控制引脚IN高电平时模块内部的继电器线圈通电产生磁场吸合机械触点使公共端COM与常开端NO接通从而让主电路电机电源导通。电气隔离继电器模块内部有光耦等隔离元件能将控制端低压直流和被控端可能更高电压的电机电路隔离开保护Arduino免受电机启停时产生的反向电动势等干扰。接线要点务必区分控制端VCC, GND, IN和被控端COM, NO, NC。我们将电机的电源正极串联在COM和NO之间。当IN为高COM-NO接通电机得电转动。2.5 执行机构BO减速电机与机械杠杆电机的选择直接决定了出液的效果和可靠性。为什么用减速电机Geared Motor普通直流电机转速太快几千至上万RPM扭矩小无法提供平稳、有力的按压动作。减速电机内部集成了齿轮箱将高转速转换为低转速同时大幅提升输出扭矩。这正是我们按压洗手液瓶所需要的——低速、有力。参数选择原作者建议选择“高扭矩、低RPM”的型号。一个典型的适用参数可能是工作电压5-12V转速在10-100 RPM之间扭矩在0.5-2 kg.cm左右。具体需根据你使用的洗手液瓶按压阻力和杠杆设计来调整。机械传动设计这是将电机旋转运动转化为直线按压运动的核心。原作者使用了三连杆机构。其本质是一个曲柄滑块机构的变体。电机轴连接“曲柄”第一根杠杆通过关节带动“连杆”第二根杠杆最终推动“滑块”第三根杠杆即按压头做近似直线运动。这种设计可以放大电机的行程和力使按压更平顺、有力。设计时需考虑杠杆比例、关节的灵活性和整体结构强度。3. 系统电路设计与焊接实操理解了原理接下来就是将各个模块正确、可靠地连接起来。一张清晰的电路图胜过千言万语但实际焊接时还有更多细节需要注意。3.1 电路连接详解与布线技巧根据原始描述和代码我们可以整理出完整的接线表。下表中“Arduino引脚”指的是UNO板上的数字或模拟引脚。元件/模块引脚/端子连接到 Arduino 引脚功能说明与注意事项HC-SR04VCC5V供电TrigA2触发测距信号EchoA1接收回波信号GNDGND共地继电器模块VCC5V模块自身供电GNDGND共地INA3控制信号高电平吸合COM电机电源正极来自外部5V适配器被控电路公共端NO电机正极常开端吸合时导通(NC)悬空常闭端本项目不用电机正极继电器 NO 端受继电器控制负极外部5V适配器负极GND直接接地有源蜂鸣器正极()A0代码中用tone()函数驱动负极(-)GND数码管1a-g 段引脚 7, 8, 9, 10, 11, 12, 13对应代码中的变量a, b, c, d, e, f, g。每个引脚串联1个1kΩ电阻。公共阳极5V所有段的公共正极接5V。数码管2a-g 段引脚 0, 1, 2, 3, 4, 5, 6对应代码中的变量a2, b2, c2, d2, e2, f2, g2。每个引脚串联1个1kΩ电阻。公共阳极5V所有段的公共正极接5V。外部电源5V 2A适配器正极 - 继电器COM端负极 - Arduino GND 电机负极为整个系统供电。Arduino的USB口或Vin口可能无法提供驱动电机的电流必须外接电源。焊接与布线心得使用万用板Vero Board建议将所有元件除传感器、电机、数码管外焊接在一块万用板上制作一个“控制板”。这比用杜邦线直接插接要可靠得多能避免接触不良。电源分离与共地这是关键电机工作时电流较大可能引起电源电压波动干扰Arduino和传感器。理想方案是使用两个独立的5V电源一个给Arduino和逻辑电路传感器、数码管另一个专门给电机供电。但两者必须共地即GND连接在一起否则控制信号无法形成回路。如果用一个电源务必确保其电流足够如2A并在Arduino的5V输入处并联一个大电容如100μF电解电容以平滑电压。线材与颜色使用不同颜色的导线区分功能如红色正极黑色负极黄色信号线后期调试和检修会非常方便。电机线建议使用较粗的线如AWG22。预留接口为传感器、电机、数码管、外部电源设计插座或接线端子方便组装和拆卸。例如使用排针排母、XT30接头或螺丝端子。3.2 代码逻辑深度解析与优化原始代码直接、完整但略显冗长。我们来拆解其逻辑并探讨优化空间。核心逻辑流程初始化 (setup())将所有用到的引脚模式设置为OUTPUT或INPUT。主循环 (loop())测距触发HC-SR04计算距离。触发判断如果距离≤8cm则执行以下序列 a.启动电机digitalWrite(Relay, HIGH);继电器吸合电机转动。 b.出液延时delay(1000);电机持续转动1秒挤出洗手液。这个时间直接决定出液量需根据电机速度和机械结构实测调整。c.停止电机digitalWrite(Relay, LOW);继电器断开。 d.等待手移开delay(3000);给用户移开手并开始洗手的时间防止立即开始倒计时。 e.倒计时显示从20到0每秒更新一次两个数码管的显示。代码中每个数字的显示是通过硬编码每个段的高低电平实现的。 f.结束提示显示“00”并让蜂鸣器以0.5秒的间隔鸣响三次提示时间到。代码优化与改进建议 原始代码的倒计时部分使用了大量重复的digitalWrite语句可读性和可维护性较差。一个更优雅的方式是使用查表法。// 定义共阳极数码管0-9的数字编码对应a-g段1为熄灭0为点亮 const byte digitPattern[10] { B00000010, // 0: a,b,c,d,e,f段亮g段灭 - 二进制 00000010实际需根据接线调整顺序 B10011110, // 1 B00100100, // 2 B00001100, // 3 B10011000, // 4 B01001000, // 5 B01000000, // 6 B00011110, // 7 B00000000, // 8 B00001000 // 9 }; // 显示一个两位数的函数 void displayNumber(int num) { int tens num / 10; int ones num % 10; // 显示十位数如果为0则熄灭所有段即显示“空” if(tens 0) { clearDisplay(1); // 自定义函数熄灭第一个数码管 } else { writeDigit(1, tens); // 自定义函数在数码管1显示数字tens } writeDigit(2, ones); // 在数码管2显示数字ones } // 在倒计时循环中 for(int i20; i0; i--) { displayNumber(i); delay(1000); // 等待1秒 if(i0) { // 触发结束提示音 } }通过引入数组和函数主循环会变得非常简洁。writeDigit函数内部通过位操作根据digitPattern数组来设置各个引脚的电平。这种写法便于修改显示内容如增加小数点也节省了代码空间。4. 机械结构设计与组装要点电路是神经机械结构则是骨骼和肌肉。一个稳固、高效的机械结构是项目成功的一半。4.1 机身设计与材料选择原设计使用了金属薄板自制机身这提供了最大的灵活性。对于大多数制作者一个现成的坚固塑料盒或小型防水盒是更快捷的选择。选择容器时需考虑强度需要承受电机振动和杠杆的受力。空间内部需能容纳Arduino、万用板、电机、继电器和洗手液瓶或连接管路。开孔正面需要为超声波传感器开探测孔为数码管开显示窗。顶部或侧面需要为洗手液瓶开孔。背面需要为电源线开孔。美观与防护可以考虑使用亚克力板制作前面板并喷涂哑光漆以减少传感器误反射。4.2 杠杆传动机构搭建详解这是机械部分的核心目标是让电机旋转约一圈就能完成一次足够行程和力度的按压。材料可以使用铝条、不锈钢条或高强度的塑料条如聚甲醛POM板作为杠杆。关节处可以使用M3螺丝螺母配合垫片来制作确保转动顺滑但又不松旷。也可以在五金店购买现成的合页或连杆接头。尺寸与比例需要实际测量洗手液泵头的按压行程通常1-2厘米和所需力度。通过杠杆比例来放大电机的输出行程和力。例如如果电机输出轴转动半径为1cm希望按压头移动2cm那么从电机轴到按压头的杠杆总长就需要进行相应的设计。通常需要经过几次实物测试和调整。固定与对齐所有杠杆的支点固定转轴必须牢固地安装在机箱底板上。电机也需要用螺丝或扎带牢牢固定。确保电机轴、各杠杆关节和按压头在运动平面内对齐避免卡滞。按压头设计按压头需要适配你的洗手液瓶嘴。可以3D打印一个定制卡扣或者用硬海绵、橡胶块裁剪出一个能与泵头贴合的形状并用胶水或螺丝固定在最终端的杠杆上。一个实用的简化方案如果觉得多连杆设计复杂可以考虑使用蜗轮蜗杆减速电机配合一个凸轮或偏心轮。电机直接驱动凸轮旋转凸轮的外缘顶起一个带有复位弹簧的压杆实现按压。这种结构更紧凑但需要定制或寻找合适的凸轮。5. 系统集成、调试与问题排查当所有部件准备就绪就到了最激动人心也最考验耐心的集成调试阶段。5.1 分步上电与功能测试切勿一次性接好所有线就上电。应遵循“分模块测试逐步集成”的原则核心控制器测试仅连接Arduino到电脑上传一个简单的Blink程序让板载LED闪烁确保其工作正常驱动安装无误。传感器测试单独连接HC-SR04到Arduino上传一个读取距离并在串口监视器显示的测试程序。用手在传感器前移动观察距离值变化是否正常、稳定。调整代码中的触发阈值8cm到你觉得合适的距离。显示测试连接一个数码管上传显示固定数字如“8”的程序确保所有段都能正确点亮且亮度均匀。再测试两个数码管。继电器与电机测试先断开电机只连接继电器模块。上传程序控制继电器反复吸合、断开用万用表通断档测量COM和NO端听继电器是否有清晰的“咔嗒”声。然后接上电机测试电机是否能正常正转。注意电机空转和带载按压时的电流不同。蜂鸣器测试测试tone()函数是否能驱动蜂鸣器发声。全系统联调将所有模块接入上传完整代码。进行端到端测试伸手感应 - 电机转动出液 - 倒计时开始 - 结束提示。5.2 常见问题与解决方案速查表在调试过程中你很可能遇到以下问题。下表列出了可能的原因和排查思路现象可能原因排查与解决方案手靠近无反应1. 传感器未供电或接线错误。2. 触发距离阈值设置不当。3. 传感器前方有遮挡或异物。4. 代码未上传成功或逻辑错误。1. 检查VCC/GND用测试程序单独测传感器。2. 通过串口监视器查看实时距离调整阈值。3. 清洁传感器表面确保感应路径畅通。4. 检查Arduino IDE是否选对板和端口重新上传。电机不转1. 继电器未吸合。2. 电机电源未接通或功率不足。3. 机械结构卡死。1. 测量继电器IN脚电压听吸合声。检查继电器模块供电。2. 用万用表测量电机两端电压。确保外部电源功率足够2A以上且极性正确。3. 断开电机与机械结构的连接看电机能否空转。数码管不亮或显示乱码1. 共阳/共阴极接反。2. 限流电阻未接或断路。3. 引脚定义与代码不符。4. 电流不足多个段同时亮时电压被拉低。1. 确认数码管型号共阳极公共端接5V共阴极公共端接GND。2. 检查每个段是否都串联了电阻。3. 核对代码中a-g引脚定义与实际焊接是否一一对应。4. 尝试单独测试每个段或考虑为数码管提供独立电源。倒计时速度过快/过慢delay(1000);的延时不准确或循环内有其他耗时操作。Arduino的delay()函数在简单项目中基本准确。确保倒计时循环内没有其他长的延时。可以使用millis()函数进行非阻塞式定时以获得更精确和多任务处理能力。出液量不稳定1. 电机转动时间(delay(1000))固定但电池电压下降导致电机转速变慢。2. 洗手液瓶内液位变化导致泵压阻力不同。3. 机械结构有回程间隙。1. 使用稳压电源适配器而非电池。2. 这是一个物理限制可适当增加出液时间作为余量。3. 检查并紧固所有机械连接确保每次按压行程一致。系统运行不稳定偶尔复位1. 电机启停产生电流尖峰和电压跌落干扰Arduino。2. 电源线过长过细压降大。3. 各模块地线未接好共地不良。1. 在电机两端并联一个续流二极管如1N4007阴极接电机正极阳极接负极以吸收反向电动势。在Arduino的5V和GND之间并联一个100-470μF的电解电容和一个0.1μF的瓷片电容。2. 加粗电源线缩短电源路径。3. 确保所有GND最终都连接到电源适配器的负极。5.3 进阶优化与扩展思路当基础功能实现后你可以考虑以下优化让项目更完善、更智能功耗优化目前系统持续工作。可以增加一个红外传感器或触摸开关作为总开关长时间无人使用时进入休眠模式仅留少量电流更节能环保。显示升级用一块I2C接口的OLED屏幕替代数码管可以显示更丰富的信息如“请伸手”、“洗手倒计时15”、“洗手完成”甚至动画图标。这只需要2个IO口SDA, SCL。液量检测在洗手液瓶底部加一个超声波传感器或浮子开关当液位过低时通过LED或屏幕提示“请添加洗手液”。无线连接增加一个Wi-Fi模块如ESP-01S或蓝牙模块如HC-05将洗手次数、液量状态数据上传到手机App或云平台实现简单的物联网功能。结构美化使用3D打印为整个项目制作一个精致的外壳将传感器、屏幕、出液口完美集成使其从一个实验原型变成一个真正的产品。这个项目从构思到实现最大的收获不在于做出了一个能用的洗手液机而在于完整地走通了一个嵌入式产品从传感、处理、控制到执行、反馈的全流程。每一个环节的调试每一次问题的排查都是对理论知识的巩固和动手能力的锤炼。当你看到自己编写的代码通过电路和机械最终转化为一个切实可用的物理动作时那种成就感是纯粹的。希望你在复现或改进这个项目的过程中也能享受到这种创造的乐趣。如果在机械传动部分遇到困难不妨先从简化设计开始比如先用电机直接带动一个偏心轮试试效果再迭代到更复杂的连杆。电子制作乐趣就在于动手和迭代。