1. 项目概述一个“保持社交距离”的自动洗手液分配器最近几年大家对公共卫生和个人防护的意识显著提高了。一个很具体、很实际的需求摆在我们面前如何在公共或半公共场所比如办公室前台、小型商店入口、家庭玄关既方便地取用洗手液进行手部清洁又能最大限度地减少人与人、人与物的直接接触传统的按压式或壁挂式洗手液瓶需要每个人都去触摸同一个泵头这本身就成了一个潜在的交叉接触点。这个“Social Distancing Hand Wash Dispenser”项目就是为了解决这个问题而生的。它的核心思路很简单利用常见的电子元件制作一个非接触式的、自动感应出液的洗手液装置。你不需要用手去按压只需要将手伸到感应器下方机器就会自动喷出定量的洗手液或消毒凝胶。这不仅能有效减少接触提升卫生水平其自动化和“无接触”的科技感本身也能在潜移默化中鼓励更多人养成勤洗手的好习惯。这个项目非常适合对电子制作、Arduino或树莓派编程感兴趣的爱好者、创客也适合小型商户或社区空间的负责人自己动手改造以极低的成本提升场所的卫生形象。它涉及传感器技术、基础电路设计和简单的机械控制是一个将创意转化为实用产品的经典案例。接下来我会详细拆解从设计思路、元件选型到组装调试的全过程并分享我在制作过程中踩过的坑和总结的经验。2. 项目整体设计与核心思路拆解制作一个自动洗手液机听起来可能有点复杂但如果我们把它拆解成几个功能模块就会清晰很多。整个系统的运行逻辑可以概括为“感知-决策-执行”。2.1 核心功能逻辑与方案选型首先我们需要一个“眼睛”来感知是否有手靠近。这里最常见的方案是使用红外接近传感器或超声波测距传感器。我优先推荐红外接近传感器例如HC-SR501人体红外感应模块因为它价格低廉、功耗相对较低且专门为检测人体移动设计误触发少。超声波传感器如HC-SR04虽然测距精确但功耗稍高且对于只是伸手这样一个动作红外方案完全够用且更稳定。当传感器检测到手部时需要有一个“大脑”来处理这个信号并发出控制指令。对于这个项目一块Arduino Uno或Arduino Nano开发板是绝佳的选择。它易于编程、社区资源丰富、引脚够用是创客项目的标配。树莓派虽然功能强大但用于控制一个继电器和传感器有点“杀鸡用牛刀”且成本、功耗都更高。“大脑”做出“出液”决策后就需要“手”来执行。洗手液瓶的泵头通常是机械按压的。我们的执行机构就是用一个微型直流减速电机配合一个简单的机械结构比如凸轮去模拟“按压”动作或者更直接地使用一个微型电磁阀来控制液路。但考虑到洗手液通常比较粘稠电磁阀容易堵塞且需要额外的液路系统对于初学者不够友好。因此我强烈推荐使用5V继电器模块直接控制一个现成的自动洗手液机泵头。这种泵头是市面上很多自动洗手液机的核心部件内部集成了电机和机械结构我们只需要给它提供电源通常是3-6V它就能完成一次完整的按压出液动作。这大大降低了机械设计的难度和失败率。最后还需要一个“能量中心”。整个系统需要稳定的5V电源。如果放在固定位置一个5V/2A的USB电源适配器加一根Micro USB线给Arduino供电是最稳妥的。如果想做成便携或电池供电可以考虑使用18650锂电池搭配充放电保护板但需要注意续航问题因为电机工作瞬间电流较大。所以最终的方案链就是HC-SR501传感器检测到手 → Arduino板接收到高电平信号 → Arduino控制继电器模块闭合 → 继电器为自动泵头接通电源 → 泵头工作一次喷出洗手液。2.2 为什么选择“继电器成品泵头”方案这里重点解释一下这个关键选择。很多DIY教程会教你用舵机去拨动原瓶的压嘴或者用电机带动螺杆推动活塞。这些方案固然有创意但存在几个普遍问题力度和行程控制难不同洗手液瓶的压嘴阻力不同需要反复调试舵机角度或电机行程否则可能按不动或按过量。可靠性差机械结构不够稳固长期使用容易错位、磨损。通用性低换一个瓶子可能就需要重新调整。而直接购买专用的自动出液泵头相当于把最复杂的机械部分外包给了专业厂家。这种泵头通常包括微型电机提供动力。齿轮箱减速并增大扭矩。活塞机构将旋转运动转化为直线运动推动液体。吸管和喷嘴完整的液路。我们只需要提供电源它就能输出一个标准化、定量通常是0.8-1.2ml的液体。它的接口通常是两根导线正负极完美适配继电器控制。虽然比单独买一个传感器或继电器稍贵大约10-20元但它节省了你无数调试机械结构的时间极大地提高了项目的成功率和成品的美观度、可靠性。这是我认为这个项目中最值得的投资。3. 核心元件解析与电路连接要点工欲善其事必先利其器。我们先来详细认识一下要用到的几个核心元件以及如何将它们正确地连接起来。3.1 元件清单与功能说明主控板Arduino Uno R3。这是大脑负责运行我们的控制程序。选择Uno是因为其引脚有防呆设计方便插线且USB接口为B型连接稳定。传感器HC-SR501 人体红外感应模块。它的工作电压是5V-20V我们直接接Arduino的5V。它有三个引脚VCC电源、GND电源-、OUT信号输出。当检测到人体移动时OUT引脚会输出高电平约3.3V持续一段时间可通过模块上的电位器调节通常调至最小出液间隔。执行器5V 高电平触发单路继电器模块。注意是“高电平触发”意思是当控制端IN收到高电平信号时公共端COM和常开端NO会接通。它也有三个引脚VCC、GND、IN。我们用它来控制泵头电源的通断。泵头3-6V 直流自动出液泵头。这是核心执行机构。通常有红黑两根线红色接电源正极黑色接负极。电源给Arduino和整个系统供电一个5V/2A的USB电源适配器。Arduino的Vin引脚或USB口接入均可。给泵头供电由于泵头工作电流可能超过Arduino引脚的最大输出电流约500mA我们不能直接用Arduino的5V引脚驱动泵头。因此需要外部电源。这里一个巧妙的做法是使用一个5V双路输出电源适配器一路给Arduino供电另一路通过继电器给泵头供电。或者用一个输出能力足够的5V电源如2A接入Arduino的电源输入口然后从Arduino的5V引脚取电给传感器和继电器而泵头的电源则从电源适配器上直接分接由继电器控制。切记泵头电源绝不能直接接在Arduino的5V引脚上其他杜邦线若干公对公、母对母、一个容纳所有元件的盒子可以是塑料收纳盒需要开孔、固定用的热熔胶枪或螺丝。3.2 电路连接详解与原理图连接电路是项目的关键一步务必仔细。遵循“先信号后电源先低压后高压”的原则。这里我们所有部件都是5V属于低压相对安全。连接步骤给Arduino供电将5V USB电源适配器连接到Arduino的USB口或Vin引脚如果使用Vin请确保电源是7-12V直流但我们的5V适配器接USB口最方便。连接HC-SR501传感器传感器VCC → Arduino 5V引脚传感器GND → Arduino GND引脚传感器OUT → Arduino 数字引脚 2这里选择引脚2你可以选其他数字引脚但代码中要对应修改连接继电器模块继电器VCC → Arduino 5V引脚继电器GND → Arduino GND引脚继电器IN → Arduino 数字引脚 3连接泵头与外部电源重点准备一个5V电源可以是独立的也可以是从给Arduino供电的电源上分接出的另一路。找到电源的正极和负极-。将电源的正极接到继电器模块的常开端NO。将泵头的红色线接到继电器模块的公共端COM。将电源的负极-和泵头的黑色线-直接连接在一起。这样当Arduino让继电器吸合时COM和NO接通电源的正极就通过继电器流到了泵头正极与已经连通的负极构成回路泵头工作。重要提示在接通泵头电源前务必用万用表确认一下电源电压是否为泵头标称的3-6V范围内通常5V没问题。接反极性可能会损坏泵头。电路逻辑简述传感器检测到手输出高电平给Arduino引脚2。Arduino程序检测到这个信号随即向引脚3输出一个高电平脉冲比如持续500毫秒。这个脉冲使继电器吸合500毫秒在此期间外部电源通过继电器给泵头供电泵头完成一次按压出液动作。之后继电器断开等待下一次触发。4. 程序设计、上传与核心逻辑实现硬件连接好后就需要给Arduino“注入灵魂”——编写并上传控制程序。代码非常简单但里面有一些细节决定了用户体验的好坏。4.1 代码逐行解析与编写打开Arduino IDE新建一个项目输入以下代码// 定义引脚常量提高代码可读性和可维护性 const int sensorPin 2; // 红外传感器信号线接在数字引脚2 const int relayPin 3; // 继电器控制线接在数字引脚3 const int dispenseTime 500; // 继电器吸合即出液时间单位毫秒 // 防误触发相关变量 unsigned long lastDispenseTime 0; // 记录上一次出液的时间点 const unsigned long cooldownPeriod 3000; // 冷却时间3秒内不重复触发 void setup() { // 初始化串口通信用于调试发布时可以注释掉 Serial.begin(9600); Serial.println(Auto Hand Sanitizer Dispenser Initialized.); // 配置传感器引脚为输入模式读取传感器的信号 pinMode(sensorPin, INPUT); // 配置继电器引脚为输出模式用于控制继电器通断 pinMode(relayPin, OUTPUT); digitalWrite(relayPin, LOW); // 初始状态确保继电器是断开状态 } void loop() { // 1. 读取传感器状态 int sensorState digitalRead(sensorPin); // 2. 打印传感器状态到串口监视器调试用 Serial.print(Sensor State: ); Serial.println(sensorState); // 3. 判断是否触发出液条件 // 条件一传感器检测到高电平有手靠近 // 条件二距离上一次出液已经过了至少cooldownPeriod毫秒防误触发 if (sensorState HIGH (millis() - lastDispenseTime) cooldownPeriod) { Serial.println(Dispensing...); // 调试信息 // 4. 触发出液打开继电器 digitalWrite(relayPin, HIGH); delay(dispenseTime); // 保持继电器吸合一段时间让泵头完成一次完整动作 // 5. 关闭继电器 digitalWrite(relayPin, LOW); // 6. 更新上一次出液时间 lastDispenseTime millis(); Serial.println(Done.); // 调试信息 // 7. 一个小延时避免loop循环过快在冷却期结束前重复判断 delay(100); } // 如果没有触发则进行一个很短的延时减少CPU占用 delay(50); }代码关键点解读防误触发机制 (cooldownPeriod)这是代码中最重要的一环。HC-SR501传感器在触发后其输出高电平会持续一段时间可调通常2-3秒。如果不加处理在这持续的几秒内loop()函数会飞速运行数百次每次都满足触发条件导致继电器疯狂开合泵头连续工作可能一下喷出大量洗手液。我们通过记录lastDispenseTime并与当前时间millis()做比较强制两次出液动作之间必须间隔至少cooldownPeriod这里设为3000毫秒即3秒。这个时间应略大于传感器自身的输出延时和泵头单次工作周期之和。出液时间 (dispenseTime)500毫秒是一个经验起始值。不同的泵头其内部电机完成一次按压所需的时间不同。时间太短可能按压不到位出液量少或不稳定时间太长电机可能被堵转发热甚至损坏。这个值需要根据你实际购买的泵头进行测试和调整。测试时可以从300ms开始尝试逐步增加直到出液量稳定且电机声音顺畅为止。调试信息Serial.print语句在初期调试时极其有用。你可以打开Arduino IDE的“串口监视器”工具-串口监视器波特率设为9600实时查看传感器状态和程序运行逻辑快速定位问题是传感器没检测到还是继电器没动作。初始状态在setup()中一定要将relayPin设置为LOW确保设备上电时继电器是断开的避免意外启动。4.2 程序上传与初步测试用USB数据线将Arduino Uno连接到电脑。在Arduino IDE中选择正确的板卡类型工具-板卡-Arduino Uno和端口工具-端口-对应的COM口。点击“上传”按钮向右的箭头。上传成功后先不要连接泵头的电源。打开串口监视器。用手在HC-SR501传感器前晃动观察串口监视器。你应该能看到“Sensor State: 1”和“Dispensing...”、“Done.”的打印信息。同时可以听到继电器模块发出“咔哒”一声吸合的声音。如果继电器能正常响应说明传感器和逻辑控制部分工作正常。此时再连接泵头的外部电源进行最终的出液测试。5. 机械组装、外壳设计与用户体验优化电路和程序都调试成功后我们需要给它一个“家”并优化细节让它从一个实验台上的原型变成一个可以日常使用的产品。5.1 外壳制作与元件布局一个合适的外壳能保护电路、固定元件、提升美观度。你可以使用现成的塑料防水盒也可以使用3D打印定制外壳。布局要点传感器开孔HC-SR501传感器前方有一个半球形的菲涅尔透镜这是它的“眼睛”。必须将这个透镜部分完全暴露在外前方不能有遮挡亚克力板也会大幅衰减信号。开孔直径略小于透镜即可或者将传感器模块整体嵌在壳体外。泵头安装这是核心。你需要将泵头牢固地固定在壳体内。通常泵头底部有螺丝孔或卡扣设计。可以用螺丝配合支架固定或者用扎带、热熔胶注意承重和耐久性。泵头的吸管要能伸到外部的洗手液储液瓶中喷嘴要伸出外壳一定距离确保液体能喷到手中而不是流到机器上。出液口与储液瓶储液瓶可以用原来的洗手液瓶剪掉泵头部分将吸管插入即可。确保连接处密封良好防止漏液。出液口下方最好设计一个浅浅的导流槽防止偶尔滴落的液体污染机身。电源线与开关建议在电源线上加一个船型开关方便彻底断电。所有电线在壳体内要整理好用扎带固定避免缠绕或接触到运动部件如泵头的电机部分。5.2 灵敏度调节与出液量校准HC-SR501灵敏度与延时调节模块上有两个电位器。一个是灵敏度调节Sensitivity逆时针旋转降低灵敏度检测距离变短顺时针提高。另一个是延时调节Time Delay即触发后输出高电平的持续时间。对于洗手液机我们希望灵敏度适中比如检测距离15-25厘米避免过远误触发延时时间应调至最短逆时针拧到底因为我们用代码来控制防误触发传感器自身的延时越短响应越快。出液量校准这需要通过调整代码中的dispenseTime来实现。准备一个小的量杯或已知重量的容器。将dispenseTime设为300ms运行程序触发10次收集液体计算单次平均出液量。如果出液量不足比如少于0.8ml逐步增加dispenseTime每次增加50ms重复测试。如果出液量过多则减少时间。目标是单次出液量在1ml左右且泵头电机声音清脆无拖沓或堵转声。注意不要追求过大的出液量而设置过长的通电时间这可能烧毁泵头内的小电机。5.3 进阶优化与功能扩展基础功能实现后可以考虑以下优化让作品更完善状态指示增加一个LED灯。传感器检测到时LED闪烁出液时LED常亮。让用户有明确的视觉反馈。液位检测在储液瓶内增加一个浮球开关或红外对管当液体用完时让另一个LED灯常亮或闪烁报警。电池供电与低功耗如果想做成完全无线的可以使用大容量18650电池两节串联约7.4V通过降压模块给系统供电并将代码改为休眠模式。Arduino平时深度休眠仅由HC-SR501的报警中断唤醒这样可以极大延长续航。外观美化使用亚克力板、木纹贴纸、喷涂油漆等方式美化外壳让它更好地融入使用环境。6. 常见问题排查与实战经验分享在实际制作过程中你几乎一定会遇到下面这些问题。我把它们和解决方法整理出来希望能帮你节省大量时间。6.1 问题速查表问题现象可能原因排查步骤与解决方案传感器无反应1. 电源未接通或接反。2. 传感器损坏。3. 感应透镜被遮挡。4. 引脚接错。1. 检查VCC和GND是否分别接到5V和GND用万用表测电压。2. 观察传感器上通常有一个红色指示灯检测到移动时会闪烁。不亮则可能损坏。3. 确保传感器前方无任何遮挡特别是金属外壳。4. 确认OUT引脚接到了正确的Arduino数字引脚。继电器不动作1. 继电器触发方式不对。2. Arduino控制引脚输出问题。3. 继电器损坏。1.确认你买的是“高电平触发”继电器。用杜邦线将IN脚直接接到5V听是否有“咔哒”声。有则继电器是好的问题在控制信号。2. 在代码中手动给控制引脚写HIGH用万用表测该引脚电压是否为~5V。检查代码中引脚号是否正确。3. 更换继电器模块。泵头不工作/出液量小1. 泵头电源未接通或电压不足。2. 继电器未正确接通泵头电路。3.dispenseTime时间太短。4. 吸管未插入液面下或漏气。5. 泵头内部有气泡或初次使用未 priming引液。1. 用万用表直接测量泵头两根线在触发时的电压确保在4.5V以上。2. 触发时用万用表通断档测继电器COM和NO是否导通。3.逐步增加dispenseTime这是最常见的原因。4. 确保吸管插到底接口密封。5.首次使用或更换液体后需要“引液”长时间给泵头通电如2-3秒让电机持续运转将液体从瓶底抽上来直到喷嘴流出。泵头连续工作不停1. 代码中缺少防误触发机制。2.cooldownPeriod设置时间过短小于传感器自身延时。3. 传感器一直输出高电平可能损坏或灵敏度调太高有持续热源干扰。1.检查代码是否包含了lastDispenseTime和cooldownPeriod的逻辑。2. 将cooldownPeriod增加到5000ms以上试试。3. 用串口监视器查看传感器状态是否一直为1。移开可能的热源如灯泡、暖气或降低灵敏度。出液后滴漏1. 泵头质量不佳止回阀不严。2. 液体过于稀薄。3. 喷嘴有残留。1. 更换质量更好的泵头。这是硬件问题较难修复。2. 使用粘稠度适中的洗手液或凝胶。3. 在出液口下方加装导流槽或海绵吸附垫。6.2 实操心得与避坑指南先分模块调试再系统集成不要把所有东西焊死或粘死再测试。先单独测试传感器看串口输出再单独测试继电器用代码控制最后接上泵头不装液体测试动作。全部正常后再组装固定。这能帮你快速定位问题模块。电源是万恶之源至少70%的奇怪问题都和电源有关。确保你的5V电源适配器在带载尤其是电机启动瞬间时电压不会跌落到4.5V以下。电机启动电流大差的电源会瞬间被拉低电压导致Arduino重启或继电器工作不稳定。用一个旧的手机充电头往往比某些劣质的“USB供电模块”更可靠。重视“引液”操作新的泵头或更换液体后管道里是空气泵头空转是无法将液体吸上来的。你需要让泵头持续工作几秒钟直到喷嘴有液体连续流出。可以在代码里临时写一个长延时或者直接短接继电器输出端给泵头长时间通电来完成这一步。密封密封密封所有液路连接处特别是吸管和泵头进口、泵头和储液瓶口的连接处必须密封良好。一点点漏气就会导致吸不上液或出液无力。可以使用合适的硅胶软管并加上卡箍或扎带紧固。为维护留余地设计外壳时考虑如何方便地添加洗手液、清洁喷嘴、更换电池。不要用死胶把所有东西都封在里面。使用螺丝固定盖板或者设计可滑开的卡扣会让你的作品寿命更长。这个项目从想法到实现最有成就感的那一刻不是代码第一次跑通而是当你把手伸过去机器“嗡”的一声精准地吐出一团凝胶到你手心的时候。它不仅仅是一个简单的电子制作更是一个切实解决微小痛点的产品思维实践。你可以根据这个基础框架衍生出很多变体比如非接触式的消毒喷雾机、自动给皂器等等。