2026-02-26 14:26:55 +08:00
2026-02-26 14:26:55 +08:00
2026-02-25 22:48:12 +08:00
2026-02-26 14:26:55 +08:00
2026-02-25 22:48:12 +08:00

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)

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)

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)

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时间
Description
智能宠物喂养系统
Readme 477 MiB
Languages
C 96.9%
Assembly 1.9%
JavaScript 0.9%
C++ 0.2%