1. 项目概述与设计初衷这个LED牙刷计时器项目本质上是一个为儿童设计的、具有极强视觉引导功能的电子沙漏。它的核心目标非常明确用最直观、最有趣的方式帮助孩子建立并坚持每天刷牙两分钟的良好习惯。传统的沙漏计时器虽然直观但存在易碎、时间固定、缺乏互动反馈等缺点。而这个电子版本则巧妙地用一排LED灯模拟沙粒下落的动态过程并辅以声音提示将枯燥的计时任务变成了一场小小的视觉游戏。为什么选择“沙漏”这个形态因为它的操作逻辑是刻在人类基因里的——按下按钮沙子灯光开始从上往下“流动”时间开始流逝沙子流完灯光全部熄灭时间结束。这种零学习成本的设计正是其精髓所在。项目原文中提到如果你的孩子会开电视和Wi-Fi路由器那操作这个计时器绝对不在话下。这背后体现的是一种“普适性设计”理念好的工具应该主动适应用户而不是让用户去适应工具。这个项目诞生于2013年最初发布在Elektor杂志上。虽然核心的ATtiny13A单片机在今天看来资源非常有限但正是这种限制反而让设计显得格外精巧和高效。它不依赖复杂的显示屏或智能连接仅用最基础的LED、蜂鸣器和一颗按钮就完成了一个完整、可靠且富有情感的产品设计。对于电子爱好者、创客尤其是希望带孩子一起动手的家长来说这是一个绝佳的入门级综合项目。它涵盖了从电路设计、PCB制作、单片机编程到产品组装调试的全流程成品既实用又有纪念意义。2. 核心电路设计与元器件选型解析整个计时器的“大脑”是一颗ATtiny13A单片机。选择它原因很充分首先它拥有1KB的Flash和64B的SRAM对于这个只需要控制10个LED灯、一个蜂鸣器和一个按钮的逻辑来说完全够用甚至绰绰有余。其次它支持低功耗模式虽然本项目使用电池供电且工作时间短功耗不是首要问题但芯片本身的低功耗特性是加分项。最重要的是它价格低廉、封装小巧SO-8非常适合这种低成本、小体积的消费类电子小制作。2.1 LED驱动电路设计驱动10个LED是核心任务。ATtiny13A共有6个I/O口PB0-PB5我们需要驱动10个LED、1个蜂鸣器和1个按钮显然I/O口不够。因此必须采用扫描Multiplexing或移位寄存器Shift Register的方案。从项目描述“LEDs light in sequence”来看它很可能采用了查理复用Charlieplexing或简单的行列扫描。查理复用能在n个引脚上驱动n*(n-1)个LED对于6个引脚理论最多可驱动30个LED驱动10个LED绰绰有余且能最大化节省I/O口。但查理复用的软件控制逻辑稍复杂且对LED的压降一致性要求较高。另一种更稳妥、编程更简单的方案是使用一颗74HC595之类的8位移位寄存器。只需要占用单片机的3个引脚数据、时钟、锁存就可以级联扩展出几乎无限的输出口。这对于驱动一排10个LED来说非常合适程序上只需按顺序发送数据即可实现“沙粒下落”的动画效果。考虑到项目的简洁性和可靠性我倾向于使用74HC595方案。它不仅节省了单片机宝贵的I/O口可以将节省出来的口用于未来的功能扩展比如增加模式选择开关而且程序逻辑清晰LED亮度也更容易通过限流电阻来精确控制。注意限流电阻的计算。假设我们使用普通的5mm草帽LED正向压降约为2.0V-2.2V工作电流建议在10-20mA。如果系统采用3V电池供电如两节AAA电池那么限流电阻R (Vcc - Vf) / I。取Vcc3V Vf2.0V I15mA则R (3-2)/0.015 ≈ 67Ω。我们可以选用68Ω的标称电阻。如果采用扫描方式由于LED是分时点亮为了达到相同的视觉亮度瞬时电流可以适当加大但需确保平均电流不超过LED的额定值。2.2 电源与编程接口的坑项目更新日志里提到了一个非常关键的实际问题务必在焊接单片机前完成编程。原因在于当电池盒直接焊在PCB上时即使没有按下启动按钮整个电路板也可能存在微小的漏电流比如通过上拉/下拉电阻、LED的内部漏电等。当连接ISP编程器时编程器需要向目标板供电并进行高频通信这点漏电流会导致电池电压被拉低。原文提到电压可能跌至2.2V而大多数ISP编程器如USBasp的工作电压下限是2.7V或3V低于这个电压就会报错拒绝工作。这里有三个解决方案最佳实践永远在焊接芯片到PCB之前使用编程座或测试夹完成程序的烧录。这是最安全、最推荐的做法。应急方案如果芯片已经焊上可以尝试在编程时临时断开电池由编程器单独向目标板供电。但前提是你的编程器支持5V输出且你的电路能在5V下正常工作注意LED限流电阻需要重新计算。设计改进可以在PCB上增加一个供电选择跳线或零欧姆电阻。正常工作时由电池通过这个跳线供电需要编程时拔掉跳线切断电池与电路的连接此时插入编程器就由编程器纯净的电源为整个电路供电彻底避免冲突。电池盒的固定问题也值得注意。仅靠电池盒引脚焊接到PCB上的机械强度是不够的尤其是放入、取出电池时频繁的应力会导致焊盘脱落。所以必须使用热熔胶或AB胶将电池盒底部牢固地粘在PCB上让PCB承担主要支撑力焊点只负责电气连接。3. 软件逻辑与“沙漏”动画实现软件是赋予这个计时器灵魂的关键。我们需要实现以下功能上电初始化、等待按钮按下、启动2分钟120秒计时、控制LED以每10秒熄灭一个的速度模拟沙粒下落、每30秒及结束时触发蜂鸣器。3.1 时间基准与中断ATtiny13A内部有一个8位/16位的定时器/计数器。为了精确计时我们需要配置一个定时器中断作为整个系统的时间“心跳”。例如我们可以将定时器配置为每10毫秒产生一次中断。这样在中断服务程序ISR里我们可以维护几个软件计数器一个ms_counter每中断一次加1加到100就代表1秒过去了然后清零并触发“秒标志”。一个second_counter当“秒标志”置位时加1用于记录总流逝时间。为什么选择10ms这是一个平衡点。时间太短如1ms会频繁进入中断增加CPU开销时间太长如100ms则计时精度不够且LED动画的流畅度会受影响。10ms的中断周期既能保证计时精度在百分之一秒量级又能让CPU有足够空闲时间处理主循环中的按钮检测等任务。3.2 LED动画与状态机“沙粒下落”的动画本质上是一个状态机。我们可以定义10个LED初始状态全亮代表沙漏上方的沙子是满的。状态0初始/停止10个LED全亮。等待按钮按下。状态1运行按钮按下后计时开始。我们有一个led_index变量初始为9指向最后一个LED。每过10秒我们将led_index指向的LED熄灭然后将led_index减1。这样就从下往上依次熄灭LED视觉上就像是沙子从上方的“沙堆”亮着的LED通过“细颈”视觉上的中心点落到下方的“沙堆”已熄灭的LED区域。更高级的玩法可以模拟沙粒一颗颗掉落的效果比如让当前要熄灭的LED先闪烁几下再灭但这需要更精细的时间控制。状态2结束当120秒计时结束所有LED熄灭蜂鸣器长鸣提示。如果使用74HC595控制就非常简单。我们可以定义一个10位的变量实际上用16位变量更方便来存储LED状态比如1表示亮0表示灭。初始化时这个变量值是0x03FF低10位全1。每10秒将这个变量右移一位或左移取决于你的LED物理连接顺序。然后通过SPI或模拟时序将这个变量的值发送到74HC595即可。3.3 按钮防抖与蜂鸣器驱动按钮检测必须做软件防抖。简单的做法是在主循环中检测到按钮按下后延时10-20ms再次检测如果仍然为按下状态才确认为有效按键。更可靠的方法是使用定时器中断周期性地采样按钮状态用状态机实现防抖这样可以避免延时函数阻塞整个程序。蜂鸣器通常是无源蜂鸣器需要单片机输出一定频率的方波来驱动发声。我们可以在定时器中断里用一个引脚输出频率可变的PWM信号。例如需要“嘀”一声时让该引脚以2kHz的频率翻转几百毫秒即可。需要注意的是驱动蜂鸣器的I/O口电流可能不够通常需要加一个三极管如S8050或MOS管来放大电流。4. PCB设计要点与组装调试实录4.1 PCB布局考量PCB的形状设计成沙漏外形这不仅是美观更是功能与形式的统一。在布局时需要重点考虑以下几点电池盒位置应放在PCB的底部或背部重心位置确保产品放置稳定。电池盒的焊盘要足够大并且周围不要走敏感的信号线防止因插拔电池引入干扰。LED排列10个LED应严格按照一条直线或优雅的曲线排列模拟沙漏的玻璃腔体。LED的间距要均匀这是影响视觉效果的关键。可以考虑将LED放在PCB的正面而其他大部分元件单片机、电阻、电容、蜂鸣器放在背面这样正面看起来非常简洁只有一排“沙粒”。按钮位置放在侧面或底部方便单手按压。按钮周围要做好ESD保护可以预留一个贴片电容的位置如100pF并联在按钮两端到地以吸收静电脉冲。编程接口强烈建议预留一个6Pin的ISP编程接口哪怕是几个焊盘。这会给后续的调试、程序升级带来巨大便利。接口应靠近单片机走线尽量短。电源去耦在单片机的VCC和GND引脚附近一定要放置一个0.1uF的陶瓷电容并且这个电容要尽可能靠近引脚。这是保证单片机稳定运行、防止数字噪声影响电源的黄金法则。4.2 组装流程与技巧先贴片后直插如果PCB是SMD贴片和THT直插混合的优先焊接贴片元件电阻、电容、单片机、74HC595再焊接直插元件LED、按钮、蜂鸣器、电池盒。使用烙铁焊接贴片时可以多用一些焊锡利用表面张力将元件拉回正位“拖焊”技巧。单片机程序烧录这是第一步。使用编程器和测试夹确保ATtiny13A烧录了正确的固件并且熔丝位配置正确主要是时钟源选择如果使用内部RC振荡器记得配置正确的频率和启动延时。焊接与固定电池盒先焊接电池盒的两个引脚。然后用万用表二极管档或通断档测量电池盒焊盘与系统VCC网络是否连通与GND是否短路。确认无误后立即使用热熔胶枪将电池盒的底部和侧面牢固地粘贴在PCB上。等待胶水完全固化。功能测试装入电池。不按按钮时所有LED应常亮初始状态。按下按钮应听到一声短促的“嘀”确认音同时LED开始从上至下或从下至上根据你的程序逻辑依次熄灭。每熄灭一个LED时间应过去10秒。在第30秒、60秒、90秒和120秒时应能听到提示音。120秒结束时所有LED熄灭蜂鸣器长鸣。4.3 常见问题排查速查表现象可能原因排查步骤上电无任何反应LED不亮1. 电池没电或装反。2. 电源开关如有未打开。3. 电池盒焊点虚焊或脱落。4. 主电源线路有断路。1. 用万用表测电池电压应≥2.4V。2. 检查电池极性。3. 用万用表通断档从电池盒正极一路追踪到单片机的VCC引脚。4. 重点检查电池盒焊盘是否因受力而脱焊。LED全亮但按按钮无反应1. 按钮损坏或焊点不良。2. 连接按钮的I/O口配置错误应配置为输入带上拉。3. 程序未正确检测按钮或卡死。1. 用镊子短接按钮的两个焊盘模拟按下看是否有反应。2. 用万用表测按钮按下时对应单片机引脚是否被拉低到GND。3. 检查程序中的按钮防抖逻辑和主循环是否正常运行。LED动画混乱不按顺序亮灭1. LED或74HC595的引脚连接顺序与程序逻辑不匹配。2. 74HC595的数据、时钟、锁存线接错。3. 程序中的LED状态更新逻辑有bug。1. 对照原理图和PCB逐一检查每个LED连接到74HC595哪个输出口。2. 编写一个简单的测试程序让LED依次逐个点亮验证硬件连接。3. 用逻辑分析仪或示波器抓取74HC595的三根控制线时序看数据发送是否正确。计时不准时间过快或过慢1. 单片机时钟源配置错误熔丝位。2. 定时器中断的预分频器和重载值计算错误。3. 系统中断被意外关闭或高优先级中断阻塞了定时器中断。1. 确认熔丝位中是否选择了正确的时钟如内部9.6MHz RC振荡器。2. 重新计算定时器中断周期。公式中断时间 (预分频因子 * (重载值1)) / 时钟频率。3. 检查程序是否有长时间关闭全局中断的操作或者有无其他中断服务程序执行时间过长。蜂鸣器不响或声音小1. 蜂鸣器极性接反有源蜂鸣器。2. 驱动三极管/MOS管损坏或基极/栅极电阻值不对。3. 程序未正确输出PWM频率或驱动引脚配置错误应配置为输出。4. 蜂鸣器本身损坏。1. 确认使用的是无源还是有源蜂鸣器并正确连接。2. 用万用表测驱动三极管集电极或MOS管漏极电压在发声时应有明显变化。3. 用示波器或万用表频率档测量驱动引脚的波形看是否有频率输出。4. 直接将蜂鸣器两端接到3V电源上短暂接触听是否有声音。5. 功能扩展与个性化改造思路基础版本已经非常实用但我们可以在此基础上玩出更多花样让这个项目更具个性化和教育意义。5.1 硬件扩展增加模式选择增加一个拨动开关或按钮允许选择不同的计时模式。例如模式一标准2分钟刷牙计时。模式二1分钟漱口计时。模式三30秒牙线使用计时。通过不同的LED点亮模式或闪烁频率来区分当前模式。使用RGB LED将单色LED换成WS2812B之类的可寻址RGB LED。这样沙粒下落的动画可以做得更加绚丽多彩。例如时间充裕时显示绿色时间过半显示黄色最后30秒显示红色给予更直观的视觉压力。这需要升级单片机型号如ATtiny85或Arduino Nano因为需要更多的RAM和更复杂的程序来处理RGB数据流。增加光敏传感器在沙漏“下方”放置一个光敏电阻或环境光传感器。当计时结束所有LED熄灭后如果环境光很暗比如晚上则让LED以最低亮度微微亮起充当一个小夜灯。这需要单片机具备ADC功能来读取传感器值。5.2 软件优化更平滑的动画基础版本是每10秒跳变一次。我们可以让动画更连续比如让当前要熄灭的LED在10秒内逐渐变暗通过PWM调光或者让“下落”的沙粒一个光点在相邻的LED之间移动。可配置时间通过长按按钮进入“设置模式”然后用短按来增加/减少计时时间以10秒为单位并用LED的点亮数量来直观显示当前设置的时间长度。设置完成后自动保存到EEPROM中ATtiny13A有64字节EEPROM。统计功能利用EEPROM记录连续刷牙的天数。每天成功完成一次2分钟刷牙就在EEPROM中增加一个计数并用LED闪烁次数来显示连续天数以此激励孩子。5.3 结构设计与美化3D打印外壳设计一个真正的沙漏形状的两部分外壳将PCB和电池封装在里面。外壳顶部和底部留出透明窗口让LED光透出。侧面开孔用于按钮和蜂鸣器声音传出。这能极大提升产品的完成度和质感。导光设计如果觉得LED灯珠的“点”状光效不够像沙粒可以在每个LED上方覆盖一小段乳白色的导光柱或者在整个LED阵列上方覆盖一层磨砂亚克力板让光线均匀柔和地散开更像一片流动的沙幕。个性化图案用激光雕刻机在亚克力面板上雕刻出孩子喜欢的卡通图案将LED隐藏在图案后面让光从图案的缝隙中透出计时变成一场光影秀。这个LED牙刷计时器项目从技术上看是一个简单的单片机应用但从产品角度看它完美地诠释了“设计思维”深刻理解用户儿童的需求和认知水平用最恰当的技术实现最直观的解决方案。在制作过程中你会遇到电源管理、I/O扩展、定时精度、防抖处理、PCB布局、结构装配等一系列实际问题每一个问题的解决都是一次宝贵的学习。最终当你和孩子一起按下按钮看着灯光如沙般流淌两分钟后听到完成的提示音时所获得的成就感远不止于一个计时器本身。