Files
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
..
2026-02-25 22:48:12 +08:00
2026-02-10 20:27:03 +08:00

智能宠物喂食器 - MQTT 通信协议

概述

本文档描述智能宠物喂食器微信小程序与 STM32 单片机之间的 MQTT 通信协议。

MQTT 连接配置

  • Broker 地址: 根据实际情况配置
  • Broker 端口: 根据实际情况配置(通常为 1883 或 8883
  • 连接方式: TLS 加密连接(推荐)
  • 客户端 ID: 自动生成

主题列表

主题 方向 说明
petfeeder/sensor STM32 → 小程序 传感器数据上报
petfeeder/status STM32 → 小程序 设备状态上报
petfeeder/control 小程序 → STM32 控制指令下发
petfeeder/config 小程序 → STM32 配置参数下发

一、传感器数据上报

Topic: petfeeder/sensor 方向: STM32 → 小程序 频率: 建议每 30 秒上报一次,或数据变化时立即上报

数据格式

{
  "temperature": 25.5,
  "humidity": 60,
  "foodWeight": 500,
  "waterLevel": 1
}

字段说明

字段 类型 范围/值 说明
temperature Float -20~100 温度单位°C
humidity Integer 0~100 湿度,单位:%
foodWeight Integer 0~5000 食物重量,单位:克
waterLevel Integer 0 或 1 水位状态0=缺水1=满水

示例代码STM32 C

// 构造传感器数据 JSON
void send_sensor_data(float temp, int hum, int weight, int water) {
    char payload[128];
    snprintf(payload, sizeof(payload),
        "{\"temperature\":%.1f,\"humidity\":%d,\"foodWeight\":%d,\"waterLevel\":%d}",
        temp, hum, weight, water);
    
    // 发布到 MQTT broker
    mqtt_publish("petfeeder/sensor", payload);
}

二、设备状态上报

Topic: petfeeder/status 方向: STM32 → 小程序 触发: 设备状态变化时上报,或小程序主动查询时上报

数据格式

{
  "mode": "auto"
}

字段说明

字段 类型 可选值 说明
mode String auto | manual 运行模式auto=自动模式manual=手动模式

示例代码STM32 C

// 发送状态数据
void send_device_status(const char* mode) {
    char payload[64];
    snprintf(payload, sizeof(payload), "{\"mode\":\"%s\"}", mode);
    
    mqtt_publish("petfeeder/status", payload);
}

三、控制指令下发

Topic: petfeeder/control 方向: 小程序 → STM32

3.1 手动喂食指令

{
  "action": "feed",
  "amount": 50,
  "timestamp": "2024-01-01T12:00:00.000Z"
}
字段 类型 说明
action String 固定值 "feed"
amount Integer 喂食重量,单位:克
timestamp String ISO 8601 时间戳(可选)

STM32 处理逻辑: 控制舵机或电机转动,投放指定重量的食物


3.2 手动补水指令

{
  "action": "addWater",
  "timestamp": "2024-01-01T12:00:00.000Z"
}
字段 类型 说明
action String 固定值 "addWater"
timestamp String ISO 8601 时间戳(可选)

STM32 处理逻辑: 控制水泵工作,向水箱注水


3.3 设置运行模式

{
  "action": "setMode",
  "mode": "auto",
  "timestamp": "2024-01-01T12:00:00.000Z"
}
字段 类型 可选值 说明
action String 固定值 "setMode"
mode String auto | manual 要设置的模式
timestamp String ISO 8601 时间戳(可选)

STM32 处理逻辑: 更新设备的运行模式状态


3.4 查询设备状态

{
  "action": "getStatus",
  "timestamp": "2024-01-01T12:00:00.000Z"
}
字段 类型 说明
action String 固定值 "getStatus"
timestamp String ISO 8601 时间戳(可选)

STM32 处理逻辑: 立即发送当前状态到 petfeeder/status 主题


四、配置参数下发

Topic: petfeeder/config 方向: 小程序 → STM32

数据格式

{
  "feedTimes": ["08:00", "18:00"],
  "singleFeedWeight": 50
}

字段说明

字段 类型 说明
feedTimes Array<String> 喂食时间点数组,格式 HH:MM最多2个时间点
singleFeedWeight Integer 单次喂食重量,单位:克

STM32 处理逻辑

  1. 解析 feedTimes 数组,提取时间点
  2. 存储到 RTC 或内部 Flash
  3. 设置 RTC 闹钟,在指定时间触发自动喂食
  4. 根据 singleFeedWeight 控制喂食量

示例代码STM32 C

// 解析配置数据
void handle_config(const char* payload) {
    // 使用 JSON 解析库(如 cJSON解析 payload
    // 提取 feedTimes 和 singleFeedWeight
    
    // 示例:存储喂食时间
    char time1[8] = {0};
    char time2[8] = {0};
    int weight = 50;
    
    // 解析 JSON使用 cJSON
    cJSON* root = cJSON_Parse(payload);
    cJSON* feedTimes = cJSON_GetObjectItem(root, "feedTimes");
    if (feedTimes && cJSON_IsArray(feedTimes)) {
        if (cJSON_GetArraySize(feedTimes) >= 1) {
            strcpy(time1, cJSON_GetArrayItem(feedTimes, 0)->valuestring);
        }
        if (cJSON_GetArraySize(feedTimes) >= 2) {
            strcpy(time2, cJSON_GetArrayItem(feedTimes, 1)->valuestring);
        }
    }
    
    cJSON* weightItem = cJSON_GetObjectItem(root, "singleFeedWeight");
    if (weightItem) {
        weight = weightItem->valueint;
    }
    
    // 设置 RTC 闹钟
    set_alarm(time1, weight);
    if (strlen(time2) > 0) {
        set_alarm(time2, weight);
    }
    
    cJSON_Delete(root);
}

五、STM32 MQTT 订阅列表

STM32 需要订阅以下主题以接收小程序指令:

主题 说明
petfeeder/control 接收控制指令
petfeeder/config 接收配置参数

六、通信流程示例

6.1 自动喂食流程

1. STM32 启动后连接 MQTT Broker
2. STM32 订阅 petfeeder/control 和 petfeeder/config
3. STM32 定时上报传感器数据到 petfeeder/sensor
4. RTC 闹钟触发时间到
5. STM32 自动喂食(投放 singleFeedWeight 克食物)
6. STM32 上报新的 foodWeight 到 petfeeder/sensor

6.2 手动喂食流程

1. 用户在小程序点击"喂食"按钮
2. 小程序发送控制指令到 petfeeder/control
3. STM32 收到 feed 指令
4. STM32 控制舵机投放指定重量的食物
5. STM32 更新 foodWeight 并上报到 petfeeder/sensor

6.3 模式切换流程

1. 用户在小程序切换模式开关
2. 小程序发送 setMode 指令到 petfeeder/control
3. STM32 收到指令,更新运行模式
4. STM32 发送新的 mode 状态到 petfeeder/status
5. 小程序更新界面显示

七、STM32 建议实现

7.1 定时任务

  • 传感器上报: 每 30 秒上报一次传感器数据
  • 心跳保持: 每 60 秒发送一次 MQTT PING
  • 状态检查: RTC 中断检查是否到达喂食时间

7.2 硬件接口

功能 硬件接口 说明
温度传感器 ADC/DHT22 温度采集
湿度传感器 ADC/DHT22 湿度采集
食物重量 ADC/称重模块 称重传感器
水位检测 GPIO/ADC 水位开关或浮子传感器
喂食执行 PWM/GPIO 舵机或步进电机
补水执行 GPIO 水泵控制
RTC 内部RTC/DS3231 实时时钟,用于定时喂食

7.3 JSON 解析库推荐

STM32 可使用以下 JSON 库:

  • cJSON: 轻量级,资源占用小
  • Jansson: 功能完整,稍大
  • ArduinoJson: 如果使用 Arduino 框架

八、调试建议

8.1 MQTT 测试工具

使用以下工具测试通信协议:

  • MQTTX: 跨平台 MQTT 客户端
  • mosquitto_pub/sub: 命令行工具

8.2 测试步骤

  1. STM32 上电后,用 MQTTX 订阅 petfeeder/sensor
  2. 检查传感器数据是否正确上报
  3. 用 MQTTX 发布测试消息到 petfeeder/control
  4. 验证 STM32 是否正确响应指令
  5. 打开小程序,测试完整功能

九、注意事项

  1. JSON 格式: 所有 MQTT 消息必须是有效的 JSON 格式
  2. 时间格式: timestamp 使用 ISO 8601 标准格式
  3. 错误处理: STM32 应校验接收到的 JSON 格式,避免解析错误
  4. 断线重连: MQTT 断线后自动重连,重连后重新上报状态
  5. 数据范围: 传感器数据应在合理范围内,避免异常值
  6. 喂食保护: 避免短时间内重复喂食,设置最小间隔(如 10 分钟)

十、版本历史

版本 日期 说明
v1.0 2024-02-10 初始版本

联系与反馈

如有问题或建议,请通过以下方式联系:

  • 项目地址: [项目 GitHub 链接]
  • Issue: [GitHub Issues]