# 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模块并播放系统启动音 - 主循环:闪烁运行LED(1秒开,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时间