# BikeSafeTurnSystem **Repository Path**: qiao-xinchao/bike-safety-turn-system ## Basic Information - **Project Name**: BikeSafeTurnSystem - **Description**: 智能自行车转向灯系统,通过传感器和算法自动识别骑行者意图,提供安全可靠的转向指示,提升骑行安全。 - **Primary Language**: Unknown - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-10 - **Last Updated**: 2026-04-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 自行车安全转向系统 基于 STM32F103C8T6 的自行车智能安全转向指示系统。 ## 项目简介 Bike Safety Turn System 是一款专为自行车设计的安全警示系统,通过检测骑行状态(刹车、转弯)并自动显示相应的警示信号,提高夜间骑行安全性。系统支持低功耗模式,空闲时自动进入休眠,由SW420震动传感器唤醒。 ## 硬件平台 | 组件 | 型号 | 通信方式 | 功能 | |------|------|----------|------| | 主控芯片 | STM32F103C8T6 | - | 系统控制核心 | | 加速度计 | MPU6050 | I2C1 (PB6/PB7) | 姿态检测、刹车/转向判断 | | 超声波测距 | HC-SR04 | TIM2捕获 (PA0/PA1) | 后方障碍物距离检测 | | LED点阵驱动 | TM1640 | 软件GPIO (PA4/PA5) | 8x8双色点阵显示 | | 震动传感器 | SW420 | EXTI2 (PB2) | 低功耗唤醒源 | | 蜂鸣器 | 有源蜂鸣器 | GPIO (PB12) | 声音警示 | ## 功能特性 ### 安全检测 - **刹车检测**: 通过MPU6050加速度传感器检测骑行减速状态(加速度突变>0.25g) - **转向检测**: 检测自行车左右倾斜角度,判断转向意图(倾斜角>10°) - **距离检测**: HC-SR04超声波传感器测量后方障碍物距离 ### 警示输出 - **转向指示**: 左转/右转箭头显示(绿色,300ms闪烁间隔) - **刹车显示**: 刹车图案警示(红色) - **危险警报**: 后方来车距离<50cm时红色快速闪烁(100ms)+蜂鸣器 - **距离警告**: 距离<100cm时红色警告闪烁(500ms间隔) ### 低功耗模式 - **触发条件**: 系统空闲60秒后自动进入 - **唤醒方式**: SW420震动传感器触发外部中断唤醒 - **功耗模式**: STM32 Stop模式(~350μA) - **唤醒响应**: 显示绿色笑脸提示唤醒成功 ## 显示图案 | 图案 | 颜色 | 触发条件 | |------|------|----------| | 笑脸 | 绿色 | 系统正常启动/唤醒成功 | | 刹车 | 红色 | MPU6050检测到刹车动作 | | 左箭头 | 绿色 | 车身左倾>10° | | 右箭头 | 绿色 | 车身右倾>10° | | 警告 | 红色/绿色 | 超声波检测到危险/警告距离 | ## 优先级机制 系统采用固定优先级判决,高优先级可中断低优先级显示: ``` 优先级从高到低: ┌─────────────────────────────────────────────────┐ │ 1. 危险报警 (距离 < 50cm) → 红色闪烁 + 蜂鸣器 │ ├─────────────────────────────────────────────────┤ │ 2. 距离警告 (50cm < 距离 < 100cm) → 红色闪烁 │ ├─────────────────────────────────────────────────┤ │ 3. 刹车状态 → 红色全亮显示 │ ├─────────────────────────────────────────────────┤ │ 4. 左转向 → 绿色左箭头闪烁 │ ├─────────────────────────────────────────────────┤ │ 5. 右转向 → 绿色右箭头闪烁 │ ├─────────────────────────────────────────────────┤ │ 6. 空闲状态 → 关闭显示 │ └─────────────────────────────────────────────────┘ ``` ## 模块说明 ### Drivers/BSP | 模块 | 文件 | 功能说明 | |------|------|----------| | **系统核心** | bike_system.c/h | 系统状态机、任务调度、优先级判决 | | **姿态传感器** | mpu6050.c/h | MPU6050 I2C通信、姿态解算、刹车/转向检测 | | **超声波测距** | hcsr04.c/h | HC-SR04控制、距离测量、安全等级判断 | | **显示驱动** | tm1640.c/h | TM1640软件模拟SPI、图案显示、颜色控制 | | **字库数据** | ziku.c | 8x8点阵字模数据、扩展图案定义 | | **震动传感器** | sw420.c/h | SW420外部中断配置、震动状态管理 | | **低功耗管理** | low_power.c/h | STM32 Stop模式控制、系统时钟恢复 | ### Core/Src | 文件 | 功能 | |------|------| | main.c | 系统入口、外设初始化、任务主循环 | | gpio.c | GPIO配置(显示/蜂鸣器/触发引脚) | | i2c.c | I2C1/I2C2配置(MPU6050通信) | | tim.c | TIM2(超声波捕获)/TIM3(定时器)配置 | | stm32f1xx_it.c | 中断服务程序 | ## 硬件连接 ### 引脚映射 ``` GPIOA: PA0 - TRIG (超声波触发输出) PA1 - ECHO (超声波回响输入/TIM2捕获) PA4 - TM1640_CLK (显示模块时钟) PA5 - TM1640_DIN (显示模块数据) GPIOB: PB2 - SW420 (震动传感器中断输入) PB6 - I2C1_SCL (MPU6050时钟) PB7 - I2C1_SDA (MPU6050数据) PB12 - BUZZER (蜂鸣器输出) ``` ### 外部接口 ``` MPU6050 -> I2C1 (PB6-SCL, PB7-SDA), 地址 0xD0 HC-SR04 -> PA0(TRIG), PA1(ECHO) TM1640 -> PA4(CLK), PA5(DIN) SW420 -> PB2 (外部中断) Buzzer -> PB12 (高电平触发) ``` ## 系统架构 ``` ┌─────────────────────────────────────┐ │ main.c (入口) │ │ HAL_Init() → MX_X_Init() │ └──────────────┬──────────────────────┘ │ ┌──────────────▼──────────────────────┐ │ BikeSystem_Init() │ │ 1. TM1640 显示初始化 │ │ 2. MPU6050 姿态传感器初始化 │ │ 3. HCSR04 超声波初始化 │ │ 4. SW420 震动传感器初始化 │ │ 5. LowPower 低功耗初始化 │ └──────────────┬──────────────────────┘ │ ┌──────────────▼──────────────────────┐ │ BikeSystem_Task() (轮询) │◄──┐ │ 周期: 25ms (40Hz) │ │ └──────────────┬──────────────────────┘ │ │ │ ┌──────────────────────────┼──────────────────────────┐ │ │ │ ▼ ▼ ▼ ┌───────────────┐ ┌─────────────────┐ ┌──────────────┐ │ 传感器处理 │ │ 输出控制 │ │ 低功耗管理 │ │ │ │ │ │ │ │ 1.MPU6050 │ │ 1.显示图案 │ │ 空闲60秒 │ │ 姿态判断 │ │ - 刹车:红色 │ │ 进入Stop │ │ 刹车/转向 │ │ - 转向:绿色 │ │ │ │ │ │ - 危险:闪烁 │ │ SW420震动 │ │ 2.HCSR04 │ │ │ │ 唤醒系统 │ │ 测距 │ │ 2.蜂鸣器控制 │ │ │ │ 安全等级 │ │ │ │ │ └───────────────┘ └─────────────────┘ └──────────────┘ ``` ## 工作流程 ### 系统启动 1. HAL库初始化(时钟、滴答定时器) 2. 配置系统时钟(HSE + PLL, 72MHz) 3. 初始化GPIO、I2C、定时器 4. 初始化各外设驱动 5. 显示启动笑脸 6. 进入主任务循环 ### 主任务循环 (25ms周期) 1. 读取MPU6050加速度数据 2. 姿态解算,判断刹车/转向状态 3. 读取超声波距离,判断安全等级 4. 根据优先级判决输出 5. 更新显示和蜂鸣器 6. 检查低功耗条件 ### 低功耗流程 ``` 正常模式 (SYS_NORMAL) │ ▼ 空闲60秒 低功耗模式 (SYS_LOW_POWER) │ ├─► 检测到SW420震动 ──► 唤醒 ──► 恢复运行 │ └─► 无震动 ──► 进入Stop模式 ──► (等待SW420中断唤醒) ``` ## 配置参数 | 参数 | 定义 | 说明 | |------|------|------| | SYSTEM_TASK_PERIOD_MS | 25 | 系统任务周期 (40Hz) | | IDLE_TIMEOUT_MS | 60000 | 空闲超时进入低功耗 (60秒) | | BRAKE_THRESHOLD | 0.25g | 刹车检测加速度阈值 | | TURN_THRESHOLD | 10° | 转向检测倾斜角阈值 | | FILTER_ALPHA | 0.15 | 低通滤波系数 | | SAFE_DISTANCE_WARNING | 100cm | 警告距离阈值 | | SAFE_DISTANCE_DANGER | 50cm | 危险距离阈值 | ## 编译说明 1. 使用 Keil MDK-ARM 打开 `MDK-ARM/BikeSafeTurnSystem.uvprojx` 2. 选择目标芯片 **STM32F103C8** 3. 确保工程包含以下BSP文件: - bike_system.c - mpu6050.c - hcsr04.c - tm1640.c - sw420.c - low_power.c - ziku.c 4. 编译并下载到开发板 ## 项目结构 ``` bike-safety-turn-system/ ├── Core/ │ ├── Inc/ │ │ ├── main.h # 主头文件、引脚定义 │ │ ├── gpio.h/i2c.h/tim.h │ │ └── stm32f1xx_it.h │ └── Src/ │ ├── main.c # 主程序入口 │ ├── gpio.c # GPIO配置 │ ├── i2c.c # I2C配置 │ ├── tim.c # 定时器配置 │ └── stm32f1xx_it.c # 中断服务 │ ├── Drivers/ │ └── BSP/ │ ├── bike_system.c/h # 系统核心状态机 │ ├── mpu6050.c/h # 姿态传感器驱动 │ ├── hcsr04.c/h # 超声波测距驱动 │ ├── tm1640.c/h # 显示驱动 │ ├── sw420.c/h # 震动传感器驱动 │ ├── low_power.c/h # 低功耗管理 │ └── ziku.c # 字库数据 │ ├── MDK-ARM/ │ └── BikeSafeTurnSystem.uvprojx # Keil工程文件 │ ├── BikeLight_System.ioc # STM32CubeMX配置 └── README.md ``` ## 功耗说明 | 模式 | 电流 | 说明 | |------|------|------| | 正常运行 | ~20mA | 主频72MHz,各外设工作 | | Sleep模式 | ~3mA | CPU关闭,外设运行 | | Stop模式 | ~350μA | 所有时钟关闭,SRAM保留 | | Standby模式 | ~3μA | 几乎全关,SRAM丢失 | ## 注意事项 1. **SW420震动阈值**: SW420是震动开关,触发后需要清除状态标志 2. **Stop模式唤醒**: 唤醒后系统时钟默认为HSI,已在LowPower_Exit()中恢复为HSE+PLL 3. **MPU6050安装**: 芯片朝向影响姿态检测算法,需根据实际安装调整 4. **超声波间隔**: 测距任务每100ms执行一次,避免频繁触发 ## 许可证 本项目基于 ST 官方 HAL 库条款开源。 ## 作者 qiao-xinchao