欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > 基于STM32的自行车户外运动系统设计

基于STM32的自行车户外运动系统设计

2025/4/21 19:15:49 来源:https://blog.csdn.net/2401_84204806/article/details/143046088  浏览:    关键词:基于STM32的自行车户外运动系统设计

引言

本项目设计了一个基于STM32的自行车户外运动系统,集成了速度、距离、心率、GPS定位和卡路里计算等多种功能,帮助骑行者在户外运动时实时了解运动数据。系统能够通过传感器监测骑行速度、距离、心率等信息,并将数据实时显示在屏幕上,便于骑行者进行运动分析和调整。此外,系统还可以记录骑行轨迹,适用于户外运动、骑行训练和运动监控场景。

环境准备

1. 硬件设备
  • STM32F103C8T6 开发板(或其他 STM32 系列)
  • 霍尔效应传感器(用于车轮转速检测)
  • GPS 模块(如 Neo-6M,用于定位和轨迹记录)
  • 心率传感器(如 MAX30100,用于检测骑行者心率)
  • OLED 显示屏(用于显示速度、距离、心率等数据)
  • 蜂鸣器(用于提示)
  • USB-TTL 串口调试工具
  • 电阻、杜邦线、面包板等基础电子元件
2. 软件工具
  • STM32CubeMX:用于初始化 STM32 外设。
  • Keil uVision 或 STM32CubeIDE:用于编写和下载代码。
  • ST-Link 驱动程序:用于下载程序到 STM32。

项目实现

1. 硬件连接
  • 霍尔效应传感器连接:将霍尔效应传感器的输出引脚连接到 STM32 的 GPIO(如 PA0),用于检测车轮转速。
  • GPS 模块连接:将 GPS 模块的 TX 引脚连接到 STM32 的 USART RX 引脚(如 PA9),用于获取定位数据。
  • 心率传感器连接:将心率传感器的 SDA 和 SCL 引脚连接到 STM32 的 I2C 接口(如 PB6 和 PB7),用于检测心率。
  • OLED 显示屏连接:将 OLED 的 SDA 和 SCL 引脚连接到 STM32 的 I2C 接口(如 PB6 和 PB7),用于显示当前骑行信息。
  • 蜂鸣器连接:将蜂鸣器的控制引脚连接到 STM32 的 GPIO(如 PA1),用于提示骑行者。
  • 其他连接:为 STM32、传感器和显示屏提供稳定的电源。
2. STM32CubeMX 配置
  • 打开 STM32CubeMX,选择你的开发板型号。
  • 配置系统时钟为 HSI,确保系统稳定运行。
  • 配置 GPIO 用于检测霍尔效应传感器的脉冲信号。
  • 配置 USART,用于读取 GPS 模块的数据。
  • 配置 I2C,用于与心率传感器和 OLED 显示屏通信。
  • 生成代码,选择 Keil 或 STM32CubeIDE 作为工具链。
3. 编写主程序

在生成的项目基础上,编写速度和距离计算、心率检测、GPS定位、卡路里计算、提示和状态显示的代码。以下是自行车户外运动系统的基本代码示例:

#include "stm32f1xx_hal.h"
#include "gps.h"
#include "oled.h"
#include "heart_rate.h"
#include "gpio.h"// 定义运动参数
#define WHEEL_CIRCUMFERENCE 2.1  // 车轮周长(米)
#define PULSE_PER_ROTATION 1     // 每次转动产生一个脉冲
#define TIME_INTERVAL 1          // 采样间隔(秒)
#define WEIGHT 70                // 骑行者体重(公斤)// 函数声明
void System_Init(void);
void Calculate_Speed_Distance(void);
void Get_Heart_Rate(void);
void Get_GPS_Location(void);
void Calculate_Calories(void);
void Display_Status(void);// 全局变量
uint32_t pulse_count = 0;      // 车轮转动的脉冲计数
float speed = 0;               // 计算出的骑行速度(km/h)
float distance = 0;            // 计算出的总骑行距离(公里)
float heart_rate = 0;          // 骑行者心率(次/分钟)
float calories = 0;            // 骑行消耗的卡路里(千卡)void System_Init(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_I2C1_Init();MX_USART1_UART_Init();OLED_Init();GPS_Init();HeartRate_Init();OLED_ShowString(0, 0, "Cycling Tracker Ready");
}// 计算速度和距离
void Calculate_Speed_Distance(void)
{// 根据车轮脉冲计算速度和距离speed = (pulse_count / PULSE_PER_ROTATION) * (WHEEL_CIRCUMFERENCE / 1000) * (3600 / TIME_INTERVAL);distance += (pulse_count / PULSE_PER_ROTATION) * (WHEEL_CIRCUMFERENCE / 1000);  // 总距离,公里pulse_count = 0;  // 清除计数,等待下一次测量
}// 获取心率
void Get_Heart_Rate(void)
{heart_rate = HeartRate_GetData();  // 获取心率数据
}// 获取 GPS 位置
void Get_GPS_Location(void)
{GPS_Update();  // 更新 GPS 位置和轨迹信息
}// 计算卡路里消耗
void Calculate_Calories(void)
{calories = WEIGHT * distance * 0.63;  // 估算卡路里消耗,公式为:重量*距离*能量系数
}// 显示运动状态
void Display_Status(void)
{OLED_Clear();OLED_ShowString(0, 0, "Speed: ");OLED_ShowFloat(48, 0, speed, 2);OLED_ShowString(0, 1, "Dist: ");OLED_ShowFloat(48, 1, distance, 2);OLED_ShowString(0, 2, "HR: ");OLED_ShowFloat(48, 2, heart_rate, 0);OLED_ShowString(0, 3, "Cal: ");OLED_ShowFloat(48, 3, calories, 2);
}// 处理霍尔传感器脉冲中断
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if (GPIO_Pin == GPIO_PIN_0){pulse_count++;  // 每次脉冲表示车轮转动了一圈}
}int main(void)
{System_Init();while (1){Calculate_Speed_Distance();  // 计算速度和距离Get_Heart_Rate();            // 获取心率Get_GPS_Location();          // 获取 GPS 位置Calculate_Calories();        // 计算卡路里消耗Display_Status();            // 显示运动状态HAL_Delay(1000);             // 每秒更新一次}
}
4. 各模块代码
霍尔效应传感器检测

通过 GPIO 检测车轮转速,用于计算速度和距离:

#include "gpio.h"// 初始化霍尔传感器
void HallSensor_Init(void)
{// 配置 GPIO 为外部中断模式,用于检测霍尔效应传感器的脉冲信号
}// 检测脉冲,计算速度和距离
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if (GPIO_Pin == GPIO_PIN_0){pulse_count++;  // 记录脉冲计数}
}
GPS 模块定位

通过 GPS 模块获取当前位置,用于记录骑行轨迹:

#include "gps.h"// 初始化 GPS 模块
void GPS_Init(void)
{// 配置 USART,初始化 GPS 模块
}// 更新 GPS 位置和轨迹信息
void GPS_Update(void)
{// 从 GPS 模块读取位置数据
}
心率传感器读取

通过心率传感器获取骑行者的心率数据:

#include "heart_rate.h"// 初始化心率传感器
void HeartRate_Init(void)
{// 初始化心率传感器,配置 I2C
}// 获取心率数据
float HeartRate_GetData(void)
{// 从心率传感器获取当前心率值return 75.0;  // 假设返回心率为 75 bpm
}
OLED 显示

用于显示速度、距离、心率和卡路里消耗等运动数据:

#include "oled.h"// 初始化 OLED 显示屏
void OLED_Init(void)
{// OLED 初始化代码
}// 显示字符串
void OLED_ShowString(uint8_t x, uint8_t y, const char *str)
{// 在 OLED 显示屏上显示字符串
}// 显示浮点数
void OLED_ShowFloat(uint8_t x, uint8_t y, float num, uint8_t decimal_places)
{// 显示带小数的数值
}// 清屏
void OLED_Clear(void)
{// 清除 OLED 显示内容
}

⬇帮大家整理了单片机的资料

包括stm32的项目合集【源码+开发文档】

点击下方蓝字即可领取,感谢支持!⬇

点击领取更多嵌入式详细资料

问题讨论,stm32的资料领取可以私信!

 

系统工作原理

  • 速度和距离测量:通过霍尔效应传感器检测车轮的转速,并根据车轮的周长计算当前骑行速度和总骑行距离。每次车轮转动都会触发一个脉冲信号,STM32根据脉冲信号的频率和轮子周长计算出速度和行驶的距离。

  • GPS 定位:通过 GPS 模块实时获取骑行者的位置信息,用于记录骑行轨迹和里程。如果需要,可以将 GPS 数据保存并用于后续的路径分析。

  • 心率检测:通过心率传感器监测骑行者的心率,便于分析运动时的身体状态,心率数据可实时显示,提醒骑行者保持合适的心率。

  • 卡路里计算:根据骑行者的体重、距离和心率等参数,系统可以估算出运动消耗的卡路里,帮助用户分析运动效果。

  • 状态显示:OLED显示屏实时显示当前的速度、距离、心率和卡路里消耗,便于骑行者查看运动情况。

常见问题与解决方法

1. 速度和距离计算不准确
  • 问题原因:霍尔效应传感器灵敏度不足或轮径设定不准确。
  • 解决方法:检查霍尔传感器的安装,确保传感器和磁铁的距离合适,同时校准车轮的周长以确保计算准确。
2. GPS 定位不稳定
  • 问题原因:GPS 模块信号弱或受到干扰。
  • 解决方法:将 GPS 模块放置于开阔区域,远离建筑物和树木的遮挡,确保信号稳定。
3. 心率检测不准确
  • 问题原因:心率传感器未正确安装或信号不稳定。
  • 解决方法:确保心率传感器与皮肤接触良好,并避免运动过程中过大的干扰。

扩展功能

  • 数据存储与分析:可以通过 SD 卡模块记录骑行数据,后续导入计算机进行数据分析,提供运动建议和轨迹回放功能。

  • 蓝牙/Wi-Fi 数据同步:通过蓝牙或Wi-Fi模块,将实时骑行数据同步至手机或云端,实现远程监控和数据共享。

  • 语音提醒功能:可以增加语音模块,当检测到运动状态异常(如心率过高)时,语音提醒骑行者调整状态。

结论

通过本项目,我们设计了一个基于STM32的自行车户外运动系统,能够实时监测骑行者的速度、距离、心率和卡路里消耗,并通过GPS定位记录骑行轨迹。该系统集成了多种运动监测功能,适用于骑行爱好者的日常训练和数据分析。未来可以通过增加数据存储、无线传输等功能,进一步提升系统的智能化和实用性。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词