基于ATTiny85的番茄钟PCB手表:嵌入式低功耗设计与DIY实践
1. 项目概述与核心思路
如果你和我一样,是个总想提升效率,却又时不时被手机分心的创作者或开发者,那么这个项目可能会让你眼前一亮。我们这次要做的,不是一个简单的电子表,而是一个专为“番茄工作法”定制的物理计时器,并且把它做成了一块可以戴在手腕上的PCB手表。它的核心功能很简单:帮你专注工作25分钟,然后震动提醒你休息5分钟,如此循环。最关键的是,它完全独立于手机,让你彻底摆脱“拿起手机看时间,结果刷了半小时短视频”的尴尬。
这个项目的核心硬件是一颗ATTiny85微控制器。选择它,主要是看中了其极致的“小”与“省”。作为一款只有8个引脚的8位AVR芯片,它的体积足够小,能轻松塞进手表尺寸的PCB里;它的功耗也足够低,配合我们精心设计的睡眠模式和看门狗定时器,一颗普通的纽扣电池就能让它运行很久。整个项目的挑战在于,如何在一个极其有限的空间内(一块手表大小的PCB),集成计时、状态指示、用户交互和震动提醒功能,同时还要兼顾长时间续航和佩戴的舒适性。这不仅仅是一次简单的焊接练习,更是一次对嵌入式低功耗设计、PCB布局和产品思维的完整实践。
2. 硬件设计与核心元件选型
2.1 微控制器:为什么是ATTiny85?
在众多微控制器中选定ATTiny85,是经过一番权衡的。对于可穿戴设备,尤其是这种功能单一、需要长时间待机的设备,选型主要看三点:尺寸、功耗和性价比。
首先看尺寸。ATTiny85采用SOP-8或更小的封装,面积比一枚硬币还小,这对于手腕上的方寸之地至关重要。像Arduino Nano或ESP8266这类模块,功能虽强,但体积和功耗都超标了。
其次是功耗。ATTiny85在活跃模式下的电流消耗在1-5mA左右,这不算特别出色。但它真正的王牌在于其丰富的睡眠模式和可配置的时钟源。我们可以通过程序,让它在绝大部分时间里进入“掉电”模式,此时电流可以降至1微安以下。配合内置的看门狗定时器,我们可以设定一个周期性的唤醒,比如每4秒唤醒一次来更新计时,这样平均功耗就被拉到了极低的水平。实测中,使用一颗CR2032纽扣电池(容量约220mAh),让设备以25分钟工作、5分钟休息的周期运行,续航轻松超过一个月。
最后是性价比和易用性。ATTiny85价格低廉,通过Arduino IDE配合USBasp或另一块Arduino板就能轻松烧录,生态友好。虽然其内部RC振荡器精度一般(这也是我们后面要讨论的误差来源),但对于分钟级别的番茄钟提醒,完全在可接受范围内。
注意:ATTiny85有多个电压版本(如ATTiny85V)。为确保在电池电压下降时仍能稳定工作(纽扣电池从3V用到2.5V),建议选择宽电压版本(如2.7V-5.5V)。
2.2 外围电路设计要点
一个完整的系统离不开外围电路的支持。我们的PCB手表需要以下几部分:
-
电源管理:核心是一颗3V的纽扣电池座。为了彻底切断电源,延长存放时间,我增加了一个微型滑动开关。在PCB布局时,开关应放在边缘便于操作的位置。由于ATTiny85的工作电压范围是2.7V-5.5V,因此不需要额外的稳压电路,这进一步简化了设计并降低了功耗。
-
状态指示:最初我想用一颗共阴极RGB LED,通过红、绿、蓝的不同组合来显示时间剩余阶段。但手头零件不全,后来改用了一颗三色LED(内部实际是两颗独立芯片)。这里有一个关键点:RGB LED和三色LED的引脚定义可能不同。我的PCB封装是按某款RGB LED画的,结果焊上三色LED后,发现红色和绿色引脚反了。解决办法是在代码里调整引脚输出定义,而不是返工PCB。这也提醒我们,在PCB投板前,务必用万用表实测一下手头元件的引脚排布。
-
用户交互:只有一个轻触按键。它的作用是让用户手动查询当前剩余时间所处的阶段(绿、橙、红)。按键电路需要上拉电阻,我直接使用了ATTiny85内部的上拉电阻,节省了一个外部元件。在软件上,按键检测需要在主循环或中断中实现,并做好防抖处理。
-
震动反馈:采用一个微型振动马达。ATTiny85的IO口驱动能力有限(约20mA),而马达启动瞬间电流可能更大。因此,必须使用一个NPN三极管(如S8050)或MOSFET来驱动。电路是经典的共发射极开关电路,基极通过一个限流电阻连接到MCU的IO口。当计时结束时,MCU输出一个高电平脉冲,驱动三极管导通,马达震动约1秒钟,提供清晰的触觉提醒。
-
二极管的方向:原理图中有一个用于电源反接保护的二极管。这里我踩了一个坑:画PCB封装时,二极管的阴极和阳极方向画反了。解决办法很简单,焊接时把二极管实物旋转180度再焊上去即可。虽然不影响功能,但影响了板面的美观。下次导出Gerber前,一定要把每个元件的封装和实物反复核对三遍。
3. 软件逻辑与低功耗实现
代码是这款手表的大脑,其核心目标有两个:准确计时和极致省电。由于ATTiny85资源有限,我们需要精打细算地使用每一字节内存和每一个时钟周期。
3.1 主程序流程与状态机
整个系统可以看作一个简单的状态机,包含以下几个状态:FOCUS_MODE(专注模式)、BREAK_MODE(休息模式)、SLEEPING(睡眠中)。上电后,系统进入FOCUS_MODE,开始25分钟倒计时。计时结束后,切换到BREAK_MODE,开始5分钟倒计时,并触发震动。如此循环。
主循环loop()函数非常精简,它只做三件事:
- 检查按键是否被按下,如果按下,则点亮相应颜色的LED指示时间阶段。
- 检查看门狗定时器唤醒标志。如果被唤醒,则更新计时器,并判断是否该切换模式或震动。
- 如果无事可做,立即进入睡眠模式。
这种“事件驱动+睡眠”的架构,确保了CPU在99%以上的时间处于休眠状态,这是实现长续航的关键。
3.2 看门狗定时器作系统时钟
ATTiny85没有专用的实时时钟,为了在深度睡眠时还能计时,我们“征用”了看门狗定时器。看门狗的本意是在程序跑飞时复位系统,但我们可以将其配置为产生周期性中断,而不复位芯片。
通过设置看门狗定时器预分频器,我们可以获得不同的唤醒间隔。我选择了WDTO_4S,即大约每4秒产生一次中断。在中断服务程序中,我们设置一个唤醒标志位。主循环检测到这个标志后,就知道又过去了4秒,然后在全局计时变量上累加。
这里就引出了精度问题。首先,看门狗定时器的时钟源是独立的128kHz内部RC振荡器,这个时钟本身就有±10%左右的误差。其次,“大约4秒”并不精确,实际可能是3.9秒或4.1秒。经过25分钟(1500秒)的累积,误差可能达到2-3分钟。对于严格的计时应用这是不可接受的,但对于番茄钟“提醒你该休息了”这个核心功能,2分钟的误差在实际使用中感知并不明显。如果你追求更高精度,可以换用外部32.768kHz晶振,并利用定时器1的异步模式,但这会增加成本和PCB面积。
3.3 深度睡眠与功耗优化技巧
让ATTiny85进入深度睡眠(Power-down)模式很简单,调用power_all_disable()关闭所有外设时钟,然后执行sleep_cpu()指令。此时,只有看门狗定时器和外部中断能唤醒它。
除了睡眠,还有几个关键的省电设置,我写在setup()函数里:
这些细节看似微小,但叠加起来,能将静态功耗从几十微安降低到几微安,对电池寿命的影响是决定性的。
3.4 时间阶段指示逻辑
如何用一颗LED显示25分钟里的不同阶段?我的逻辑是分段映射:
- 0 - 15分钟:绿色。表示时间充裕,安心工作。
- 16 - 20分钟:橙色。表示时间过半,需要保持节奏。
- 21 - 25分钟:红色。表示最后冲刺,避免开启新任务。
当用户按下查询按键时,系统根据当前累计的秒数,计算出处于哪个阶段,然后点亮对应颜色的LED。由于三色LED的红色和绿色引脚是独立的,混合光(红+绿)就能产生橙色效果。你需要根据手头LED的实际引脚,调整代码中的digitalWrite语句。
4. PCB设计与制造实战
将电路从面包板变为可佩戴的手表,PCB设计是最具挑战也最有成就感的一环。
4.1 从构思到轮廓:利用Inkscape进行造型设计
我不想做一块方方正正的板子,既然是“番茄钟”,外形最好能呼应一下。我的步骤是:
- 在网上找一张简洁的番茄剪影或图标,最好是黑白矢量图。
- 用开源软件Inkscape打开,使用“路径描摹”功能,将图像转换为清晰的轮廓路径。
- 将这个轮廓调整到符合你手腕尺寸的大小。我测量了自己的手腕周长,确定了PCB的大致长度和宽度,确保它不会过宽或过长。
- 在轮廓两端,用矩形工具画出两个表带穿孔。穿孔的宽度要略大于你准备使用的表带(如尼龙带)的厚度。
- 最后,将这个设计另存为
DXF格式文件。这个文件包含了PCB的机械外形和穿孔信息。
4.2 在EasyEDA中布局与布线
我使用EasyEDA进行电路设计,它在线、免费且对新手友好。
- 导入轮廓:新建PCB项目后,在“设计”->“板子形状”中,选择从DXF文件导入。这样,你的番茄形状就成为了PCB的边界。
- 放置核心元件:将ATTiny85放在中心或略偏的位置,因为所有线路都围绕它展开。电池座放在背面(Bottom Layer)的中心,以平衡重量。振动马达和LED放在板子正面(Top Layer)的醒目位置。
- 关键布局原则:
- 电源优先:先走通VCC和GND的线路。我采用了“铺铜”的方式,在顶层和底层都大面积填充地平面,这不仅降低了电源阻抗,也增强了抗干扰能力。
- 信号线短而直:驱动马达的电流较大,其走线应尽量短粗,减少压降和电磁干扰。按键和LED的走线可以细一些。
- 考虑焊接:元件间距不能太小,否则手工焊接困难。特别是那个微型滑动开关,引脚很密,需要留出足够的空间。
- 设计规则检查:布线完成后,一定要运行DRC,检查线宽、线距、孔径等是否符合PCB厂家的工艺要求(一般可设置为6mil线宽/线距)。
4.3 与PCB制造商协作:以PCBWay为例
生成Gerber文件后,就可以下单制作了。我这次选择了PCBWay。整个过程非常顺畅:
- 上传文件:在PCBWay官网,选择“在线下单”或“即时报价”,上传你的Gerber压缩包。
- 参数选择:我选择了最基础的参数:板子厚度1.6mm,FR-4材料,沉金工艺(有利于焊接和长期抗氧化),绿色阻焊油。数量上,打样5片价格非常划算。
- 确认生产稿:下单后约24小时,你会收到工程师审核后的生产稿(Gerber视图),务必仔细核对每一层,确保没有因设计失误导致的短路、断线或孔位错误。
- 等待收货:确认后进入生产,通常3-5天就能收到成品。我收到的PCB质量非常好,丝印清晰,焊盘光滑,孔位精准。
实操心得:第一次打样,不妨多做一些数量。5片和10片的价格相差不大,多出来的板子可以作为备份,或者送给朋友一起制作。焊接时万一损坏一块,也有替补。
5. 组装、调试与问题排查
收到PCB后,真正的乐趣——组装开始了。但这也是最容易出问题的阶段。
5.1 焊接顺序与技巧
遵循“先矮后高,先内后外”的原则:
- 焊接贴片元件:首先焊接最小的ATTiny85芯片。使用烙铁和尖头,配合焊锡丝和助焊剂,采用“拖焊”技巧。先在一个焊盘上固定芯片一角,对齐后焊接对角,再逐一拖焊其他引脚。完成后用放大镜检查有无桥连。
- 焊接其他无源器件:接着焊接电阻、二极管、三极管。注意二极管的方向,如果封装画反了,实物就反着焊。
- 焊接座子和接口:焊接电池座、按键。按键的引脚可能需要弯折一下才能对准焊盘,这就是我之前没测量好封装尺寸的教训。
- 焊接大型元件:最后焊接振动马达。马达的引线较粗,需要更高的温度和更多的焊锡来保证牢固。
- 背面处理:使用热熔胶枪,将锂电池牢固地粘贴在PCB背面没有元件的区域。注意不要让胶覆盖到任何测试点或焊盘。
5.2 我踩过的那些坑与解决方案
- 开关封装错误:我设计的滑动开关封装,与市面上能买到的通用型号对不上。临时解决方案是:在开关原本的焊盘位置,焊接两小段排针,然后用一个跳线帽来连接或断开,模拟开关功能。虽然不美观,但功能完全一样。
- 按键尺寸不符:轻触按键的脚距比PCB焊盘大。我的解决办法是,将按键的四个引脚稍微向内弯折,再焊接上去。虽然焊接点不那么完美,但保证了电气连接。
- LED颜色不对:如之前所述,RGB LED换成了三色LED,引脚定义变化。解决方法不是修改硬件,而是修改软件。找到代码中控制LED颜色的
digitalWrite部分,交换控制红色和绿色的引脚编号。 - 时间不准:这是由看门狗定时器的固有误差导致的。软件上的修正方法是“校准”。我写了一个简单的校准函数:让手表实际运行一个完整的25分钟,同时用手机秒表计时。结束后,计算误差秒数,然后将这个误差值作为一个“校准因子”写入代码。例如,如果手表慢了90秒,那么每次看门狗中断时,我不只加4秒,而是加
4 + (90 / (25*60/4))秒(一个经过计算的平均补偿值)。这能在一定程度上改善精度,但无法根除。
5.3 功能测试清单
组装完成后,不要急于佩戴,按以下步骤测试:
- 电源测试:装上电池,打开开关,用万用表测量ATTiny85的VCC和GND引脚之间是否有约3V电压。
- 程序功能测试:
- 上电后,观察LED是否快速闪烁一下(程序初始化指示)。
- 等待4秒,看马达是否短震一下(看门狗首次唤醒)。
- 长按按键,检查LED是否能按绿、橙、红的顺序正确显示。
- 完整周期测试:为了节省时间,可以修改代码,将专注和休息时间缩短(如改为1分钟和10秒),测试一个完整周期的计时、震动和状态切换是否正常。
- 功耗粗略测试:将万用表串联在电池和PCB之间,设置为微安档。当设备进入睡眠状态时,电流读数应在10微安以下。如果电流过大(如几百微安),检查是否有引脚未配置为上拉或输出,或者ADC等外设未关闭。
6. 使用体验与优化展望
实际佩戴使用几周后,我对这个DIY工具有了一些更深的体会。
最大的好处是物理隔离。当需要开始一个番茄钟时,按下手表侧面的开关,“滴”一声轻响,仪式感就来了。它就在手腕上安静地倒计时,你不会想去碰它,因为它除了显示红绿灯,没有其他任何干扰信息。这与手机上的番茄钟App有本质区别,App的通知随时可能被其他消息覆盖,或者让你忍不住点开别的应用。
其次,触觉提醒比声音更友好。在图书馆、办公室等安静环境,手腕上的一阵震动比铃声更私密、更不易打扰他人。震动反馈也更有“确定性”,你不会错过它。
当然,它也有明显的局限。最大的问题是时间精度。虽然2分钟的误差对工作节奏影响不大,但如果你用它来严格规划背靠背的会议,就会出问题。未来的硬件优化版本,可以考虑增加一颗DS3231这类高精度、低功耗的实时时钟芯片,由它来提供精准的秒脉冲唤醒ATTiny85,这样既能保证精度,又能让主MCU绝大部分时间深度睡眠。
另一个优化方向是交互。目前只能通过LED颜色粗略判断阶段。可以设想增加一个微型OLED显示屏,在按键时显示剩余分钟数。但这会显著增加功耗和成本,需要重新评估电池方案,或许要改用小型锂聚合物电池。
软件上也可以玩出花样。比如,通过长按、短按、双击按键,来切换不同的番茄钟模式(如25+5, 50+10),甚至进入一个简单的秒表模式。ATTiny85的Flash空间还有剩余,可以实现这些功能。
最后,关于佩戴,我直接用了背包上的可调节尼龙织带,用钉书钉固定了魔术贴,成本几乎为零,而且非常透气。你也可以购买现成的表带连接器,让成品看起来更专业。
这个项目带给我的,远不止一个工具。它是一次从想法、到电路设计、到软件编程、再到实体制造的全流程体验。当你把这样一块凝聚了自己心血的手表戴在手上,每次它震动提醒你休息时,那种督促你珍惜时间的动力,是任何商业产品都无法给予的。它不完美,但正因如此,它才完全属于你。