引言
本项目设计了一个基于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定位记录骑行轨迹。该系统集成了多种运动监测功能,适用于骑行爱好者的日常训练和数据分析。未来可以通过增加数据存储、无线传输等功能,进一步提升系统的智能化和实用性。