Files
SmartMassager_STM32/README.md
wangbeihong b883e0a7f9 feat: 实现智能按摩器完整功能 (定时/语音/电机/显示)
- 新增MP3语音模块驱动,集成18个语音提示,支持播放/停止/音量调节
- 实现0/10/20/30分钟循环定时倒计时,实时显示剩余时间,定时结束自动停机
- 优化电机控制:一档力度提升至75%,降档冲击时间延长至800ms,降档时触发100%冲击防卡顿
- 屏幕显示重构为分区动态更新:时间状态(Zone1)/档位(Zone2)/加热(Zone3),性能优化
- 新增LED指示:运行时RUN_LED以500ms周期闪烁,无效操作ERR_LED亮1秒
- 操作逻辑改进:所有操作需先设定时间,否则播放"请先设定时间"并亮ERR_LED
- 加热控制由GPIO改为PWM(TIM1_CH1),占空比300
- 调整USART3波特率为9600适配MP3模块
- FreeRTOS任务优化:Motor周期500ms,Screen周期10ms,新增定时器秒Tick处理
- 完善开发文档:MP3集成指南、校验和验证脚本、文件重命名工具等

新增文件:mp3_driver.h/c, 多项开发文档
修改文件:freertos.c, gbk_text.h/c, motor_driver.c, screen.h/c, usart.c, gpio.c等
2026-02-17 23:52:17 +08:00

280 lines
9.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SmartMassager_STM32
STM32 智能按摩器控制系统项目
## 项目概述
本项目基于 STM32 微控制器开发的智能按摩器控制系统集成了串口屏显示、FreeRTOS 实时操作系统、MP3语音提示、定时倒计时、多档位电机控制等功能。系统支持完整的按摩操作流程包括定时设定、档位调节、加热控制等并通过语音提示提供友好的用户交互体验。
## 硬件平台
- **主控芯片**: STM32F103XE 系列微控制器
- **显示屏**: JC 系列串口屏(通过 USART1 通信,波特率 115200
- **MP3模块**: 通过 USART3 通信(波特率 9600
- **电机控制**: TIM3 PWM 输出(三档 PWM75% / 85% / 95%
- **加热控制**: TIM1 CH1 PWM 输出(占空比 300
- **操作系统**: FreeRTOS 实时操作系统
- **调试工具**: ST-LINK
## 功能特性
### 核心功能
#### 1. 定时倒计时系统
- 支持 0→10→20→30→0 分钟循环定时设定
- 实时倒计时显示,动态更新剩余时间
- 定时结束自动停止所有设备(电机、加热)
- 运行中按下定时键可取消定时并停止
#### 2. MP3语音提示系统
- 18个预设语音文件覆盖所有操作场景
- 支持播放控制:播放指定索引曲目、停止、暂停、设置音量、切换音源
- 自动校验和计算,确保通信可靠性
- 语音提示包括:欢迎语、定时设定、档位变化、加热开关、错误提示等
#### 3. 多档位电机控制
- 三档力度调节75%(一档) / 85%(二档) / 95%(三档)
- 启动冲击时间1500ms
- 降档平滑过渡800ms 适应时间 + 100% PWM 冲击
- 精确的 PWM 通道控制:`Motor_StartAll()` / `Motor_StopAll()`
- 优化一档力度从 65% 提升至 75%,改善低速按摩效果
#### 4. 加热控制
- PWM 控制加热输出TIM1 CH1占空比 300
- 开关状态实时显示
- 配合语音提示反馈
#### 5. 分区屏幕显示
- **Zone1**: 显示时间状态(停止 / 设定时间 / 剩余时间倒计时)
- **Zone2**: 显示按摩档位(停止 / 一档 / 二档 / 三档)
- **Zone3**: 显示加热状态(开启 / 关闭)
- 动态生成剩余时间 GBK 字符串("时间:剩余XX分"
- 状态变化时才更新屏幕,优化性能
#### 6. LED指示灯
- **RUN_LED**: 运行时以 500ms 周期闪烁,停止时熄灭
- **ERR_LED**: 无效操作时亮 1 秒提示
- 低电平点亮控制方式
#### 7. 操作安全机制
- 所有操作(按摩、加热)需先设定时间,否则提示错误
- 未设定时间操作时播放语音"请先设定时间"并点亮 ERR_LED
- 完善的错误处理和用户提示
## 按键功能
| 按键 | 功能 | 说明 |
|------|------|------|
| **TIME_KEY** | 定时设定 | 循环切换0→10→20→30→0 分钟 |
| **M_KEY** | 加档 | 从当前档位递增0→1→2→3到三档时提示"已到最大档位" |
| **M_KEYC7** | 减档 | 从当前档位递减3→2→1→0减到0档时停止按摩 |
| **HOT_KEY** | 加热开关 | 切换加热开/关状态 |
## 软件架构
### 主要模块
1. **MP3驱动模块** (`mp3_driver.c`)
- 完整的 MP3 驱动协议实现
- 支持播放控制命令封装
- 自动校验和计算
2. **屏幕驱动模块** (`screen.c`)
- 串口屏底层驱动实现
- 分区显示功能Zone1/Zone2/Zone3
- GBK 字符显示支持
- 基本绘图功能(点、线、矩形、圆形)
- 图片显示功能
3. **电机驱动模块** (`motor_driver.c`)
- 三档 PWM 控制
- 启动加速功能
- 降档冲击优化
- 精确通道控制
4. **GBK文本模块** (`gbk_text.c`)
- GBK 编码文本常量定义
- 支持动态时间字符串生成
5. **任务调度模块** (`freertos.c`)
- 基于 FreeRTOS 的多任务管理
- Motor 任务500ms 周期)
- Screen 任务10ms 周期)
- 定时器 Tick 处理1秒周期
6. **日志系统**
- 集成 EasyLogger 日志框架
- 多级别日志输出
### 核心 API
#### 定时器 API
- `Timer_CanOperate()` - 检查定时器是否可操作
- `Timer_GetRemainingSeconds()` - 获取剩余秒数
- `Timer_GetMinutes()` - 获取设定的分钟数
- `Timer_IsRunning()` - 检查定时器是否运行中
#### MP3播放 API
- `MP3_Play(uint8_t index)` - 播放指定索引曲目
- `MP3_Stop()` - 停止播放
- `MP3_Pause()` - 暂停播放
- `MP3_SetVolume(uint8_t volume)` - 设置音量0-30
- `MP3_SetSource(uint8_t source)` - 设置音源
#### 电机控制 API
- `Motor_SetGear(uint8_t gear)` - 设置档位0-3
- `Motor_StartAll()` - 启动所有电机通道
- `Motor_StopAll()` - 停止所有电机通道
- `Motor_GetCurrentGear()` - 获取当前档位
#### 屏幕控制 API
- `Screen_Init()` - 屏幕初始化
- `Screen_Clear()` - 清屏
- `Screen_DrawText16_GBK()` - 绘制16号字体GBK文本
- `Screen_DrawText24_GBK()` - 绘制24号字体GBK文本
- `Screen_ShowZone1_Time()` - 显示Zone1时间状态
- `Screen_ShowZone2_Gear()` - 显示Zone2档位状态
- `Screen_ShowZone3_Heat()` - 显示Zone3加热状态
## 开发环境
- **IDE**: STM32CubeIDE
- **编译器**: GCC ARM
- **构建工具**: CMake
- **调试工具**: ST-LINK
## 构建说明
1. 克隆项目到本地
2. 使用 STM32CubeIDE 导入项目
3. 配置目标芯片型号STM32F103XE
4. 编译项目
5. 通过 ST-LINK 下载到目标板
### 依赖文件
- `CMakeLists.txt` - CMake 构建配置
- `CMakePresets.json` - CMake 预设配置
- `STM32F103XX_FLASH.ld` - 链接脚本
- `startup_stm32f103xe.s` - 启动文件
## 使用说明
### 基本操作流程
1. **上电启动**
- 系统自动初始化
- 播放欢迎语音MP3文件1
- 屏幕显示加载界面
2. **设定时间**
- 按下 `TIME_KEY` 选择定时时长10/20/30分钟
- 屏幕显示设定时间
- 播放相应语音提示
3. **启动按摩**
- 按下 `M_KEY` 启动按摩(一档)
- RUN_LED 开始闪烁
- 开始倒计时
4. **调节档位**
-`M_KEY` 加档(一档→二档→三档)
-`M_KEYC7` 减档(三档→二档→一档→停止)
- 每次操作播放语音提示
5. **加热控制**
-`HOT_KEY` 开关加热
- 屏幕显示加热状态
- 播放语音提示
6. **定时结束**
- 倒计时归零
- 自动停止所有设备
- 播放"定时结束,按摩结束"语音
### 语音文件索引
| 索引 | 语音内容 | 触发时机 |
|------|----------|----------|
| 1 | 欢迎语 | 系统启动 |
| 2 | 设定10分钟 | 定时键按下 |
| 3 | 设定20分钟 | 定时键按下 |
| 4 | 设定30分钟 | 定时键按下 |
| 5 | 取消定时 | 定时键取消 |
| 6 | 按摩已停止 | 取消定时 |
| 7 | 按摩开始 | 首次启动按摩 |
| 8 | 一档 | 加档到一档 |
| 9 | 二档 | 加档到二档 |
| 10 | 三档 | 加档到三档 |
| 11 | 已到最大档位 | 尝试加到四档 |
| 12 | 一档 | 降档到一档 |
| 13 | 二档 | 降档到二档 |
| 14 | 按摩停止 | 降档到零档 |
| 15 | 加热已开 | 打开加热 |
| 16 | 加热已关 | 关闭加热 |
| 17 | 请先设定时间 | 未设定时间操作 |
| 18 | 定时结束,按摩结束 | 倒计时结束 |
## 项目结构
```
SmartMassager_STM32/
├── Core/ # 核心代码
│ ├── Inc/ # 头文件
│ │ ├── mp3_driver.h # MP3驱动头文件
│ │ ├── motor_driver.h # 电机驱动头文件
│ │ ├── screen.h # 屏幕驱动头文件
│ │ ├── gbk_text.h # GBK文本定义
│ │ └── freertos.h # FreeRTOS配置
│ └── Src/ # 源文件
│ ├── mp3_driver.c # MP3驱动实现
│ ├── motor_driver.c # 电机驱动实现
│ ├── screen.c # 屏幕驱动实现
│ ├── gbk_text.c # GBK文本实现
│ ├── freertos.c # FreeRTOS任务实现
│ └── main.c # 主程序
├── Drivers/ # STM32 HAL驱动
├── Middlewares/ # 中间件FreeRTOS
├── Development_Docs/ # 开发文档
│ └── Serial_Screen_Docs/ # 串口屏相关文档
│ ├── LIST/ # MP3集成文档和脚本
│ └── 测试记录/ # 功能测试记录
├── build/ # 构建输出目录
├── CMakeLists.txt # CMake配置
├── anmo.ioc # STM32CubeMX项目文件
└── README.md # 项目说明文档
```
## 文档资源
### 开发文档
- `Development_Docs/Serial_Screen_Docs/LIST/mp3_integration_summary.md` - MP3集成文档
- `Development_Docs/Serial_Screen_Docs/LIST/mp3_usage_example.py` - MP3使用示例
- `Development_Docs/Serial_Screen_Docs/LIST/rename_mp3_files.py` - MP3文件重命名脚本
- `Development_Docs/Serial_Screen_Docs/LIST/verify_mp3_checksum.py` - MP3校验和验证脚本
### 测试记录
- `Development_Docs/测试记录/` - 功能测试记录目录
## 技术支持
如有问题请联系开发团队或查看相关技术文档。
## 版本信息
- **当前版本**: v2.0.0
- **发布日期**: 2025年2月
- **主要更新**:
- ✅ 完整实现定时倒计时功能
- ✅ 集成MP3语音提示系统
- ✅ 优化电机控制(一档力度提升、降档平滑)
- ✅ 新增分区屏幕显示
- ✅ 实现LED运行指示和错误提示
- ✅ 完善操作安全机制
## 许可证
本项目仅供学习和参考使用。
---
**注意**: 使用前请确保所有硬件连接正确,电源电压符合要求,避免在潮湿环境中使用。