1. 项目概述
长跑计圈器是田径训练和日常跑步中非常实用的辅助工具。作为一名跑了十年马拉松的业余选手,我深知在跑道训练时手动计圈的痛苦——既要保持配速,又要分心记住圈数,稍不留神就会记错。这个DIY项目就是为了解决这个痛点而设计的。
这个计圈器不同于市面上常见的运动手环或跑步APP,它专为跑道训练场景优化,具备物理按键操作、即时显示、低功耗等特点。整套方案包含硬件电路设计、程序源码和3D打印外壳文件,所有资料都已开源。无论你是跑步爱好者、电子DIY玩家还是创客教育从业者,都能从中获得实用价值。
2. 核心功能解析
2.1 基础计圈功能
核心功能非常简单直接:每跑完一圈按下计数键,LCD屏幕实时显示当前圈数和用时。看似简单,但在实际使用中需要考虑很多细节:
- 防误触设计:按键需要约500g力度触发,避免跑步时意外触碰
- 震动反馈:每次按键会有马达震动提示,在户外嘈杂环境中特别实用
- 双键防错:独立设置"计圈+1"和"重置"两个物理按键,防止误操作清零数据
2.2 分段计时功能
进阶功能包括自动记录每圈用时,这是提升训练质量的关键:
- 按下开始键启动计时
- 每完成一圈按下计圈键,自动记录该圈用时
- 屏幕轮流显示:当前圈数/总用时/上一圈用时
- 长按重置键3秒清除所有数据
实际测试发现,在按键间隔小于1秒时会忽略第二次按键,这个防抖设计避免了跑步颠簸导致的重复计数。
2.3 数据存储与导出
设备内置EEPROM存储最近20次训练数据,通过Micro USB接口可以连接电脑导出CSV格式记录,包含:
code复制时间戳, 总圈数, 总用时(秒), 平均配速(秒/圈)
2023-08-15 18:30, 10, 1823, 182.3
3. 硬件设计方案
3.1 核心元件选型
经过多次迭代,最终确定的BOM清单如下:
| 元件 | 型号 | 备注 |
|---|---|---|
| 主控 | ATmega328P | 兼容Arduino生态,性价比高 |
| 显示屏 | 1602 LCD | 带背光,阳光下可视 |
| 电池 | 18650锂电 | 1200mAh容量,续航约30小时 |
| 震动马达 | 1020扁平马达 | 直径10mm,厚度2mm |
选择这些元件的考量:
- 主控需要足够GPIO驱动外设,同时保持低功耗
- LCD屏在强光下的可视性比OLED更好
- 标准18650电池方便更换,充电电路成熟稳定
3.2 电路设计要点
原理图有三个关键设计值得注意:
-
电源管理电路:
- TP4056充电芯片
- 带电压检测的升压模块(确保锂电池电压降至3.3V时仍能稳定工作)
- 硬件开关彻底断电
-
按键消抖电路:
- 硬件RC滤波(10kΩ电阻+0.1μF电容)
- 软件去抖(检测到下降沿后延时50ms再次检测)
-
低功耗设计:
- 主控在无操作5分钟后进入休眠模式(电流<1mA)
- 背光30秒自动关闭
- 仅保留RTC时钟运行
4. 软件实现细节
4.1 主程序逻辑
核心逻辑采用状态机设计,共5个状态:
cpp复制enum State {
IDLE, // 待机状态
RUNNING, // 计时中
LAP_RECORD, // 记录单圈
SAVE_DATA, // 存储数据
SHUTDOWN // 关机
};
状态转换触发条件:
- 短按开始键:IDLE → RUNNING
- 短计圈键:RUNNING → LAP_RECORD
- 长按重置键:任何状态 → IDLE
4.2 关键算法实现
配速计算算法:
cpp复制float calculatePace(int lapTime, int lapDistance) {
// 标准跑道每圈400米
const int METERS_PER_LAP = 400;
// 转换为秒/公里
return (lapTime * 1000.0) / (lapDistance * METERS_PER_LAP);
}
数据存储优化:
使用EEPROM的滑动窗口存储法,避免频繁擦写同一区域:
- 每次训练分配一个2KB的存储块
- 记录头尾指针位置
- 当存储满时自动覆盖最旧的数据
4.3 实用功能代码
背光控制:
cpp复制void handleBacklight() {
if(millis() - lastActiveTime > BACKLIGHT_TIMEOUT) {
digitalWrite(BACKLIGHT_PIN, LOW);
} else {
digitalWrite(BACKLIGHT_PIN, HIGH);
}
}
震动反馈:
cpp复制void vibrate(int duration) {
digitalWrite(MOTOR_PIN, HIGH);
delay(duration);
digitalWrite(MOTOR_PIN, LOW);
}
5. 外壳设计与制作
5.1 3D建模要点
使用Fusion 360设计的壳体具有以下特点:
- 符合人体工学的曲面握持部位
- 按键区域下凹设计,盲操作时容易定位
- 内部电池仓采用可拆卸结构
- 屏幕开孔带5°倾斜,方便查看
实际打印后发现初版外壳的按键孔位公差太小,导致按键卡顿。修改设计增加了0.3mm的间隙补偿后问题解决。
5.2 打印参数建议
经过多次测试,推荐以下3D打印配置:
- 材料:PETG(比PLA更耐高温和冲击)
- 层高:0.2mm
- 填充率:25%
- 壁厚:1.2mm
- 支撑:仅限悬垂部分
打印耗时约4小时,成品重量约65g(含电池)。
6. 组装与调试
6.1 分步组装指南
-
焊接核心部件:
- 先焊接电源模块
- 然后连接主控与显示屏的I2C接口
- 最后安装按键和马达
-
固件烧录:
bash复制
avrdude -c arduino -p m328p -P /dev/ttyUSB0 -b 115200 -U flash:w:firmware.hex -
功能测试顺序:
- 电源开关及充电测试
- 按键响应测试
- 显示内容校验
- 数据存储验证
6.2 常见问题排查
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 屏幕无显示 | 1. 电源反接 2. 对比度设置不当 |
1. 检查电源极性 2. 调整电位器 |
| 按键无响应 | 1. 消抖电容失效 2. GPIO配置错误 |
1. 更换电容 2. 检查引脚模式 |
| 数据丢失 | 1. EEPROM寿命耗尽 2. 电池瞬间断电 |
1. 更换芯片 2. 增加储能电容 |
7. 使用技巧与优化建议
7.1 训练场景应用
在实际跑步训练中,我发现这些使用技巧特别有用:
- 间歇训练模式:用计圈器配合秒表功能,实现400米快跑+200米慢走的交替训练
- 配速练习:设置目标配速,每圈结束后查看偏差值调整步频
- 团体训练:多个设备同时使用,比较团队成员的圈速数据
7.2 可能的改进方向
根据半年来的使用反馈,下一代版本考虑加入:
- 无线同步功能:通过蓝牙将数据实时传输到手机
- 语音提示:在达到目标圈数时语音播报
- 环境光传感器:自动调节屏幕亮度
- 太阳能辅助充电:延长户外使用时间
这个项目最让我满意的不是技术实现,而是它真的解决了实际问题。现在每周三次的跑道训练,再也不用担心记错圈数了。如果你也想DIY一个,建议先从基础功能做起,后续再逐步添加高级功能。