
1. 项目概述从零打造一个智能药盒对于需要长期服药的人来说每天从一堆瓶瓶罐罐里数出正确的药片不仅繁琐更是一个关乎健康与安全的严肃任务。漏服、错服的情况时有发生尤其对记忆力减退的老年人或需要同时服用多种药物的慢性病患者而言管理药物成了一项挑战。市面上的智能药盒产品要么功能单一要么价格昂贵且往往缺乏定制化空间。这正是我们动手设计并制作“Supplement Bot”的初衷。这是一个基于Arduino的开源自动药丸分配器项目它不仅仅是一个课程作业更是一个旨在解决真实需求的、可完全复现的工程实践。项目的核心目标很明确设计一个能够自动、准确、按时分配多种药丸并通过友好的人机交互界面和提醒功能确保用户按时按量服药的设备。它支持两种不同类型的药丸用户可以通过触摸屏预设每种药丸的剂量组合并设置提醒闹钟。当闹钟响起设备会自动配药并通过红外传感器验证药丸是否成功掉落确保万无一失。整个项目涵盖了从需求分析、机械结构设计、电子电路搭建到嵌入式软件开发的完整产品开发流程。我们选择了步进电机作为驱动核心利用3D打印和激光切割技术制作机械部件并集成了触摸屏和传感器最终将所有模块整合到一个坚固的外壳中。无论你是电子爱好者、机械专业的学生还是对智能硬件开发感兴趣的创客这个项目都能为你提供一个从概念到实物的绝佳学习案例。接下来我将以第一人称视角详细拆解我们是如何一步步将这个想法变成现实的其中包含大量在实验室里踩过的坑和总结出的实战经验。2. 核心需求与设计思路拆解在动手画第一张草图之前我们必须清晰地定义这个“自动药丸分配器”到底要解决什么问题以及如何以最优化的方式去解决。这不仅仅是功能的堆砌更是一个在成本、可靠性、易用性和可扩展性之间寻找平衡的系统工程。2.1 核心功能需求解析基于用户场景我们提炼出以下几个必须实现的核心功能药丸存储与隔离设备需要能容纳足够量的药丸并确保不同种类的药丸物理隔离避免混淆。考虑到家庭使用场景存储量至少应满足数周至一个月的用量以减少频繁填充的麻烦。精准单粒分配这是整个设备的技术核心也是最容易出问题的环节。机构必须保证每次动作只掉落一粒药丸不能多也不能少“空转”。这对于大小、形状各异的药丸是一个挑战。多类型组合输出用户往往需要同时服用多种药物。设备应能根据预设从不同存储仓中按指定数量依次或同时分配药丸并最终汇集到同一个出口方便用户取用。分配过程验证仅仅发出“分配指令”是不够的。必须有一种可靠的方式检测药丸是否真的成功掉落。这是防止“漏服”的最后一道保险。定时提醒与交互设备需要具备实时时钟RTC功能允许用户设置一个或多个服药时间点。到达时间后应通过声光等方式强烈提醒用户并且提醒最好只能通过物理交互如点击触摸屏确认关闭强制用户走到设备前取药。预设记忆与用户界面用户应能方便地设置和保存常用的药丸组合例如“早餐后A药1粒B药2粒”。一个直观的图形化触摸屏界面远比一堆按钮和数码管显示更友好尤其对年长用户。2.2 技术方案选型与权衡围绕上述功能我们对每个环节进行了技术选型其中充满了各种权衡与决策。驱动机构的选择步进电机 vs. 伺服电机这是第一个关键决策。伺服电机通常用于需要控制特定角度如0-180度的场景自带位置反馈。而步进电机可以将整圈旋转分割成许多细小的步进角通过控制脉冲数来精确控制旋转角度和速度在开环控制下就能实现精准定位。为什么最终选择步进电机我们的分配机制基于一个带孔洞的旋转盘。每次分配需要旋转盘精确转动一整圈360度以确保孔洞再次与出口对齐为下一次分配做好准备。伺服电机通常无法连续旋转360度强行使用需要复杂的改装。而步进电机如常用的NEMA 17配合A4988驱动模块可以轻松实现精确的360度旋转控制无需额外的位置传感器反馈简化了系统和代码逻辑。虽然伺服电机在扭矩和速度响应上有优势但对于我们这种低速、精确角位移的应用步进电机的简单可靠更具吸引力。检测方案的选择红外对管 vs. 激光测距为了验证药丸掉落我们需要在药丸下落路径上设置一个检测点。我们评估了两种方案红外发射-接收对管以及激光测距传感器如VL53L0X。 红外对管的工作原理是发射管持续发出红外光接收管接收。当药丸下落穿过光束时会短暂遮挡光线导致接收端信号变化从而触发中断。激光测距传感器则是主动测量到下方物体的距离药丸掉落时距离值会突变。为什么选择红外对管从原理上看激光传感器更“高级”一个模块就能完成检测。但在实际编码和调试中我们发现了问题。激光传感器设计用于连续测量距离它会持续输出数据我们需要在代码中不断读取并判断距离是否发生“突变”来检测药丸这增加了主循环的负担和逻辑复杂度。而红外对管的输出是简单的数字信号有遮挡为高/低电平我们可以直接将其连接到Arduino的中断引脚。药丸遮挡的瞬间硬件自动触发中断软件只需在中断服务程序里将一个计数变量加一即可代码干净利落响应也极其迅速。虽然这意味着每个检测点需要两个元件发射管和接收管但系统的可靠性和易实现性更高。人机交互的选择触摸屏 vs. 传统按钮LCD早期我们考虑过使用1602 LCD屏加几个按钮或摇杆的方案成本较低。但仔细一想用户需要设置时间、选择预设、输入各种药丸数量用几个按钮来操作会非常繁琐体验很差。为什么选择Nextion触摸屏我们最终选用了Nextion Enhanced系列触摸屏。它本质上是一个带处理器的独立显示模块可以通过专用的上位机软件进行图形化界面设计拖拽按钮、文本框、图片等并编译下载到屏幕中。屏幕通过串口与Arduino通信界面上的按钮被按下时会向Arduino发送预设的指令代码。这带来了巨大优势复杂的界面逻辑和渲染由屏幕自己处理大大减轻了Arduino的负担开发体验好可以像设计手机APP一样设计界面最终用户操作直观点击屏幕即可完成所有设置。虽然成本更高但它极大地提升了产品的可用性和“科技感”是值得的投资。机械结构的选择旋转盘式分离对于“单粒分配”这个核心机械功能我们构思了多种方案包括垂直落管活门、漏斗弹簧推杆等。最终选定“双层旋转盘”方案原因在于其动作可靠、对药丸形状适应性较强通过更换上层盘实现且易于通过3D打印加工。 其工作原理是一个静止的下层盘固定支撑药瓶一个由电机驱动的上层旋转盘紧贴其下。两层盘上各有一个特定尺寸的孔洞。药瓶中的药丸依靠重力堆积在旋转盘上。旋转盘转动时其上的孔洞会依次扫过药瓶底部的区域。当孔洞转动到药瓶正下方时一粒药丸会落入孔中。随着旋转盘继续转动该孔洞会与下层盘的孔洞对齐药丸便从两层盘之间掉落。两层盘之间的缝隙经过精心设计只允许一粒药丸通过。一个固定在药瓶内的分隔板起到关键作用它阻止了药丸在瓶内随意滚动确保每次只有有限的药丸有机会进入旋转盘的孔洞从而大大降低了同时卡住多粒药丸的概率。3. 机械系统设计与实现细节机械部分是整个设备的骨架其可靠性直接决定了项目的成败。我们的设计遵循“快速原型”思想使用3D打印FDM制作复杂曲面零件使用激光切割制作平板结构件并经历了多次“设计-打印-测试-改进”的迭代。3.1 药丸存储仓设计存储仓就是一个简单的圆筒但细节决定成败。材料与透明度我们使用透明的PLA进行3D打印。透明不是为了好看而是为了实现“可视化库存管理”。用户一眼就能看出哪个仓的药丸快用完了无需任何电子传感器既降低成本又提升可靠性。容量计算我们以常见的“00号”胶囊直径约8mm长24mm为设计基准。假设用户每天服药3次每月补充一次药瓶并预留15%的余量。单个药丸体积约为π * (4mm)² * 24mm ≈ 1206 mm³。每月所需总体积为1206 mm³/粒 * 3粒/天 * 30天 ≈ 108,540 mm³。考虑15%余量及包装效率药丸间有空隙我们设计了一个内径94mm、高80mm的圆筒其内部容积约为π * (47mm)² * 80mm ≈ 555,000 mm³远大于需求确保充足容量。防旋转结构初版药瓶直接放在底盘上测试时发现当旋转盘转动时摩擦力可能导致药瓶跟着一起转这会扰乱药丸的供给。我们在药瓶底部增加了一圈卡槽与下层静止盘上的凸起形成形状配合彻底锁死了药瓶的旋转自由度。分隔板的集成为了配合分隔板防止药丸堆积在出口对面我们在药瓶顶部内侧设计了一圈卡扣结构用于固定激光切割而成的分隔板使其垂直立于瓶内。3.2 核心药丸分离机构详解分离机构由上层旋转盘、下层静止盘和分隔板三个核心部件协同工作。上层旋转盘 这是运动部件设计演变最大。初版是一个厚10mm的平板中心开孔连接电机轴。测试发现药丸有时会卡在孔洞边缘无法顺利掉落。改进1添加倒角。我们在孔洞的上边缘添加了45度倒角形成了一个“漏斗状”的引导面帮助药丸更顺滑地落入孔中。改进2改为锥形盘。将平板设计改为中心高、边缘低的锥形面。这样药丸在重力作用下会自然向边缘的低处滚动更容易进入位于边缘区域的孔洞提高了供药的可靠性。改进3独立的联轴器。最初电机轴是直接插入打印盘中心的孔中靠摩擦力传动容易打滑。我们改为设计一个独立的联轴器零件一端用顶丝固定在电机轴上另一端通过黄铜热熔螺母嵌入和螺丝与旋转盘紧固。这种机械连接方式无比牢固。下层静止盘 这个部件承担了多重功能支撑药瓶、提供药丸掉落通道、固定整个机构。环形槽设计盘面上开有一个环形槽药瓶底部的凸缘正好嵌入此槽中实现了精准定位和初步固定。倾斜安装在测试中我们发现让整个分离机构略微倾斜约10-15度能显著改善药丸的流动性和分配成功率。倾斜后药丸在重力作用下更倾向于聚集在分隔板的一侧从而更有序地进入旋转盘的孔洞。为此我们专门设计了一个倾斜的安装底板将静止盘固定在上面。分隔板 这是一个看似简单却至关重要的零件。它是一块垂直插入药瓶的板子将药瓶底部分割成两个区域。它的作用是阻止药丸在瓶内“闲逛”。没有它药丸可能会堆积在远离出口孔洞的一侧导致旋转盘空转。分隔板确保了每次只有位于“活动区”的少量药丸有机会接触旋转盘孔洞是实现“单粒分配”的关键。3.3 支撑结构与总装设备的外壳和内部支撑结构全部采用6mm厚的MDF中密度纤维板通过激光切割制作。选择MDF主要是出于成本和加工便利性的考虑。结构设计采用模块化设计包括底板、两侧板、背板和前面板通过螺丝和螺母连接形成一个坚固的箱体。前面板开有窗口用于放置触摸屏和观察药瓶。漏斗集成为了将两个分配出口的药丸汇集到同一个取药口我们设计了一个由三块MDF板拼合而成的内置漏斗。它被巧妙地安装在箱体内部侧板之间不占用外部空间外观整洁。布局规划箱体内部空间分为上下两层。上层倾斜安装着两个分配机构下层空间则容纳了Arduino、面包板、电机驱动模块等所有电子设备。这种布局使得布线相对集中也便于维护。一个重要的教训在激光切割设计连接孔时一定要在孔周围预留足够的材料边界。我们最初有几个孔设计得离板边太近导致安装时木板边缘非常容易劈裂。后来在所有受力孔周围都增加了材料宽度解决了这个问题。4. 电路设计与传感器集成电路部分是将机械动作与智能控制连接起来的桥梁。我们的目标是搭建一个稳定、易于调试的原型系统。4.1 核心元件清单与作用控制核心Arduino Uno。经典的开源微控制器平台I/O口丰富社区资源庞大是快速原型开发的绝佳选择。驱动模块A4988步进电机驱动模块。它接收Arduino发出的脉冲和方向信号并输出大电流来驱动NEMA 17步进电机。模块上的微步进设置引脚允许我们将电机每圈的200步细分如16微步使转动更平滑但本项目为简化控制使用了全步进模式。检测单元KY-005 红外发射管和KY-022 红外接收模块。每个检测点需要一对。发射管需串联一个100Ω左右的限流电阻具体值根据发射管规格调整连接到5V电源。接收模块输出数字信号直接连接到Arduino的中断引脚。人机界面Nextion NX3224K028 2.8英寸触摸屏。它通过TX/RX串口引脚与Arduino通信需要单独供电5V。提醒装置无源压电蜂鸣器。连接到Arduino的一个PWM引脚通过tone()函数发出不同频率的提示音。电源步进电机和Arduino需要较大的电流。我们使用了一个12V/2A的直流电源适配器为整个系统供电。12V直接供给A4988模块的VMOT引脚同时通过一个降压模块或Arduino的Vin引脚为Arduino和其他5V设备供电。务必注意A4988的逻辑部分VDD和电机部分VMOT的电源最好隔离或者确保共地。我们采用了共地方案并确保电源功率充足避免电机启动时导致电压骤降引起Arduino复位。4.2 电路连接图与布线心得最终的电路连接思路清晰Arduino的Digital Pin 4, 5, 6, 7 分别连接两个A4988的DIR方向和STEP步进引脚。两个红外接收模块的OUT引脚分别接到Arduino的中断引脚2和3。蜂鸣器接在Pin 9。Nextion屏幕的RX/TX分别接Arduino的TX/RX。这里有一个关键点由于Arduino的硬件串口0,1引脚同时用于与电脑通信上传程序、调试输出当屏幕接上后会干扰程序上传。我们的解决方案是上传程序时暂时拔掉屏幕的RX/TX线。或者可以使用SoftwareSerial库将屏幕连接到其他数字引脚但硬件串口通常更稳定。所有元件和Arduino共地。实操心得布线整洁就是调试效率在面包板上搭建原型时我们一开始用了各种颜色的杜邦线杂乱无章。当某个电机不转或传感器没信号时排查线路成了噩梦。后来我们强制推行了“颜色规范”红色为5V黑色为GND黄色为信号线绿色为电机控制线。同时为每个功能模块如左电机驱动、右传感器组尽量将线捆在一起。这小小的习惯在后期集成和排查故障时节省了大量时间。另外为步进电机驱动模块配备足够的去耦电容如在电源入口处并联一个100μF的电解电容和一个0.1μF的瓷片电容能有效吸收电机启停产生的电压尖峰让系统更稳定。4.3 传感器调试技巧红外对管的调试需要耐心对准是关键发射管和接收管必须尽可能正对中间不能有障碍物。我们先用热熔胶枪将它们初步固定在倾斜底板的下方对准药丸掉落通道。然后用手机摄像头大部分手机摄像头能看到红外光观察当发射管通电时摄像头里应该能看到一个亮白点。调整接收模块的位置直到其上的信号指示灯如果有对遮挡反应最灵敏。环境光干扰自然光或室内灯光中富含红外线可能会干扰接收管。我们为接收管制作了一个简单的遮光罩用一小段黑色热缩管套住接收窗口效果立竿见影。距离与灵敏度发射和接收管之间的距离不宜过远1-3厘米内效果最好。药丸下落速度快遮挡时间极短毫秒级确保接收模块的输出信号是清晰的数字跳变如从高电平变为低电平。可以在Arduino代码中读取引脚状态并打印到串口监视器观察药丸掉落时的信号变化是否干净利落。5. 软件逻辑与代码剖析软件是设备的大脑负责协调所有硬件并处理用户输入。我们的代码结构围绕状态管理和中断响应展开。5.1 触摸屏界面设计与Arduino通信Nextion屏幕的界面使用其专用的“Nextion Editor”软件开发。我们设计了几个主要页面主页显示当前时间、日期并有按钮进入设置菜单。预设页面两个页面分别对应“预设1”和“预设2”。每个页面上有两个数字选择器用于设置两种药丸的数量和一个“分配”按钮。闹钟设置页面用于设置提醒时间。界面上的每个按钮都关联了一个“触发ID”。当按钮被按下时屏幕会通过串口向Arduino发送一条指令例如page4.b0.val1表示页面4的按钮0被按下值为1。在Arduino端我们使用EasyNextionLibrary来监听并解析这些串口指令。#include EasyNextionLibrary.h EasyNex myObject(Serial); // 使用硬件串口 void setup() { Serial.begin(9600); myObject.begin(9600); } void loop() { myObject.NextionListen(); // 监听串口处理来自屏幕的指令 } // 在Nextion编辑器中为“分配预设1”按钮设置“Release Command”: printh 23 02 54 00 // 这串十六进制码对应触发 trigger0 void trigger0() { // 当Arduino收到该指令时自动调用此函数 preset1 1; // 启动预设1分配标志 desiredPill1 myObject.readNumber(page4.n0.val); // 从屏幕组件读取数值 desiredPill2 myObject.readNumber(page4.n1.val); // 重置计数 numberOfPills1 0; numberOfPills2 0; }这种事件驱动的编程模式使得界面逻辑与核心控制逻辑解耦代码清晰易维护。5.2 核心控制逻辑与状态机设备的核心行为可以看作一个状态机。主要状态包括空闲、等待闹钟、分配中、验证中。我们通过几个全局变量标志位来实现int alarm 0; // 闹钟触发标志 int preset1 0, preset2 0; // 哪个预设被激活 int desiredPill1 0, desiredPill2 0; // 目标药丸数量 volatile int numberOfPills1 0, numberOfPills2 0; // 实际掉落计数由中断修改主循环loop()不断检查这些标志位void loop() { myObject.NextionListen(); // 1. 处理用户输入最高优先级 // 2. 检查闹钟 if (alarm 1) { ring_buzzer(); // 持续响铃直到用户触摸屏幕关闭 } // 3. 检查并执行预设分配 if (preset1 1) { if (numberOfPills1 desiredPill1) { run_motor1(); // 驱动电机1转动一次 delay(500); // 等待药丸掉落和稳定 } if (numberOfPills2 desiredPill2) { run_motor2(); delay(500); } // 检查是否完成 if (numberOfPills1 desiredPill1 numberOfPills2 desiredPill2) { preset1 0; // 分配完成重置状态 // ... 重置计数器 } } // 同理处理 preset2 }5.3 中断服务程序精准的掉落检测药丸掉落检测对实时性要求高必须使用中断。我们将两个红外接收模块的输出端分别连接到Arduino Uno的中断引脚2和3对应INT0和INT1。const int interrupt_pin1 2; const int interrupt_pin2 3; volatile byte STATE1 LOW; // 必须在全局声明为 volatile volatile byte STATE2 LOW; void setup() { pinMode(interrupt_pin1, INPUT); pinMode(interrupt_pin2, INPUT); // 配置中断当引脚从LOW变为HIGHRISING时触发中断函数 attachInterrupt(digitalPinToInterrupt(interrupt_pin1), interrupt_routine1, RISING); attachInterrupt(digitalPinToInterrupt(interrupt_pin2), interrupt_routine2, RISING); } // 中断服务程序尽可能短快 void interrupt_routine1() { STATE1 HIGH; // 仅仅设置一个标志位 } void interrupt_routine2() { STATE2 HIGH; }在主循环中我们检查这些volatile标志位并将其累加到计数器中。这种“中断标记-主循环处理”的模式避免了在中断服务程序中进行耗时操作如delay()或串口打印是嵌入式编程的经典实践。5.4 步进电机驱动函数驱动步进电机旋转一圈200步的函数很简单但需要注意时序。delayMicroseconds()的延迟时间决定了电机转速。void run_motor1() { digitalWrite(dirPin1, LOW); // 设置方向假设LOW为正向 for (int x 0; x 200; x) { // 200步/圈 digitalWrite(stepPin1, HIGH); delayMicroseconds(5000); // 5ms脉冲转速较慢扭矩更稳 digitalWrite(stepPin1, LOW); delayMicroseconds(5000); } delay(1000); // 转动完成后等待1秒让药丸有足够时间掉落并通过传感器 }注意delay(1000)会阻塞整个程序1秒钟。在更复杂的系统中可以考虑使用非阻塞的定时器如millis()来管理时间让系统在等待期间还能处理其他任务如响应用户触摸。但对于我们这个相对简单的任务序列阻塞延迟使逻辑更直观。6. 系统集成、测试与问题排查当所有机械部件加工完毕电路也测试通过后最激动人心也最具挑战性的阶段来了——总装与联调。6.1 分步集成指南机械总装首先将两个分配机构组装好。把静止盘用螺丝固定在倾斜底板上然后将步进电机从下方装上。接着将联轴器插入电机轴并拧紧顶丝最后把旋转盘用螺丝固定到联轴器上。确保旋转盘能自由、平滑地转动没有刮擦。然后将药瓶和分隔板装好。结构组装将倾斜底板和漏斗的侧板用螺丝安装到箱体的侧板上。接着安装前后面板和底板形成一个稳固的框架。此时整个机械结构和外壳已经成型。电子设备安装将触摸屏从内部装入前面板的开孔并固定。把Arduino、面包板、电机驱动模块等布置在箱体底部的空间内可以用尼龙扎带或双面胶固定。布线这是最需要耐心的一步。按照电路图将所有元件连接起来。建议先连接电源和地线再连接信号线。步进电机的四根线要确保顺序正确接错了电机会抖动不转。红外对管的线要留出足够长度以便最后粘贴到掉落口下方。传感器最终定位在所有机械和电路就位后通电测试。用一根药丸模拟掉落在串口监视器中观察中断触发情况。精细调整红外发射管和接收管的位置和角度直到每次掉落都能稳定触发中断。然后用热熔胶将其彻底固定。最终封箱检查所有接线无误设备功能正常后装上背板完成总装。6.2 典型问题与排查实录在调试过程中我们遇到了几乎所有创客项目都会遇到的典型问题问题1电机不转或只振动现象程序运行但电机发出“嗡嗡”声并轻微振动不旋转。排查检查电源首先用万用表测量驱动模块的VMOT引脚电压确保达到12V。电机堵转时电流很大劣质或功率不足的电源会导致电压被拉低。检查电流设定A4988模块上有一个小的电位器用于设定输出电流。电流设得太低电机扭矩不足。参考电机手册用万用表测量模块上的“Vref”测试点与GND之间的电压通过公式I Vref / 0.8计算电流。对于NEMA 17通常设置在0.8A-1.2A左右。检查接线确保电机的4根线A, A-, B, B-与驱动模块输出正确连接。可以尝试交换同一相的两根线如A和A-。检查使能引脚A4988的ENABLE引脚低电平有效。如果该引脚悬空或为高电平电机处于禁用状态。我们将其直接接地以始终使能。问题2红外传感器误触发或不触发现象没有药丸掉落时计数器自己增加或者药丸掉落时不计数。排查环境光这是最常见原因。确保传感器位置避光或加上遮光罩。信号抖动药丸下落可能引起红外光线的多次反射导致接收端信号在短时间内多次跳变触发多次中断。这被称为“抖动”。可以在硬件上在接收模块的信号输出端与地之间加一个0.1uF的电容来滤波。也可以在软件上使用“消抖”逻辑即在中断触发后暂时禁用该中断几毫秒。void interrupt_routine1() { static unsigned long last_interrupt_time 0; unsigned long interrupt_time millis(); // 如果两次中断间隔小于200毫秒认为是抖动忽略 if (interrupt_time - last_interrupt_time 200) { STATE1 HIGH; } last_interrupt_time interrupt_time; }供电不足确保红外发射管有足够的电流驱动。测量其两端电压如果低于4V尝试减小串联的限流电阻。问题3药丸分配卡住或多粒同时掉落现象这是机械问题。有时旋转盘转过去了但没有药丸掉落有时一下掉出两三粒。排查与解决检查孔洞尺寸旋转盘和静止盘的孔洞是否比药丸略大我们设计的孔洞是11mm x 25mm而药丸是8mm x 24mm留有合理间隙。检查倾斜角度增大倾斜底板的倾斜角度我们最终用了约20度重力作用更明显药丸流动更顺畅。优化分隔板确保分隔板紧贴旋转盘表面将药瓶底部清晰地分为两个区域。如果缝隙太大小药丸可能钻过去。调整旋转速度电机转得太快药丸可能来不及落入孔中转得太慢又可能因为振动导致药丸在孔洞边缘卡住。我们通过调整delayMicroseconds()的值找到了一个适中的速度约每秒一转。表面处理PLA打印件表面有一定摩擦力。用细砂纸轻轻打磨旋转盘与药丸接触的表面或涂抹少量食品级润滑硅脂确保安全可以显著减少卡滞。问题4触摸屏与Arduino通信失败现象屏幕有显示但点击按钮Arduino无反应。排查接线确认屏幕的TX接Arduino的RXRX接TX。GND一定要共地。波特率确保Nextion Editor中项目设置的波特率与Arduino代码中Serial.begin()和myObject.begin()的波特率一致我们都是9600。串口冲突上传代码时务必断开屏幕的TX/RX线。上传完成后再接回去。指令格式检查Nextion按钮属性中的“Release Command”是否正确。最简单的测试方法是让屏幕发送一个简单的指令如printh 65 66 67发送“ABC”在Arduino端用Serial.read()读取并打印出来看是否匹配。7. 项目反思与可持续改进完成一个可以工作的原型只是第一步。从工程化和产品化的角度看这个“Supplement Bot”还有巨大的改进空间。7.1 设计局限性与优化方向药丸兼容性当前设计针对特定尺寸的胶囊优化。要适应药片、小颗粒等需要更换旋转盘。可以设计一套标准接口让用户能像换“刀头”一样快速更换不同孔径的旋转盘。扩展性目前是双仓设计。虽然概念上可以堆叠模块但电路和软件需要重构以支持更多电机和传感器。可以考虑使用多路复用的IO扩展芯片或者升级到像Arduino Mega这样具有更多IO口的控制器。可靠性强化缺药检测目前依赖用户肉眼观察。可以增加称重传感器置于药瓶底部或在下层盘安装光电传感器当旋转盘空转数圈仍未触发掉落中断时判断为缺药并报警。网络功能加入Wi-Fi模块如ESP8266可以实现手机APP远程设置、用药记录云端同步、缺药提醒推送至家人手机等功能实用性将大大提升。备用电源内置一块小容量锂电池和充电电路防止意外断电导致时钟重置和设置丢失。7.2 可持续性与生产考量作为一个原型我们优先考虑了快速成型和成本。材料MDF木板和PLA塑料都是可再生的生物基材料相对环保。但MDF中的粘合剂可能含有甲醛PLA在自然环境中降解速度也很慢。若考虑小批量生产可改用桦木胶合板强度更高、更美观和注塑成型的外壳耐用性更好。结构当前用螺丝组装的方式适合原型但不适合批量生产。可以设计卡扣式结构减少螺丝数量便于用户自行组装。电子部分面包板和杜邦线只是原型工具。下一步应该设计定制PCB印刷电路板将Arduino、驱动模块、接口等集成在一块板上能极大提高可靠性、减小体积并降低成本。7.3 软件开发建议项目后期的代码因时间紧迫存在一些重复。一个更优雅的软件架构应该是面向对象为每个“药丸分配仓”定义一个PillDispenser类包含电机控制、传感器计数、目标数量等属性和方法。主程序只需管理一个PillDispenser对象的数组代码将非常简洁。非阻塞式设计用millis()替换所有delay()实现一个基于时间片的状态机。这样系统可以同时处理用户输入、实时时钟、报警鸣叫和电机控制响应更迅速。设置存储使用Arduino的EEPROM或者外接的FRAM芯片保存用户的预设和时间设置即使断电也不会丢失。回顾整个项目最大的收获不是做出了一个能转的机器而是完整经历了一次产品开发的微型循环从模糊的需求到清晰的定义从纷繁的概念到具体的设计从独立的模块到整合的系统再到不断的测试和迭代。每一个跳过的步骤最终都会在调试阶段以成倍的时间代价偿还。而每一次耐心的测试和用心的改进都让最终的产品离“可靠”更近一步。对于想要复现或借鉴此项目的朋友我的建议是不要急于求成先把机械结构调试到100%可靠电路搭建得整洁明了最后再编写软件。当硬件基础牢固时软件才会真正发挥作用。