Files
SmartPetFeeder_STM32/README.md
wangbeihong 1fc85589c6 ## 主要修改
### 1. MQTT setMode命令处理修复
- 添加Set_System_Mode函数extern声明,解决编译错误
- 将setMode处理逻辑移到control主题,符合小程序规范
- 完善Set_System_Mode函数,添加音频播放功能

### 2. 按键4手动补水功能
- 实现key4_single_click_handler函数,添加手动补水逻辑
- 与按键2喂食逻辑保持一致:相同的模式检查和错误处理
- 提供完整的本地手动控制功能

### 3. 系统优化
- 统一本地和远程控制逻辑
- 完善错误处理和用户反馈
- 优化代码结构和日志记录

## 影响
- 系统现在支持完整的双重控制方式(本地按键+远程MQTT)
- 所有按键功能完善:模式切换、手动喂食、页面切换、手动补水
- 编译无错误,代码结构清晰,便于维护
2026-02-25 22:48:12 +08:00

248 lines
10 KiB
Markdown
Raw Permalink 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.
# SmartPetFeeder_STM32
## WiFi 与 MQTT 通信模块说明
本工程中的 `dx_wf_24.c` 实现了基于 ESP8266/ESP32 AT 指令集的 WiFi 与 MQTT 通信功能,主要特性包括:
- **串口 DMA 接收与发送**:使用 STM32 的 UART + DMA 实现高效数据收发,支持 IDLE 中断检测帧尾。
- **WiFi 连接管理**:通过 AT 指令自动连接指定 SSID 和密码的 WiFi 网络。
- **MQTT 客户端功能**
- 自动生成唯一 ClientID基于系统 Tick 与 STM32 UID
- 支持设置用户名、密码;
- 连接指定 MQTT 服务器(支持自定义 Host 和 Port
- 双主题订阅:`petfeeder/control`(控制指令)和 `petfeeder/config`(配置更新);
- 支持 RAW 数据发布(`AT+MQTTPUBRAW`),适用于 JSON 等结构化数据;
- 自动处理 MQTT 断线重连事件(通过 `+MQTTDISCONNECTED` 监测)。
- **消息解析**:解析 `+MQTTSUBRECV` 格式的订阅消息,提取主题与负载内容。
- **状态上报**
- 设备上线时自动发布 `{"status":"online"}``petfeeder/status` 主题retain=1
- 支持传感器数据上报至 `petfeeder/sensor` 主题。
> 注意:当前实现为单任务模型,在 `wifi_task_mqtt` 中完成初始化、连接、订阅及消息处理循环。
## SNTP 网络时间同步功能
本工程还实现了 SNTP (Simple Network Time Protocol) 网络时间同步功能,主要特性包括:
- **自动时间同步**:在 MQTT 连接成功后自动获取网络时间并同步到本地。
- **中国时区支持**默认配置为中国时区UTC+8使用 `cn.ntp.org.cn` 作为 NTP 服务器。
- **时间获取与存储**:提供 API 接口获取当前网络时间,并存储在内部结构体中。
- **时间有效性检查**:提供函数检查获取的时间是否有效。
### 主要函数接口:
- `WIFI_Enable_SNTP()`:启用 SNTP 功能并配置 NTP 服务器
- `WIFI_Get_SNTP_Time()`:获取当前网络时间
- `WIFI_Get_Current_Time()`:获取存储的当前时间(返回结构体副本)
- `WIFI_Is_Time_Valid()`:检查时间是否有效
## MP3 音频播放功能
本工程集成了 MP3 音频播放功能,用于提供各种系统状态和事件的语音提示。相关的音频索引定义在 `Core/Bsp/BSP_Device/bsp_mp3/mp3_play_index.h` 文件中。
### 音频提示分类:
#### 系统状态与初始化
- `SYS_POWER_ON` (1): 系统上电完成,智能宠物喂食系统启动完成,进入待机模式
- `WIFI_CONNECT_OK` (2): WiFi连接成功云平台数据同步已开启
- `WIFI_CONNECT_FAIL` (3): WiFi连接失败请检查网络配置
#### 喂食模块
- `FEED_AUTO_START` (4): 自动喂食启动,步进电机开始出粮
- `FEED_IN_PROGRESS` (5): 正在出粮,称重模块实时监测中
- `FEED_COMPLETE` (6): 喂食完成,当前食物重量已达设定值
- `FEED_MANUAL_TRIGGER` (7): 手动喂食指令已接收,开始出粮
- `FOOD_LOW_ALARM` (8): 食物余量不足警告,请及时添加
#### 喂水模块
- `WATER_REFILL_START` (9): 水位低于阈值,水泵启动,开始自动补水
- `WATER_REFILL_DONE` (10): 补水完成,水位已达设定上限
- `WATER_LOW_ALARM` (11): 水位过低警告,请检查水源或水泵
- `WATER_PIR_REFILL` (12): 检测到宠物靠近且水位偏低,启动自动补水
#### 模式切换
- `MODE_AUTO` (13): 已切换至自动运行模式
- `MODE_MANUAL` (14): 已切换至手动控制模式
#### 参数设置
- `PARAM_SAVE_OK` (15): 参数设置已保存,系统配置已更新
- `PARAM_TIME_SET` (16): 自动喂食时间已更新
- `PARAM_WEIGHT_SET` (17): 喂食重量阈值已更新
#### 远程控制与异常
- `REMOTE_CMD_RECEIVED` (18): 接收到微信小程序远程控制指令
- `DATA_UPLOAD_FAIL` (19): 数据上传失败,请检查网络连接
- `SYS_ERROR_ALARM` (20): 系统检测到异常,请检查硬件模块
### 使用说明:
系统通过调用相应的音频索引值来播放对应的提示音,为用户提供直观的听觉反馈,增强用户体验。
## FreeRTOS任务架构与系统功能
### 系统概述
本智能宠物喂食器系统基于FreeRTOS实时操作系统采用多任务架构实现模块化功能。系统包含6个主要任务分别负责不同的功能模块。
### 任务列表与优先级
| 任务名称 | 堆栈大小 | 优先级 | 功能描述 |
|----------|----------|--------|----------|
| defaultTask | 256*4字节 | High1 | 系统默认任务负责初始化核心组件LED、日志、RTC、MP3 |
| wifi_mqtt | 3000*4字节 | High | WiFi和MQTT通信任务负责网络连接和数据传输 |
| LCD_SHOW_Task | 1024*4字节 | High | LCD显示任务负责显示系统状态和信息 |
| button | 512*4字节 | Realtime2 | 按钮处理任务,负责检测和处理按键输入 |
| sensor | 1024*4字节 | Normal | 传感器数据采集任务,负责读取温湿度和重量数据 |
| step_motor | 512*4字节 | Normal | 步进电机控制任务,负责执行喂食操作 |
### 主要数据结构
#### LCD页面枚举 (LCD_Page_t)
```c
typedef enum {
LCD_PAGE_TIME = 0, // 时间显示页面
LCD_PAGE_TEMP_HUMI, // 温湿度页面
LCD_PAGE_FOOD_WEIGHT, // 食物重量页面
LCD_PAGE_WATER_LEVEL, // 水位页面
LCD_PAGE_SYSTEM_STATUS // 系统状态页面
} LCD_Page_t;
```
#### 传感器数据结构体 (Sensor_Data_t)
```c
typedef struct {
float temperature; // 温度值
float humidity; // 湿度值
float food_weight; // 食物重量
uint8_t water_level; // 水位状态 (0=无水, 1=有水)
uint8_t system_mode; // 系统模式 (0=手动, 1=自动)
} Sensor_Data_t;
```
#### 喂食控制命令枚举 (Feed_Cmd_t)
```c
typedef enum {
FEED_CMD_NONE = 0, // 无命令
FEED_CMD_MANUAL, // 手动喂食
FEED_CMD_AUTO, // 自动喂食
FEED_CMD_REMOTE, // 远程喂食
FEED_CMD_TEST // 测试喂食
} Feed_Cmd_t;
```
### 全局变量
- `current_page`: 当前LCD显示页面
- `sensor_data`: 传感器数据
- `lcd_force_refresh`: 强制刷新标志RTC更新时设置
- `system_mode`: 系统模式1=自动模式0=手动模式)
- `feeding_in_progress`: 喂食进行中标志
- `feed_command`: 喂食命令标志
- `feed_angle`: 喂食角度默认90度
- `feed_amount`: 喂食份数
### 各任务详细功能
#### 1. defaultTask (默认任务)
- 初始化运行LED
- 初始化日志系统 (easylogger)
- 初始化RTC管理模块
- 初始化MP3模块并播放系统启动音
- 主循环闪烁运行LED1秒开1秒关
#### 2. LCD_SHOW_Task (LCD显示任务)
- 显示5个不同页面
1. **时间页面**: 显示当前时间和日期
2. **温湿度页面**: 显示温度和湿度值
3. **食物重量页面**: 显示食物重量和状态LOW/MEDIUM/GOOD
4. **水位页面**: 显示水位状态NO WATER/WATER OK
5. **系统状态页面**: 显示MQTT连接状态、系统模式、喂食状态
- 刷新策略:
- 时间页面和系统状态页面每30秒刷新
- 其他页面每2秒刷新
- 支持RTC时间更新回调时间更新时立即刷新显示
#### 3. sensorTask (传感器任务)
- HX711称重传感器校准零点校准
- AHT30温湿度传感器初始化
- 循环读取温湿度数据每2秒一次
- 循环读取食物重量数据每2秒一次
- 更新全局传感器数据结构
#### 4. button_task (按钮任务)
- 初始化6个按钮/传感器:
1. KEY1: 模式切换(自动/手动)
2. KEY2: 手动喂食(仅手动模式有效)
3. KEY3: 切换显示界面
4. KEY4: 长按设置时间
5. M3_IO: 水位传感器
6. HC_SR505: 人体存在传感器
- 主循环每5ms检测一次按钮状态
#### 5. step_motor_task (步进电机任务)
- 初始化步进电机
- 检查喂食命令队列
- 执行喂食操作:
- 根据命令类型播放相应音频
- 控制步进电机旋转指定角度和份数
- 等待食物落下3秒
- 停止电机并播放完成音效
#### 6. wifi_task_mqtt (WiFi和MQTT任务)
- 在外部文件中实现
- 负责WiFi连接和MQTT通信
- 处理远程控制指令
### 按键功能说明
| 按键 | 功能 | 说明 |
|------|------|------|
| KEY1 | 模式切换 | 单击切换自动/手动模式,播放相应音效 |
| KEY2 | 手动喂食 | 仅在手动模式下有效触发90度单份喂食 |
| KEY3 | 显示切换 | 单击切换到下一个LCD页面 |
| KEY4 | 时间设置 | 长按进入时间设置模式(待实现) |
| M3_IO | 水位检测 | 检测水位状态,更新传感器数据 |
| HC_SR505 | 人体存在 | 检测人体接近(待实现更多功能) |
### 喂食控制流程
1. **请求阶段**: 通过`Request_Feed()`函数提交喂食请求
2. **命令传递**: 设置全局变量`feed_command`, `feed_angle`, `feed_amount`
3. **执行阶段**: `step_motor_task`检测到命令后调用`Execute_Feed()`
4. **动作执行**:
- 播放相应音频提示
- 步进电机旋转指定角度和份数
- 等待食物落下
- 播放完成音效
5. **状态恢复**: 清除喂食进行中标志
### LCD页面刷新策略
- **时间页面**和**系统状态页面**: 每30秒刷新但每100ms检查一次页面切换
- **其他页面**: 每2秒刷新
- **强制刷新**: RTC时间更新时立即刷新显示
### 系统模式
- **自动模式 (system_mode=1)**: 系统根据预设规则自动执行喂食
- **手动模式 (system_mode=0)**: 用户通过按键或远程控制手动触发喂食
### 音频反馈系统
系统通过MP3模块提供丰富的音频反馈包括
- 系统启动音
- 模式切换提示
- 喂食开始和完成提示
- 错误报警音
- 远程控制接收提示
### 数据流
```
传感器采集 → sensor_data更新 → LCD显示更新 → 用户查看
按键输入 → 模式/喂食控制 → 状态更新 → LCD/音频反馈
远程指令 → MQTT接收 → 喂食控制 → 执行反馈
```
### 扩展接口
- `Request_Feed()`: 外部请求喂食接口
- `Get_System_Mode()`: 获取当前系统模式
- `Set_System_Mode()`: 设置系统模式
- `LCD_UpdateSensorData()`: 更新传感器数据
- `LCD_GetSensorData()`: 获取传感器数据指针
### 注意事项
1. HX711称重传感器首次使用时需要执行校准流程
2. 喂食过程中不接受新的喂食请求
3. 手动喂食仅在手动模式下有效
4. RTC时间通过网络同步网络断开时使用本地RTC时间