基于ATTiny85的番茄钟PCB手表:嵌入式低功耗设计与DIY实践

ATTiny85低功耗设计PCB设计
于 2026-05-28 13:18:23 修改
·本内容遵循CC 4.0 BY-SA版权协议

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手表需要以下几部分:

  1. 电源管理:核心是一颗3V的纽扣电池座。为了彻底切断电源,延长存放时间,我增加了一个微型滑动开关。在PCB布局时,开关应放在边缘便于操作的位置。由于ATTiny85的工作电压范围是2.7V-5.5V,因此不需要额外的稳压电路,这进一步简化了设计并降低了功耗。

  2. 状态指示:最初我想用一颗共阴极RGB LED,通过红、绿、蓝的不同组合来显示时间剩余阶段。但手头零件不全,后来改用了一颗三色LED(内部实际是两颗独立芯片)。这里有一个关键点:RGB LED和三色LED的引脚定义可能不同。我的PCB封装是按某款RGB LED画的,结果焊上三色LED后,发现红色和绿色引脚反了。解决办法是在代码里调整引脚输出定义,而不是返工PCB。这也提醒我们,在PCB投板前,务必用万用表实测一下手头元件的引脚排布。

  3. 用户交互:只有一个轻触按键。它的作用是让用户手动查询当前剩余时间所处的阶段(绿、橙、红)。按键电路需要上拉电阻,我直接使用了ATTiny85内部的上拉电阻,节省了一个外部元件。在软件上,按键检测需要在主循环或中断中实现,并做好防抖处理。

  4. 震动反馈:采用一个微型振动马达。ATTiny85的IO口驱动能力有限(约20mA),而马达启动瞬间电流可能更大。因此,必须使用一个NPN三极管(如S8050)或MOSFET来驱动。电路是经典的共发射极开关电路,基极通过一个限流电阻连接到MCU的IO口。当计时结束时,MCU输出一个高电平脉冲,驱动三极管导通,马达震动约1秒钟,提供清晰的触觉提醒。

  5. 二极管的方向:原理图中有一个用于电源反接保护的二极管。这里我踩了一个坑:画PCB封装时,二极管的阴极和阳极方向画反了。解决办法很简单,焊接时把二极管实物旋转180度再焊上去即可。虽然不影响功能,但影响了板面的美观。下次导出Gerber前,一定要把每个元件的封装和实物反复核对三遍。

3. 软件逻辑与低功耗实现

代码是这款手表的大脑,其核心目标有两个:准确计时和极致省电。由于ATTiny85资源有限,我们需要精打细算地使用每一字节内存和每一个时钟周期。

3.1 主程序流程与状态机

整个系统可以看作一个简单的状态机,包含以下几个状态:FOCUS_MODE(专注模式)、BREAK_MODE(休息模式)、SLEEPING(睡眠中)。上电后,系统进入FOCUS_MODE,开始25分钟倒计时。计时结束后,切换到BREAK_MODE,开始5分钟倒计时,并触发震动。如此循环。

主循环loop()函数非常精简,它只做三件事:

  1. 检查按键是否被按下,如果按下,则点亮相应颜色的LED指示时间阶段。
  2. 检查看门狗定时器唤醒标志。如果被唤醒,则更新计时器,并判断是否该切换模式或震动。
  3. 如果无事可做,立即进入睡眠模式。

这种“事件驱动+睡眠”的架构,确保了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()函数里:

CPP
void setup() {
// 1. 关闭模拟数字转换器ADC,节省功耗
ADCSRA = 0;
// 2. 将所有未使用的引脚设置为输入,并启用内部上拉电阻
// 悬空的引脚如果处于浮空输入状态,会因感应电流而增加功耗
DDRB = 0; // 先全部设为输入
PORTB = 0xFF; // 所有引脚内部上拉使能
// 然后,在后续代码中,再将需要用作出输出的引脚(如LED、马达驱动)重新配置为输出
pinMode(LED_PIN, OUTPUT);
pinMode(MOTOR_PIN, OUTPUT);
// 3. 配置看门狗定时器为中断模式,并设置4秒超时
setup_watchdog(WDTO_4S);
}

这些细节看似微小,但叠加起来,能将静态功耗从几十微安降低到几微安,对电池寿命的影响是决定性的。

3.4 时间阶段指示逻辑

如何用一颗LED显示25分钟里的不同阶段?我的逻辑是分段映射:

  • 0 - 15分钟:绿色。表示时间充裕,安心工作。
  • 16 - 20分钟:橙色。表示时间过半,需要保持节奏。
  • 21 - 25分钟:红色。表示最后冲刺,避免开启新任务。

当用户按下查询按键时,系统根据当前累计的秒数,计算出处于哪个阶段,然后点亮对应颜色的LED。由于三色LED的红色和绿色引脚是独立的,混合光(红+绿)就能产生橙色效果。你需要根据手头LED的实际引脚,调整代码中的digitalWrite语句。

4. PCB设计与制造实战

将电路从面包板变为可佩戴的手表,PCB设计是最具挑战也最有成就感的一环。

4.1 从构思到轮廓:利用Inkscape进行造型设计

我不想做一块方方正正的板子,既然是“番茄钟”,外形最好能呼应一下。我的步骤是:

  1. 在网上找一张简洁的番茄剪影或图标,最好是黑白矢量图。
  2. 用开源软件Inkscape打开,使用“路径描摹”功能,将图像转换为清晰的轮廓路径。
  3. 将这个轮廓调整到符合你手腕尺寸的大小。我测量了自己的手腕周长,确定了PCB的大致长度和宽度,确保它不会过宽或过长。
  4. 在轮廓两端,用矩形工具画出两个表带穿孔。穿孔的宽度要略大于你准备使用的表带(如尼龙带)的厚度。
  5. 最后,将这个设计另存为DXF格式文件。这个文件包含了PCB的机械外形和穿孔信息。

4.2 在EasyEDA中布局与布线

我使用EasyEDA进行电路设计,它在线、免费且对新手友好。

  1. 导入轮廓:新建PCB项目后,在“设计”->“板子形状”中,选择从DXF文件导入。这样,你的番茄形状就成为了PCB的边界。
  2. 放置核心元件:将ATTiny85放在中心或略偏的位置,因为所有线路都围绕它展开。电池座放在背面(Bottom Layer)的中心,以平衡重量。振动马达和LED放在板子正面(Top Layer)的醒目位置。
  3. 关键布局原则
    • 电源优先:先走通VCC和GND的线路。我采用了“铺铜”的方式,在顶层和底层都大面积填充地平面,这不仅降低了电源阻抗,也增强了抗干扰能力。
    • 信号线短而直:驱动马达的电流较大,其走线应尽量短粗,减少压降和电磁干扰。按键和LED的走线可以细一些。
    • 考虑焊接:元件间距不能太小,否则手工焊接困难。特别是那个微型滑动开关,引脚很密,需要留出足够的空间。
  4. 设计规则检查:布线完成后,一定要运行DRC,检查线宽、线距、孔径等是否符合PCB厂家的工艺要求(一般可设置为6mil线宽/线距)。

4.3 与PCB制造商协作:以PCBWay为例

生成Gerber文件后,就可以下单制作了。我这次选择了PCBWay。整个过程非常顺畅:

  1. 上传文件:在PCBWay官网,选择“在线下单”或“即时报价”,上传你的Gerber压缩包。
  2. 参数选择:我选择了最基础的参数:板子厚度1.6mm,FR-4材料,沉金工艺(有利于焊接和长期抗氧化),绿色阻焊油。数量上,打样5片价格非常划算。
  3. 确认生产稿:下单后约24小时,你会收到工程师审核后的生产稿(Gerber视图),务必仔细核对每一层,确保没有因设计失误导致的短路、断线或孔位错误。
  4. 等待收货:确认后进入生产,通常3-5天就能收到成品。我收到的PCB质量非常好,丝印清晰,焊盘光滑,孔位精准。

实操心得:第一次打样,不妨多做一些数量。5片和10片的价格相差不大,多出来的板子可以作为备份,或者送给朋友一起制作。焊接时万一损坏一块,也有替补。

5. 组装、调试与问题排查

收到PCB后,真正的乐趣——组装开始了。但这也是最容易出问题的阶段。

5.1 焊接顺序与技巧

遵循“先矮后高,先内后外”的原则:

  1. 焊接贴片元件:首先焊接最小的ATTiny85芯片。使用烙铁和尖头,配合焊锡丝和助焊剂,采用“拖焊”技巧。先在一个焊盘上固定芯片一角,对齐后焊接对角,再逐一拖焊其他引脚。完成后用放大镜检查有无桥连。
  2. 焊接其他无源器件:接着焊接电阻、二极管、三极管。注意二极管的方向,如果封装画反了,实物就反着焊。
  3. 焊接座子和接口:焊接电池座、按键。按键的引脚可能需要弯折一下才能对准焊盘,这就是我之前没测量好封装尺寸的教训。
  4. 焊接大型元件:最后焊接振动马达。马达的引线较粗,需要更高的温度和更多的焊锡来保证牢固。
  5. 背面处理:使用热熔胶枪,将锂电池牢固地粘贴在PCB背面没有元件的区域。注意不要让胶覆盖到任何测试点或焊盘。

5.2 我踩过的那些坑与解决方案

  1. 开关封装错误:我设计的滑动开关封装,与市面上能买到的通用型号对不上。临时解决方案是:在开关原本的焊盘位置,焊接两小段排针,然后用一个跳线帽来连接或断开,模拟开关功能。虽然不美观,但功能完全一样。
  2. 按键尺寸不符:轻触按键的脚距比PCB焊盘大。我的解决办法是,将按键的四个引脚稍微向内弯折,再焊接上去。虽然焊接点不那么完美,但保证了电气连接。
  3. LED颜色不对:如之前所述,RGB LED换成了三色LED,引脚定义变化。解决方法不是修改硬件,而是修改软件。找到代码中控制LED颜色的digitalWrite部分,交换控制红色和绿色的引脚编号。
  4. 时间不准:这是由看门狗定时器的固有误差导致的。软件上的修正方法是“校准”。我写了一个简单的校准函数:让手表实际运行一个完整的25分钟,同时用手机秒表计时。结束后,计算误差秒数,然后将这个误差值作为一个“校准因子”写入代码。例如,如果手表慢了90秒,那么每次看门狗中断时,我不只加4秒,而是加4 + (90 / (25*60/4))秒(一个经过计算的平均补偿值)。这能在一定程度上改善精度,但无法根除。

5.3 功能测试清单

组装完成后,不要急于佩戴,按以下步骤测试:

  1. 电源测试:装上电池,打开开关,用万用表测量ATTiny85的VCC和GND引脚之间是否有约3V电压。
  2. 程序功能测试
    • 上电后,观察LED是否快速闪烁一下(程序初始化指示)。
    • 等待4秒,看马达是否短震一下(看门狗首次唤醒)。
    • 长按按键,检查LED是否能按绿、橙、红的顺序正确显示。
  3. 完整周期测试:为了节省时间,可以修改代码,将专注和休息时间缩短(如改为1分钟和10秒),测试一个完整周期的计时、震动和状态切换是否正常。
  4. 功耗粗略测试:将万用表串联在电池和PCB之间,设置为微安档。当设备进入睡眠状态时,电流读数应在10微安以下。如果电流过大(如几百微安),检查是否有引脚未配置为上拉或输出,或者ADC等外设未关闭。

6. 使用体验与优化展望

实际佩戴使用几周后,我对这个DIY工具有了一些更深的体会。

最大的好处是物理隔离。当需要开始一个番茄钟时,按下手表侧面的开关,“滴”一声轻响,仪式感就来了。它就在手腕上安静地倒计时,你不会想去碰它,因为它除了显示红绿灯,没有其他任何干扰信息。这与手机上的番茄钟App有本质区别,App的通知随时可能被其他消息覆盖,或者让你忍不住点开别的应用。

其次,触觉提醒比声音更友好。在图书馆、办公室等安静环境,手腕上的一阵震动比铃声更私密、更不易打扰他人。震动反馈也更有“确定性”,你不会错过它。

当然,它也有明显的局限。最大的问题是时间精度。虽然2分钟的误差对工作节奏影响不大,但如果你用它来严格规划背靠背的会议,就会出问题。未来的硬件优化版本,可以考虑增加一颗DS3231这类高精度、低功耗的实时时钟芯片,由它来提供精准的秒脉冲唤醒ATTiny85,这样既能保证精度,又能让主MCU绝大部分时间深度睡眠。

另一个优化方向是交互。目前只能通过LED颜色粗略判断阶段。可以设想增加一个微型OLED显示屏,在按键时显示剩余分钟数。但这会显著增加功耗和成本,需要重新评估电池方案,或许要改用小型锂聚合物电池。

软件上也可以玩出花样。比如,通过长按、短按、双击按键,来切换不同的番茄钟模式(如25+5, 50+10),甚至进入一个简单的秒表模式。ATTiny85的Flash空间还有剩余,可以实现这些功能。

最后,关于佩戴,我直接用了背包上的可调节尼龙织带,用钉书钉固定了魔术贴,成本几乎为零,而且非常透气。你也可以购买现成的表带连接器,让成品看起来更专业。

这个项目带给我的,远不止一个工具。它是一次从想法、到电路设计、到软件编程、再到实体制造的全流程体验。当你把这样一块凝聚了自己心血的手表戴在手上,每次它震动提醒你休息时,那种督促你珍惜时间的动力,是任何商业产品都无法给予的。它不完美,但正因如此,它才完全属于你。

基于ATtiny的物理番茄钟DIY:从电路设计嵌入式开发的完整实践
霜之暗伤
318
基于ATtiny的深盆土壤湿度传感器DIY:低成本、低功耗与精准灌溉方案
许风倾秋
209
Pomodoro:用于番茄工作法的定制计时器,以提高工作效率
番茄工作法(Pomodoro Technique)是一种广受欢迎的时间管理方法,由弗朗西斯科·西里洛在20世纪80年代末提出。其核心理念是将工作时间划分为25分钟的专注工作时段(称为一个“番茄钟”),随后进行5分钟的短暂休息。每完成四个连续的番茄钟后,进行一次较长的休息(通常为15至30分钟)。这种方法通过周期性地切换工作休息状态,有效提升注意力集中度、减少疲劳感,并增强任务完成的成就感。本文所介绍的“Pomodoro: 用于番茄工作法的定制计时器”正是基于这一理论设计的一款嵌入式电子设备,旨在以硬件形式实现番茄工作法的自动化控制和可视化提示。该计时器的核心控制器采用的是ATtiny85微控制器,这是一款由Microchip公司生产的8位AVR架构单片机,具有8KB闪存、512字节SRAM和512字节EEPROM,支持多种低功耗模式,非常适合用于小型便携式电子产品。ATtiny85仅有8个引脚,但具备I/O端口、ADC、PWM输出、定时器/计数器等丰富功能,足以驱动LED指示灯、蜂鸣器以及响应按钮输入,完全满足本项目对资源的需求。由于其体积小、功耗低、成本低廉,成为DIY计时器类项目的理想选择。整个系统采用SMD(表面贴装器件)元件构建,包括0805封装的黄色和红色LED、SOT-23封装的NPN晶体管(BC846CMTF)、SMD电阻、电感、蜂鸣器及触觉开关。使用SMD元件的好处在于可以显著缩小电路板尺寸,提高集成度,使最终产品更加紧凑美观,适合手持或桌面摆放。其中,五个黄色LED代表25分钟工作时间中每5分钟的一个阶段,随着计时推进逐个熄灭,提供直观的视觉反馈;当计时结束时,所有黄灯熄灭,红色LED点亮,表示进入5分钟休息模式。这种分级显示方式让用户无需查看具体时间即可了解当前进度,增强了用户体验。触觉开关作为唯一的用户交互接口,承担了启动工作计时、启动休息计时以及强制关机三项功能。通过软件编程实现多级点击识别逻辑第一次按下启动25分钟工作倒计时,第二次按下转入5分钟休息倒计时,第三次按下则立即关闭设备。这种简洁的操作方式符合极简主义设计理念,避免复杂菜单或多个按键带来的操作负担。为了驱动蜂鸣器发出提示音,电路中采用了NPN晶体管作为开关元件,由ATtiny85的GPIO引脚控制基极,从而导通或切断蜂鸣器的电源通路。蜂鸣器本身为SMD封装,节省空间且易于焊接,能够在计时结束时发出清晰但不刺耳的声音提醒用户切换状态。电源方面,设备采用CR2032纽扣电池供电,这是一种常见的3V锂电池,广泛应用于小型电子设备如计算器、遥控器、智能钥匙等。CR2032具有较高的能量密度和较长的保质期,配合ATtiny85低功耗特性,可确保设备在长时间待机状态下仍能维持数月甚至更久的使用寿命。此外,设计中包含一个SMD电池座,便于更换电池,提升了产品的实用性可持续性。印刷电路板(PCB)采用蚀刻工艺制作,意味着开发者可能使用光刻或手工绘制的方式在覆铜板上形成所需线路图案,然后通过化学腐蚀去除多余铜层,留下导电路径。这种自制PCB的方法常见于原型开发阶段,允许快速迭代设计并验证电路功能。从物料清单可以看出,整体布局高度优化,元件排列紧凑,走线合理,充分体现了硬件设计中的工程美学功能性平衡。嵌入式定时功能由ATtiny85内部的定时器模块实现。通过配置Timer/Counter,系统能够精确地执行毫秒级延时,结合主循环中的状态机逻辑,分别管理“工作”、“休息”和“关闭”三种运行模式。程序还实现了非阻塞式延时机制,即不依赖于死循环等待,而是利用中断或轮询定时标志位来判断时间是否到达,从而保证系统响应灵敏、资源利用率高。蜂鸣器提示音被设置为“不连续”的短促鸣叫,避免长时间噪音干扰,体现人性化设计思想。综上所述,这款基于ATtiny85番茄工作法定制计时器不仅是一个实用的生产力工具,更是嵌入式系统设计的优秀范例。它融合了微控制器编程、模拟电路设计PCB布局、低功耗优化和人机交互等多个关键技术领域,展示了如何将抽象的工作方法论转化为具体可操作的物理装置。对于电子爱好者、程序员、学生及需要高效时间管理的专业人士而言,此类设备兼具教育意义实际价值,有助于培养良好的专注习惯,提升日常工作效率。同时,开源的设计理念(体现在“Pomodoro-master”文件名中暗示的GitHub仓库结构)鼓励社区共享持续改进,推动个人项目向协作创新演进。
纯文本文档