鞋载跑步距离追踪器


HIPEC王子🤴殿下🐲
转载
发布时间: 2025-11-01 18:35:20 | 阅读数 0收藏数 0评论数 0
封面
跑步者通常不仅需要追踪总跑步里程,还需要记录每双鞋的跑步距离(以便知晓何时更换鞋子),本项目旨在解决这一数据追踪问题。这是一款鞋载距离追踪器的基础原型 —— 受时间限制,它略显笨重,且距离需通过按钮手动输入。未来更具市场潜力的版本需做得更小巧、采用电池供电,或许还会通过蓝牙连接全球定位系统手表以自动获取距离数据。无论如何,这都是入门使用 Arduino 控制图形输出的绝佳方式。
1

所需材料

本项目使用以下组件:

  1. Arduino Nano 开发板
  2. 4 引脚 OLED 液晶显示屏(带背光)
  3. 10 千欧电阻
  4. 4 引脚按键开关
  5. 导线
  6. 3D 打印机


2

OLED 屏幕设置

我首先要确保屏幕能正常工作且可通过 Arduino 良好控制 —— 起初使用的是标准尺寸型号,最终换成了 Arduino Nano 开发板,以追求更紧凑的设计。

如图所示,屏幕的 4 个引脚应按以下方式连接至 Arduino:

  1. VCC(电源正极)→ 5V 电源
  2. GND(接地)→ 接地
  3. SCL(串行时钟线)→ A5 引脚
  4. SDA(串行数据线)→ A4 引脚

之后即可通过芯片控制屏幕。可在网址https://randomnerdtutorials.com/guide-for-oled-display-with-arduino/ 找到一些基础入门代码。该项目需要用到 Adafruit GFX 和 SSD1306 库,这两个库包含了使屏幕正常工作的大部分核心功能,因此在 Arduino 集成开发环境中,实现简单的内置图案或文本显示相对容易。


3

添加按钮

我希望这款设备具备交互功能,因此在设计中加入了一个按键开关。连接方式十分简单:将按键开关的一个引脚连接至 Arduino 的 3.3V 电源,另一侧连接至数字引脚 2。同时,按键开关还需串联一个 10 千欧电阻进行接地。

完成连接后,Arduino 即可接收按键输入并在屏幕上显示结果。


4

编程

以下是该设备的代码。代码包含几个 if 循环,并定义了一个里程变量,按下按钮时该变量会递增并显示在屏幕上。我还添加了延时功能,因此长按按钮时里程数会增长得更快。

#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>

// OLED显示屏I2C地址
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(-1);

#if (SSD1306_LCDHEIGHT != 64)
#error("高度不正确,请修改Adafruit_SSD1306.h文件!");
#endif

// 常量定义(不会改变),用于设置引脚编号
const int buttonPin = 2; // 按键开关引脚编号
const int ledPin = 13; // LED灯引脚编号

// 变量定义(会改变)
int buttonState = 0; // 用于读取按键状态的变量
int miles = 240; // 跑步里程计数

void setup() {
// 初始化LED灯引脚为输出模式
pinMode(ledPin, OUTPUT);
// 初始化按键开关引脚为输入模式
pinMode(buttonPin, INPUT);

// 初始化并清空显示屏
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.clearDisplay();
display.display();
// 启动串口通信,波特率9600
Serial.begin(9600);
// 刷新显示屏,显示所有上述图形
display.display();
}

void loop() {
// 读取按键状态
buttonState = digitalRead(buttonPin);

// 检查按键是否被按下,若按下则按键状态为高电平
if (buttonState == HIGH) {
// 点亮LED灯
digitalWrite(ledPin, HIGH);
// 清空显示屏
display.clearDisplay();
// 里程变量递增
miles += 1;
// 延时100毫秒
delay(100);
} else {
// 熄灭LED灯
digitalWrite(ledPin, LOW);
}

// 检查鞋子是否已过度使用(里程超过250英里)
if (miles > 250) {
display.setTextSize(1); // 设置文字大小
display.setTextColor(WHITE); // 设置文字颜色为白色
display.setCursor(0,55); // 设置光标位置(x=0,y=55)
display.print(" Time for a new pair!"); // 显示提示文字:是时候换一双新鞋啦!
} else {
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,55);
display.print(" You're good to go!"); // 显示提示文字:状态良好,继续使用!
}

// 显示字段标题
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(5,0); // 设置光标位置(x=5,y=0)
display.print("Miles Run:"); // 显示“跑步里程:”

// 显示里程数值
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(15,30); // 设置光标位置(x=15,y=30)
display.print(" ");
display.print(miles); // 显示里程数

// 刷新显示屏,显示所有内容
display.display();
// 串口输出里程数
Serial.print(miles);
}
5

设备封装

为了让设备更小巧,我换成了 Arduino Nano 开发板。这一步无需修改任何代码,但 Arduino 近期更新了引导程序,因此如果购买的是来自中国、搭载 CH34X 芯片的廉价 Nano 开发板,可能需要下载一些驱动程序并使用旧版引导程序(集成开发环境中提供该选项)。

我将所有组件直接焊接到芯片上,然后 3D 打印了一个小外壳(外壳文件可在此处获取)。我在外壳正面挖了一个孔用于露出屏幕,侧面挖了两个小孔,分别用于充电线和按键开关。

由于这只是一个侧重于电子功能的原型,我用绝缘胶带将所有部件固定在一起,并通过安全别针将设备附着在鞋子上。我曾尝试改用 9V 电池供电以提升设备便携性 —— 将电池正极连接至 Arduino 的 Vin 引脚,负极连接至接地端,并在正极线路中串联了一个拨动开关以控制电源。

起初这种方式是可行的,但不知为何,另一个开关会失效,且屏幕偶尔会出现故障。我认为可能是所使用的拨动开关存在质量问题,但考虑到时间因素,我决定暂时放弃电池供电的方案。


MOV
FBF9QKGJOWST8XQ.mov
3.75MB
MOV
F5FNQF6JOWST8XV.mov
13.05MB
阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载
pdf下载 举报