基于ATtiny85与ADXL345的微型可穿戴振动提醒设备DIY全解析 📅 2026/8/19 6:05:15 1. 项目概述当微型单片机遇上可穿戴设备几年前当我第一次把一块ATtiny85单片机焊接到一个比指甲盖还小的电路板上时我就在想这玩意儿除了做个闪灯玩具还能干点啥“正经事”直到有一次在健身房看到有人手腕上戴着各种复杂的智能手表监测心率但动作不规范时却没有任何即时反馈一个想法冒了出来能不能做一个极致简单、只专注于单一核心提醒功能的可穿戴设备比如一个只在你久坐时用振动提醒你活动或者在你进行特定重复动作如健身组数时给予触觉反馈的小装置。这就是“ATtiny85可穿戴振动活动追踪手表”项目的起点。这个项目的核心就是用一颗售价仅几块钱、只有8个引脚的微型单片机ATtiny85驱动一个微型振动电机再配合一个简单的运动传感器打造一个超低成本、超低功耗、功能专注的可穿戴活动追踪器。它不像商业智能手表那样有屏幕、能联网、功能繁杂它的使命非常单纯感知特定的身体活动状态并通过最直接的物理方式——振动来提醒你。这非常适合DIY爱好者、硬件创客或者那些希望为孩子或老人制作一个简易健康提醒设备的人。你不需要是电子工程专家只要会基础的焊接和Arduino编程就能亲手实现它。接下来我将从设计思路、硬件选型、软件实现到穿戴组装完整拆解这个有趣的小项目。2. 核心设计思路与硬件选型解析2.1 为什么是ATtiny85选择ATtiny85作为大脑是本项目所有设计决策的基石。这背后是一系列权衡极致的成本与体积控制ATtiny85的封装如SOP-8非常小巧整个核心控制电路可以做到硬币大小。对于可穿戴设备尤其是追求隐蔽性或舒适性的腕戴设备体积和重量是首要考虑因素。相比更常见的Arduino Nano或ESP8266ATtiny85在体积和功耗上具有压倒性优势。恰到好处的资源它拥有8KB的Flash存储程序、512B的SRAM运行内存和512B的EEPROM存储数据。对于实现“读取传感器数据 - 判断逻辑 - 控制振动电机”这个核心任务这些资源绰绰有余。我们可以用EEPROM来存储一些简单的用户设置比如久坐提醒的时间阈值。超低功耗的潜力ATtiny85支持多种休眠模式。在活动追踪的典型场景中设备大部分时间处于待机监听状态。通过编程让其大部分时间处于深度休眠Sleep Mode仅定时唤醒比如每秒一次读取一次传感器数据平均工作电流可以轻松控制在1mA以下。配合一颗小容量的纽扣电池如CR2032续航可以达到数周甚至数月这是功能复杂的智能手表无法比拟的。足够的外设接口虽然只有8个引脚但ATtiny85提供了足够的数字I/O口和模拟输入口ADC。我们需要连接一个振动电机1个数字I/O、一个运动传感器如1-2个数字I/O或模拟I/O、以及一个可能的编程/调试接口占用2个I/O。经过精心规划引脚资源刚好够用。注意ATtiny85的工作电压是1.8V - 5.5V这为我们提供了灵活的供电方案选择既可以用3V的纽扣电池也可以用3.7V的锂电池。2.2 传感器选型如何“感知”活动活动追踪的核心是传感器。我们需要一个能够检测身体移动或姿态的器件。这里有几个主流选择三轴加速度计如ADXL345、MPU-6050这是最强大也最通用的选择。它可以测量X、Y、Z三个方向的加速度从而计算出设备的姿态倾斜角度、运动幅度和频率。通过分析加速度数据我们可以识别出走路、跑步、坐下、站起等多种状态。ADXL345通过I2C通信非常省电MPU-6050还集成了陀螺仪数据更丰富但功耗稍高。振动开关滚珠开关这是一种纯机械开关内部有一个滚珠当设备倾斜或振动到一定角度时滚珠接通两个触点电路导通。它成本极低几分钱一个但只能提供“有运动”或“无运动”这种非常二值化的信息无法区分运动类型和强度。压电振动传感器这种传感器可以检测微小的振动但对身体大幅度的运动反而不敏感更适合工业设备监测。在本项目中我强烈推荐使用数字输出的三轴加速度计例如ADXL345。理由如下信息丰富我们可以编程实现更智能的判断。例如不是简单地检测“是否在动”而是计算一段时间内加速度矢量和的变化量活动强度或者通过Z轴数据判断手腕是平放可能坐着还是垂直可能站着。可配置灵敏度ADXL345的测量范围和输出数据速率都可以通过软件配置允许我们针对“手腕活动”这一场景进行优化过滤掉无意义的细微抖动。低功耗它本身具有极低的待机电流配合单片机的休眠模式可以组成一个极省电的系统。2.3 执行器与供电方案振动电机选择常见的3V或5V微型扁平振动马达Coin Vibration Motor。它的直径通常在10mm左右厚度3-4mm非常适合嵌入表带或小型外壳。驱动它需要一个简单的晶体管如MOSFET 2N7000或三极管如S8050开关电路因为ATtiny85的I/O口无法直接提供足够的电流通常需要20-100mA。供电方案方案A追求极致轻薄使用一颗CR2032纽扣电池3V约220mAh。通过一个低压差稳压器LDO如HT7333将电压稳定在3.3V为整个系统供电。ATtiny85和ADXL345在3.3V下工作良好。此方案续航取决于休眠策略理想情况下可达1个月以上。方案B追求续航与充电便利使用一块小型的3.7V锂电池如301230 30mm x 12mm x 3mm搭配一个微型充电管理模块如TP4056。这样可以通过Micro USB接口充电更加方便。但需要额外的充电电路空间。硬件清单汇总ATtiny85单片机SOP-8封装ADXL345三轴加速度计模块或芯片微型振动电机3V/5VMOSFET2N7000或NPN三极管S8050及一个基极限流电阻1kΩ供电CR2032电池座 或 锂电池TP4056充电模块LDO稳压芯片如HT7333如果用锂电池则可能需要10kΩ上拉电阻用于I2C总线0.1uF和10uF电容若干用于电源滤波轻触开关用于电源开关或模式切换表带、3D打印或手工制作的外壳3. 电路设计与PCB布局要点3.1 核心电路原理图解析整个系统的电路并不复杂但有几个关键点需要特别注意ATtiny85最小系统需要连接VCC和GND并在RESET引脚引脚1上拉一个10kΩ电阻到VCC防止误复位。如果使用内部时钟则无需外接晶振。I2C连接ATtiny85的PB2引脚7和PB0引脚5可以配置为I2C的SCL和SDA线分别连接ADXL345的对应引脚。必须在SDA和SCL线上各接一个4.7kΩ - 10kΩ的上拉电阻到VCC这是I2C总线正常工作的必要条件。振动电机驱动电路这是一个典型的低侧开关电路。ATtiny85的一个I/O口如PB1引脚6通过一个1kΩ电阻连接到MOSFET2N7000的栅极G。MOSFET的源极S接GND漏极D接振动电机的负极。振动电机的正极直接接VCC。当PB1输出高电平时MOSFET导通电机两端形成压差开始振动。二极管如1N4148反向并联在电机两端用于吸收电机停止时产生的反向电动势保护MOSFET。电源管理如果使用CR2032电池建议先经过一个开关再接入LDOHT7333的输入端LDO输出稳定的3.3V给MCU和传感器。在LDO的输入和输出端靠近引脚处分别放置一个10uF储能和一个0.1uF滤高频噪声的电容这是保证系统稳定、防止意外复位的关键。3.2 PCB布局与可穿戴化设计心得对于可穿戴设备PCB布局比原理图设计更需要花心思尺寸与形状使用EDA工具如立创EDA、KiCad进行设计时首先确定外壳的内部空间。PCB形状可以设计为圆角矩形甚至异形以最大化利用空间。将所有元件布置在PCB的同一面底层顶层尽量走线这样便于焊接和后期维修。元件选型与摆放全部使用贴片元件0603或0805封装的电阻电容SOT-23封装的MOSFET和LDO。ATtiny85和ADXL345也选择贴片封装。电池连接器如果使用可充电锂电池可以选择PH2.0mm间距的卧式插座将电池贴在PCB背面。如果用CR2032则使用贴片电池座并确保其位于PCB边缘方便更换。振动电机在PCB边缘预留两个大的焊盘或一个插座用于焊接电机的引线。考虑电机振动可能对焊点造成应力可以用热熔胶或硅胶进行加固。传感器朝向ADXL345的感应轴方向是固定的。在布局时必须明确它在手腕上的最终朝向例如芯片表面平行于手腕皮肤且一个边与手臂方向平行并在PCB上做出标记如丝印“TOP - WRIST”这样在编程时才能正确解读数据。穿戴舒适性圆滑无棱角PCB的四个角一定要做圆角处理防止刮伤皮肤或衣物。厚度控制尽量选择薄型元件。如果厚度仍然是个问题可以考虑将PCB做成两片中间用排针连接平行放置以降低整体厚度。固定方式在PCB两侧或四角预留小孔用于缝合或粘贴到表带上。实操心得第一次打样PCB时我忽略了振动电机本身的厚度导致外壳合不上。后来我将电机的位置设计在PCB的一个“凹陷”区域让电机部分嵌入PCB有效降低了整体厚度。另外为调试方便务必引出一个包含VCC、GND、SDA、SCL和RESET的编程接口例如用4-5个并排的焊盘这样可以用夹子或飞线连接USBASP等编程器无需每次焊接。4. 固件开发算法与低功耗实现4.1 开发环境搭建与程序烧录ATtiny85可以通过Arduino IDE进行开发这大大降低了门槛。安装ATtiny核心在Arduino IDE的“文件-首选项-附加开发板管理器网址”中添加网址https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json。然后在“工具-开发板-开发板管理器”中搜索“attiny”安装“attiny by David A. Mellis”。配置开发板选择“工具-开发板-ATtiny25/45/85”处理器选择“ATtiny85”时钟选择“内部8MHz”为了低功耗也可以选择1MHz。编程器选择“USBasp”或其他你使用的编程器如Arduino as ISP。连接与烧录按照前面提到的编程接口将USBasp编程器的VCC、GND、MOSI、MISO、SCK、RESET分别连接到ATtiny85的对应引脚。点击“工具-烧录引导程序”实际上就是设置熔丝位。之后就可以像普通Arduino一样使用“上传”按钮来烧录程序了。4.2 活动识别算法解析算法的目标是从ADXL345的原始数据中判断用户当前是“活跃”还是“静止”并在静止超时后触发振动。这里提供一个简单有效的方案数据读取与滤波以每秒2-5次的速率数据速率设为100Hz但程序每秒只读取几次读取ADXL345的X、Y、Z三轴数据12位精度-2g到2g范围。为了消除噪声可以对连续几次的读数进行滑动平均滤波。活动量计算计算本次读数与上一次读数之间三轴加速度变化量的绝对值之和。这被称为“活动量增量”。activity_delta abs(ax - ax_prev) abs(ay - ay_prev) abs(az - az_prev);这个值越大说明动作越剧烈。阈值判断设置一个经验阈值例如100 mg。如果activity_delta超过阈值则认为发生了一次“有效活动”并重置一个“静止计时器”。如果activity_delta低于阈值则“静止计时器”累加。触发振动当“静止计时器”超过预设的久坐时间例如30分钟 1800秒 * 2次/秒 3600个周期时控制振动电机工作2-3秒然后重置计时器并进入一个短暂的“免打扰期”比如5分钟防止连续提醒。// 代码片段示例 (核心逻辑) #include Wire.h // 用于I2C通信 #include avr/sleep.h // 用于休眠 #define ACCEL_ADDR 0x53 // ADXL345的I2C地址 #define MOTOR_PIN 1 // PB1 #define THRESHOLD 100 // 活动量阈值 #define IDLE_TIME_THRESHOLD 3600 // 静止周期阈值 (30分钟*2次/秒) #define DND_PERIOD 600 // 免打扰期 (5分钟*2次/秒) long lastActivityTime 0; long idleCounter 0; bool dndMode false; long dndCounter 0; void setup() { pinMode(MOTOR_PIN, OUTPUT); digitalWrite(MOTOR_PIN, LOW); Wire.begin(); setupADXL345(); // 初始化加速度计的函数 lastActivityTime millis(); } void loop() { // 1. 读取并计算活动量 int activity readActivityLevel(); // 2. 判断与计时 if (activity THRESHOLD) { // 检测到活动重置静止计数器 idleCounter 0; dndMode false; // 有活动则退出免打扰 dndCounter 0; lastActivityTime millis(); } else { idleCounter; } // 3. 检查是否触发提醒 if (!dndMode idleCounter IDLE_TIME_THRESHOLD) { triggerVibration(); idleCounter 0; dndMode true; // 进入免打扰期 } // 4. 处理免打扰期 if (dndMode) { dndCounter; if (dndCounter DND_PERIOD) { dndMode false; dndCounter 0; } } // 5. 进入休眠 (约500ms) delay(500); }4.3 低功耗优化实战未经优化的系统电流可能达到5mA以上。我们的目标是将平均电流降至50μA以下。关闭未用模块在setup()中关闭ADCADCSRA 0;、看门狗等不需要的模块。利用休眠模式使用avr/sleep.h库。将主循环中的delay(500)替换为深度休眠。#include avr/sleep.h void sleep500ms() { set_sleep_mode(SLEEP_MODE_PWR_DOWN); // 最省电的模式 sleep_enable(); // 配置一个定时器如看门狗定时器在500ms后唤醒 setup_watchdog(9); // WDT 512ms timeout (具体参数需查手册) sleep_mode(); // 进入休眠 sleep_disable(); // 被唤醒后继续执行 }这样在每次循环的间隙MCU几乎不耗电。外设电源管理振动电机不工作时完全断电。对于ADXL345它本身有低功耗模式。在每次读取数据后可以通过I2C命令将其设置为待机模式下次需要读数前再唤醒。这能节省约100μA的电流。降低系统时钟将ATtiny85的系统时钟从8MHz降至1MHz可以显著降低动态功耗。这需要在烧录程序前在“工具-处理器”中选择“ATtiny85 (Internal 1 MHz clock)”。经过这些优化系统的工作周期可能变为唤醒1ms 电流~3mA - 读取传感器并处理1ms - 休眠498ms 电流~5μA。平均电流 ≈ (3mA * 2ms 5μA * 498ms) / 500ms ≈ 17μA。一颗CR2032电池220mAh的理论续航将达到惊人的220mAh / 0.017mA ≈ 12941小时即超过500天当然实际中由于自放电、振动电机耗电等因素续航会缩短但达到数月是完全可行的。5. 外壳制作与穿戴体验优化5.1 从PCB到可佩戴设备电路板完成后需要一个舒适可靠的外壳来保护它并固定在手腕上。3D打印方案这是最灵活的方式。使用Fusion 360或SolidWorks等软件建模。设计时需注意精确的配合公差PCB和电池槽的尺寸要比实物大0.2-0.3mm方便放入。按钮开孔为电源开关或复位按钮预留孔位。传感器开窗在ADXL345芯片正上方外壳不能有遮挡但可以用一层很薄的塑料片保护。表带连接结构在壳体两侧设计“生耳杆”孔标准手表表带接口或者直接设计成卡扣式用于连接尼龙魔术贴表带后者更舒适且可调节范围大。分层设计可以设计为上下盖用少量螺丝或卡扣固定。上盖可以设计一些透气孔。手工制作方案如果没有3D打印机可以使用“软硅胶套”或“热缩管”的方法。硅胶套测量好PCB尺寸在网上定制一个柔软的硅胶保护套将PCB塞入硅胶套本身可以带有环扣用于穿表带。热缩管将PCB和电池用绝缘胶带包裹平整然后套入直径合适的热缩管用热风枪加热收缩形成一个紧密的包裹层。两端留出传感器和开关位置。最后在两侧缝上或粘上表带。5.2 穿戴舒适性与可靠性调校重心与平衡将电池最重的部分放置在靠近手腕内侧皮肤一侧的位置这样设备在手腕上更“贴服”不易晃动。振动电机也应尽量靠近内侧让振感更直接。表带选择推荐使用尼龙魔术贴表带。它透气、轻便、可无限调节非常适合这种轻量化设备。避免使用金属表带太重且可能影响传感器读数。防水防汗电子设备最怕汗液。可以在组装完成的PCB上喷涂一层三防漆这是电子行业常用的防水防潮涂层。对于外壳接缝可以涂抹少量硅橡胶密封胶。注意留出充电口如果有和开关。振动反馈体验振动电机的位置和固定方式直接影响体验。电机不能悬空必须紧密贴合外壳内壁最好用胶水固定这样振动才能有效传递到外壳上。可以通过调整PWM信号的占空比来改变振动强度找到既明显又不恼人的强度。6. 功能扩展与调试排错指南6.1 更多创意功能设想基础久坐提醒实现后这个平台还有很大的扩展空间计步器功能通过更复杂的算法如峰值检测分析加速度数据实现简单的步数统计并将数据存储在EEPROM中。健身动作计数器针对特定的健身动作如俯卧撑、深蹲通过识别特定的加速度模式来进行计数并在完成一组后振动提示休息。姿态提醒长时间低头看手机或电脑会导致颈椎前倾。通过分析ADXL345的Z轴数据当设备戴在手腕上特定朝向时可以判断手臂是否长期处于下垂前伸状态并提醒用户调整姿势。简易遥控器增加一个红外发射管可以编程让手表通过特定的手势比如快速转动手腕两次来发射红外信号控制电视、空调等家电。无线同步如果觉得ATtiny85资源有限可以升级到ATtiny84或更大的型号甚至使用带蓝牙低功耗BLE的芯片如nRF52832将活动数据同步到手机APP。但这会显著增加复杂度和功耗。6.2 常见问题与排查实录在制作过程中你几乎一定会遇到以下问题这里是我的排查经验问题现象可能原因排查步骤与解决方案系统完全不上电1. 电源开关未打开或损坏。2. 电池没电或装反。3. LDO稳压芯片损坏或焊接不良。4. PCB存在电源短路。1. 用万用表蜂鸣档检查开关通断。2. 测量电池电压应高于3V锂电或2.8V纽扣电池。3. 测量LDO输入输出电压。输入应有电池电压输出应为稳定的3.3V左右。4. 断开所有负载测量VCC与GND之间的电阻阻值过小如几欧姆说明有短路需检查焊接。单片机无法烧录程序1. 编程器连接错误或驱动问题。2. ATtiny85熔丝位配置错误如时钟源选错。3. RESET引脚未上拉或对地短路。1. 确认USBasp驱动已安装连线正确VCC, GND, MOSI, MISO, SCK, RESET。2. 尝试使用“烧录引导程序”重置熔丝位。3. 用万用表测量RESET引脚电压应为VCC约3.3V。振动电机不工作1. 电机本身损坏。2. 驱动MOSFET电路故障。3. 程序未正确控制I/O口。1. 直接将电机两端接3V电池看是否振动。2. 测量MOSFET栅极G电压当程序应输出高电平时此处应有接近VCC的电压。如果没有检查单片机I/O口及连接电阻。3. 检查程序中对电机控制引脚的pinMode和digitalWrite语句。加速度计读数全为0或不变1. I2C通信失败。2. ADXL345未正确初始化。3. 电源不稳定。1. 用I2C扫描程序检查是否能找到设备地址0x53。2. 检查初始化序列特别是“测量模式”的寄存器POWER_CTL是否已正确设置写入0x08。3. 在ADXL345的VCC引脚处测量电压并并联一个0.1uF的贴片电容紧靠其引脚。功耗过高电池耗电快1. 未启用休眠模式。2. 外设如加速度计未进入低功耗模式。3. PCB存在漏电如焊锡渣短路。1. 用万用表电流档串联在电池回路中分别测量MCU休眠时和工作时的电流。休眠电流应10μA。2. 在程序里确认已发送ADXL345的低功耗命令。3. 仔细检查PCB尤其是芯片引脚间是否有细微的短路。活动识别不准确1. 加速度计安装方向与程序假设不符。2. 活动量阈值THRESHOLD设置不合理。3. 数据噪声大未滤波。1. 编写一个测试程序连续输出三轴原始值观察设备在不同姿态下的数值变化据此调整程序中的坐标轴映射。2. 将计算出的activity_delta值通过串口软串口打印出来观察日常活动时的典型值据此调整阈值。3. 在程序中加入滑动平均滤波算法。这个项目最吸引人的地方在于用极简的硬件创造了一个有实用价值的交互设备。它剥离了智能手表的浮华回归到提醒功能的本质。整个制作过程从画原理图、设计PCB、焊接贴片元件到编写算法、优化功耗、设计外壳是一次完整的微型电子产品开发实践。当你最终将它戴在手上感受到它因你久坐而发出的轻微震动时那种亲手创造并解决实际问题的成就感是购买任何成品都无法替代的。如果你对其中某个细节有更多疑问或者有了新的改进想法欢迎随时交流。