# speed_meter **Repository Path**: alen2019/speed_meter ## Basic Information - **Project Name**: speed_meter - **Description**: 一个基于stm32f405的码表,前端由LVGL实现 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-11 - **Last Updated**: 2026-01-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # STM32 LVGL 自行车码表项目 ## 项目简介 基于 **STM32F405RGT6** 微控制器和 **LVGL图形库** 开发的智能自行车码表系统。本项目集成了 GPS 定位、惯性测量、实时地图显示、电源管理等功能,提供了一个功能完整的嵌入式骑行助手解决方案。 ### 主要特点 - **高性能硬件**: STM32F405 (168MHz Cortex-M4, 1MB Flash, 192KB SRAM) - **现代化UI**: LVGL 9.4.0 图形库,支持多语言和主题切换 - **实时RTOS**: FreeRTOS 多任务并行处理 - **传感器融合**: GPS + 6轴IMU数据融合 - **在线地图**: 集成 Web Mercator 投影地图显示 - **低功耗设计**: 智能电源管理和休眠机制 --- ## 功能特性 ### 1. 实时骑行数据监测 - **速度显示**: GPS 实时速度计算 (km/h) - **距离统计**: 累计骑行距离跟踪 - **坡度计算**: 基于 LSM6DSM 陀螺仪/加速度计的坡度百分比 - **位置信息**: 实时经纬度坐标显示 - **时间显示**: 骑行时间统计 ### 2. 地图导航 (GPX Tab) - **在线瓦片地图**: OpenStreetMap 地图支持 - **多级缩放**: 3-14 级地图缩放 - **实时定位**: 当前位置标记和中心对齐 - **手势操作**: 支持触摸拖拽和缩放 ### 3. 电源管理 - **电池监测**: 实时电量显示 (5档电量 + 充电指示) - **电压采样**: ADC 精确电池电压测量 - **智能关机**: 长按电源键关机 ### 4. 人机交互 - **多语言支持**: 中文/English 双语切换 - **主题切换**: 浅色/深色模式 - **多输入方式**: 触摸屏 + 5个物理按键 - **状态栏**: GPS卫星数、运行状态、电量实时显示 --- ## 硬件配置 ### 核心硬件 | 组件 | 型号 | 接口 | 说明 | |-----|------|------|------| | **MCU** | STM32F405RGT6 | - | 168MHz Cortex-M4, FPU | | **显示屏** | ST7789 LCD | SPI1 | 240x320 RGB565 | | **触摸屏** | CST816 | I2C2 | 电容触摸控制器 | | **GPS模块** | - | USART2 | 9600bps NMEA协议 | | **陀螺仪** | LSM6DSM | I2C1 | 6轴惯性传感器 | | **存储卡** | SD Card | SDIO | FAT32文件系统 | ### GPIO引脚分配 ``` LCD控制: PA4 - DCX (数据/命令选择) PA6 - RST (复位) PB0 - CS (片选) PB1 - BL (背光) 触摸屏: PB2 - RST (复位) PD0 - INT (中断) 按键输入: PC0-3, PC5 - KEY0~3, KEY4 PA7 - KEY4 PB3 - KEY5 电源管理: PA0 - CHG (充电检测) PA1 - ADC (电池电压) PB6 - PWR (电源检测) PB8 - EN (电源使能) 传感器: PB5 - LSM6DSM_INT (陀螺仪中断) ``` --- ## 软件架构 ### 系统架构图 ``` ┌─────────────────────────────────────────────┐ │ Application Layer (用户界面) │ │ ┌────────────┬────────────┬────────────┐ │ │ │General Tab │ GPX Tab │Setting Tab │ │ │ │(速度/距离) │ (地图) │ (设置) │ │ │ └────────────┴────────────┴────────────┘ │ │ Status Bar (状态栏) │ └─────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────┐ │ LVGL Graphics Library 9.4.0 │ │ (GUI框架, Subject数据绑定, 主题系统) │ └─────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────┐ │ FreeRTOS Tasks (多任务调度) │ │ main_task │ key_task │ power_task │ │ │ gyro_task │ gps_task │ │ └─────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────┐ │ Hardware Abstraction Layer (HAL) │ │ GPS │ Gyro │ Key │ Power │ CST816 │ │ └─────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────┐ │ STM32 HAL Drivers + Peripherals │ │ SPI │ I2C │ USART │ ADC │ SDIO │ TIM │ │ └─────────────────────────────────────────────┘ ``` ### FreeRTOS任务列表 | 任务名称 | 优先级 | 栈大小 | 功能描述 | |---------|-------|--------|---------| | **main_task** | Normal | 2048B | LVGL初始化和UI更新循环 (66ms) | | **gps_task** | AboveNormal | 256B | GPS数据解析和位置更新 | | **gyro_task** | AboveNormal | 256B | 陀螺仪数据采集和坡度计算 | | **key_task** | Normal | 256B | 按键扫描和防抖处理 | | **power_task** | Normal | 256B | 电池电量监测 | ### 关键算法 #### 1. 坡度计算算法 (interface/Gyro.c:164) ```c // 基于加速度计的俯仰角计算 float pitch = atan2(ay, sqrt(ax*ax + az*az)); float slope_percentage = tan(tilt_angle) * 100.0f; ``` #### 2. GPS距离累计 (interface/GPS.c:257) - Haversine 公式计算两点距离 - 实时累加总里程 #### 3. Web Mercator 投影 (application/ui/tile_tool.c) ```c // 经纬度 → 瓦片坐标 tile_x = floor((lon + 180.0) / 360.0 * (1 << zoom)); tile_y = floor((1.0 - log(tan(lat*π/180) + 1/cos(lat*π/180))/π) / 2.0 * (1 << zoom)); ``` --- ## 目录结构 ``` speed_meter/ ├── Core/ # STM32 HAL和系统核心 │ ├── Inc/ # 硬件配置头文件 │ │ ├── main.h │ │ ├── FreeRTOSConfig.h # RTOS配置 │ │ └── [外设头文件] │ └── Src/ # HAL和系统实现 │ ├── main.c # 主程序 (236行) │ ├── freertos.c # 任务管理 (208行) │ └── [外设驱动实现] │ ├── application/ui/ # LVGL用户界面模块 │ ├── ui.c/h # 主UI框架和状态栏 │ ├── ui_general_tab.c/h # 通用标签页 │ ├── ui_gpx_tab.c/h # 地图标签页 (480行) │ ├── ui_setting_tab.c/h # 设置标签页 │ ├── ui_translation.c/h # 国际化支持 │ ├── tile_tool.c/h # 地图瓦片工具 │ └── noto_sans_sc_16.c # 中文字体资源 │ ├── interface/ # 硬件驱动和传感器接口 │ ├── Key.c/h # 按键驱动 (86行) │ ├── GPS.c/h # GPS传感器 (257行) │ ├── GPS_Transform.c/h # 坐标变换 │ ├── Gyro.c/h # 陀螺仪驱动 (164行) │ ├── Power.c/h # 电源管理 (68行) │ ├── CST816.c/h # 触摸屏驱动 │ └── lsm6dsm_reg.c/h # LSM6DSM寄存器库 │ ├── FATFS/ # 文件系统驱动 │ ├── App/fatfs.c/h # FATFS应用层 │ └── Target/ # SD卡接口 │ ├── Middlewares/ │ ├── lvgl/ # LVGL GUI库 │ │ ├── lv_conf.h # LVGL配置 │ │ ├── lv_port_lcd_stm32.c/h # LCD驱动适配 │ │ ├── lv_port_indev.c/h # 输入设备适配 │ │ └── src/ # LVGL核心库 │ └── Third_Party/ │ ├── FreeRTOS/ # RTOS内核 │ └── FatFs/ # FAT文件系统 │ ├── USB_DEVICE/ # USB从设备 ├── Drivers/ # STM32 HAL驱动库 ├── MDK-ARM/ # Keil工程文件 │ └── speed_meter.uvprojx # Keil项目 ├── speed_meter.ioc # STM32CubeMX配置 └── README.md # 本文档 ``` **代码统计**: 约 **15,400** 行代码 (不含第三方库) --- ## 编译和使用 ### 开发环境要求 - **IDE**: Keil µVision 5.30 或更高版本 - **编译器**: ARM Compiler V6 (ARMCC) - **配置工具**: STM32CubeMX 6.x - **调试器**: ST-Link V2/V3 - **操作系统**: Windows 10/11 或 Linux (Wine) ### 编译步骤 1. **打开项目** ``` 双击打开: MDK-ARM/speed_meter.uvprojx ``` 2. **配置编译选项** - Target: STM32F405RGT6 - Optimization: O1 (推荐, 平衡速度和调试) - FPU: Use FPU (Hardware) 3. **编译** ``` 点击 Project → Build Target (F7) ``` 4. **下载到设备** ``` 点击 Flash → Download (F8) ``` ### 使用说明 #### 首次启动 1. 长按电源键开机 2. 等待 GPS 搜星 (状态栏显示卫星数) 3. 确保 SD 卡已插入 (地图瓦片缓存) #### 功能操作 - **切换标签页**: 底部标签栏点击或左右滑动 - **查看地图**: 点击 GPX Tab,使用滑块缩放,拖拽平移 - **语言切换**: Setting Tab → Language → 选择语言 - **主题切换**: Setting Tab → Theme → 开关切换 - **关机**: 长按电源键 3 秒 #### 按键功能 | 按键 | 短按 | 长按 | |-----|------|------| | KEY0 | 上翻页 | - | | KEY1 | 下翻页 | - | | KEY2 | 确认 | - | | KEY3 | 返回 | - | | POWER | 唤醒 | 关机 (3秒) | --- ## 技术依赖 ### 第三方库 | 库名称 | 版本 | 用途 | 许可证 | |-------|------|------|--------| | **LVGL** | 9.4.0 | GUI图形库 | MIT | | **FreeRTOS** | 10.x | 实时操作系统 | MIT | | **FatFs** | R0.14 | FAT文件系统 | BSD-style | | **STM32 HAL** | F4 V1.27.1 | 硬件抽象层 | BSD-3-Clause | ### LVGL配置要点 ```c // lv_conf.h 关键配置 #define LV_COLOR_DEPTH 16 // RGB565色深 #define LV_HOR_RES_MAX 240 // 水平240像素 #define LV_VER_RES_MAX 320 // 垂直320像素 #define LV_MEM_SIZE (64 * 1024U) // 64KB内存池 #define LV_DEF_REFR_PERIOD 66 // 66ms刷新 (15fps) #define LV_USE_OS LV_OS_FREERTOS // 启用RTOS集成 ``` --- ## 项目亮点 ### 1. 模块化设计 - 清晰的三层架构: 应用层 → 中间件 → 硬件层 - 高内聚低耦合的模块划分 - 便于功能扩展和维护 ### 2. 数据驱动UI - LVGL 9.4 新特性: Subject-Observer 模式 - 数据更新自动触发界面刷新 - 解耦数据逻辑和显示逻辑 ### 3. 传感器融合 - GPS + IMU 数据融合计算坡度 - 提高测量精度和可靠性 ### 4. 实时地图显示 - 完整的 Web Mercator 投影实现 - 在线瓦片地图加载机制 - 支持多级缩放和平滑滚动 ### 5. 多任务并行 - 5个 FreeRTOS 任务协同工作 - 互斥锁保护共享资源 - 高效的任务调度 ### 6. 国际化支持 - 双语界面 (可扩展更多语言) - 中文字体嵌入 - 动态语言切换 --- ## 性能指标 | 指标 | 数值 | 说明 | |-----|------|------| | **UI刷新率** | 15 FPS | 66ms/帧 | | **GPS更新率** | 1 Hz | NMEA协议限制 | | **陀螺仪采样率** | 12.5 Hz | LSM6DSM配置 | | **内存占用** | ~120KB | SRAM (含LVGL缓冲) | | **Flash占用** | ~600KB | 代码+资源 | | **功耗** | <200mA | 正常运行 (背光50%) | --- ## 常见问题 (FAQ) ### Q1: GPS 无法搜星? **A**: 1. 确认 GPS 模块电源已启用 2. 移到户外开阔区域 3. 检查 USART2 波特率配置 (9600) 4. 查看调试串口输出的 NMEA 数据 ### Q2: 地图无法加载? **A**: 1. 确认 SD 卡已插入且格式化为 FAT32 2. 检查网络连接 (如需在线地图) 3. 验证瓦片 URL 是否正确 ### Q3: 触摸屏无响应? **A**: 1. 检查 I2C2 总线连接 2. 确认 CST816 中断引脚配置 (PD0) 3. 重启设备重新初始化 ### Q4: 如何添加新的语言? **A**: 1. 编辑 `ui_translation.h` 添加语言枚举 2. 在 `ui_translation.c` 添加翻译字符串数组 3. 更新设置页面下拉菜单选项 ### Q5: 如何修改地图源? **A**: 编辑 `tile_tool.c` 中的瓦片 URL 模板: ```c char url[] = "http://tile.openstreetmap.org/{z}/{x}/{y}.png"; ``` --- ## 后续开发计划 ### 短期目标 - [ ] 添加骑行轨迹记录 (GPX文件导出) - [ ] 实现心率监测 (蓝牙HRM传感器) - [ ] 优化地图缓存机制 - [ ] 添加运动统计报表 ### 长期目标 - [ ] 支持 ANT+ 协议 (功率计/踏频器) - [ ] 蓝牙 BLE 手机同步 - [ ] 机器学习骑行模式识别 - [ ] 云端数据备份和分析 --- ## 贡献指南 欢迎提交 Issue 和 Pull Request! ### 代码规范 - 遵循 C99 标准 - 缩进: 4空格 (不使用Tab) - 命名: 小写字母+下划线 (snake_case) - 注释: 英文注释 + 关键逻辑中文说明 ### 提交规范 ``` : 类型(type): feat : 新功能 fix : 修复Bug docs : 文档更新 style : 代码格式调整 refactor: 重构 perf : 性能优化 test : 测试相关 ``` --- ## 许可证 本项目采用 **MIT License** 开源协议。 ``` Copyright (c) 2025 尚硅谷 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction... ``` 详见 [LICENSE](LICENSE) 文件。 --- ## 致谢 - **LVGL团队**: 提供优秀的嵌入式GUI库 - **STMicroelectronics**: STM32 HAL库和开发工具 - **FreeRTOS**: 可靠的RTOS内核 - **OpenStreetMap**: 免费地图数据 --- ## 联系方式 - **项目主页**: [尚硅谷嵌入式项目] - **技术支持**: 提交 GitHub Issue - **文档**: 见 `docs/` 目录 --- **最后更新**: 2026-01-11 **项目状态**: ✅ 功能完整,持续维护中