基于STM32的智能宠物看护系统设计与实现

发布于:2025-09-09 ⋅ 阅读:(20) ⋅ 点赞:(0)

若该文为原创文章,转载请注明原文出处。

一、引言

随着现代生活节奏加快,宠物主人时常面临外出无法照料宠物的困境。传统的宠物喂养方式无法满足远程、精准、智能化的看护需求。本设计旨在开发一套基于STM32微控制器的智能宠物看护系统,通过集成多种传感器与执行器,实现对宠物生活环境(温湿度、光照)和生存资源(水、粮)的全天候自动监控与调节。系统核心在于通过WiFi接入物联网云平台(OneNet),使主人能够突破地理限制,通过手机APP远程查看宠物状态并进行手动干预,为爱宠提供一个舒适、安全的智能家居环境。

二、系统总体设计

(一)系统架构

系统采用“本地自动控制-云端远程监管”的双模式架构。

  1. 感知层:由DHT11(温湿度)、光敏电阻(光照强度)、水位传感器、称重传感器(余粮)组成,负责采集宠物环境数据。

  2. 控制层:以STM32F103C8T6为核心,处理传感器数据,执行自动控制逻辑,并管理通信。

  3. 执行层:包括继电器模块(控制风扇、加湿器、水泵)、LED灯、蜂鸣器,执行控制器指令。

  4. 交互层:包括按键,用于本地设置和模式切换。

  5. 云平台层:通过ESP8266 WiFi模块以MQTT协议接入中国移动OneNet平台,实现手机APP的远程监控与控制。

(二)功能模块划分

  1. 环境调控模块:温湿度自动/手动调节与光照自动调节。

  2. 资源供给模块:自动补水与缺粮报警。

  3. 通信模块:MQTT协议对接OneNet平台,实现数据上下行。

  4. 模式管理模块:自动模式与手动模式的切换与执行。

三、硬件设计与实现

(一)系统硬件框架图

系统硬件配置与功能说明表

1. 主控单元
器件名称 推荐型号 接口 功能说明
STM32单片机 STM32F103C8T6 - 作为系统核心,负责所有传感器的数据采集、逻辑判断、控制各执行器、以及与WiFi模块通信。
2. 传感器与输入单元
器件名称 推荐型号/类型 接口 功能说明
温湿度传感器 DHT11 单总线 采集宠物生活区域的环境温度和湿度。
水位传感器 水位检测模块 GPIO/ADC 检测饮水机的水位状态。通常使用高低电平输出型模块,缺水时输出低电平,STM32检测该电平状态即可判断是否缺水。
余粮传感器 超声波模块/压力传感器 GPIO/ADC 检测余粮状态。方案1(超声波):在粮仓顶部朝下测量距离,粮食越多距离越近;方案2(压力):粮食重量压在压力传感器上,重量越轻电压越小。最终由STM32判断是否缺粮。
光敏传感器 光敏电阻模块 ADC 检测环境光照强度。输出模拟电压,光线越强电压越高。STM32根据此值调节LED灯亮度。
按键模块 轻触开关 GPIO 用于设置温湿度阈值、切换自动/手动模式、手动控制LED灯开关。
3. 执行器与输出单元
器件名称 推荐型号/类型 接口 功能说明
风扇模块 5V DC风扇 GPIO/PWM 用于降温。STM32通过GPIO(配合三极管/MOS管驱动)或PWM信号控制其开关或转速。
加湿器模块 5V超声波雾化片 GPIO 用于增加湿度。STM32通过GPIO控制继电器模块来通断其电源(强电部分必须隔离!)。
水泵电机 小型直流水泵 GPIO/PWM 用于抽水。STM32通过GPIO(配合电机驱动模块,如L298N)控制其开关。
LED灯 高亮LED灯板 PWM 用于补光。STM32通过输出不同占空比的PWM信号来控制其亮度。
蜂鸣器 有源蜂鸣器 GPIO 用于缺粮报警。STM32控制其发出“嘀”声提醒主人。
4. 通信单元
器件名称 推荐型号 接口 功能说明
WiFi模块 ESP-01S UART 核心通信单元。STM32通过串口(UART)以AT指令的方式与ESP-01S通信,将采集到的所有状态数据以MQTT协议上传至OneNet云平台,并接收从云平台下发的手机APP控制指令。
5. 电源单元
器件名称 推荐规格 功能说明
电源适配器 5V/3A 开关电源 为整个控制系统(STM32、传感器、模块、小功率执行器)提供稳定的5V电源。注意: 加湿器等大功率220V设备必须通过继电器控制,与低压部分隔离。

核心控制逻辑说明

自动模式 (Auto_Mode = 1)
  1. 温控风扇

    • 条件: if (温度 > 温度阈值) { 启动风扇; } else { 关闭风扇; }

  2. 湿控加湿

    • 条件: if (湿度 < 湿度阈值) { 启动加湿器; } else { 关闭加湿器; }

  3. 自动补水

    • 条件: if (水位状态 == 缺水) { 启动水泵; } else { 关闭水泵; } (需注意防溢出的逻辑)

  4. 自动调光

    • 动作: LED亮度 = 最大亮度 - (当前光照强度 / 最大光照强度 * 最大亮度) // 光线越强,灯光越弱

  5. 缺粮报警

    • 条件: if (余粮状态 == 缺粮) { 启动蜂鸣器; } else { 关闭蜂鸣器; }

手动模式 (Auto_Mode = 0)
  • 本地手动: 可通过按键强制控制LED灯的开关。

  • 远程手动: 所有执行器(风扇、加湿器、水泵、LED灯)的开关状态完全接收来自手机APP通过OneNet云平台下发的指令。传感器数据仍正常上传。

关键设计注意事项

  1. 强弱电隔离: 加湿器通常是220V供电,必须使用继电器模块进行隔离控制,确保低压电路的安全。

  2. 水泵与水位逻辑: 水泵抽水时,需有机制防止溢出。例如,采用双水位传感器(低水位触发抽水,高水位触发停止)或设置最大抽水时间

  3. 数据上传策略: 为了节省网络资源,可以采用变化上传策略,即当数据变化超过一定范围或状态发生变化时再上传,而不是一味地高速轮询。

  4. OneNet平台配置: 需要在OneNet上创建产品和设备,定义好数据流模板(如:Temperature, Humidity, Water_Level)和命令(如:LED_Switch, Pump_Switch),才能使STM32与云平台正确通信。

  5. 功耗考虑: 如果采用电池供电,需考虑低功耗设计。但此系统需持续工作,建议直接使用电源适配器供电。

四、软件设计与实现

(一)开发环境搭建

  1. IDE:STM32CubeIDE。

  2. :使用HAL库。需自行添加DHT11、HX711、OneNet MQTT协议封装等驱动代码。

  3. 云平台:在中国移动OneNet平台创建产品和设备,获取设备ID和API Key等连接密钥。

(二)系统软件流程图

(三)代码片段(关键逻辑)

主循环核心逻辑与OneNet通信

// main.c
// 定义全局变量
SystemMode_t work_mode = MODE_AUTO; // 系统工作模式
DeviceState_t dev_state; // 设备状态结构体

while (1) {
  // 1. 读取传感器
  DHT11_ReadData(&dev_state.temperature, &dev_state.humidity);
  dev_state.light_val = Read_ADC(LIGHT_SENSOR_CHANNEL);
  dev_state.water_level = Read_ADC(WATER_SENSOR_CHANNEL);
  dev_state.food_weight = HX711_Read();

  // 2. 模式判断与执行
  if (work_mode == MODE_AUTO) {
      // 自动控制逻辑
      if (dev_state.temperature > temp_threshold) {
          TurnOn_Fan();
      } else {
          TurnOff_Fan();
      }
      // ... 同理判断湿度、水位、余粮
      // 光照控制:光线越强,LED越暗 (反向控制)
      uint16_t pwm_val = Map_LightToPWM(dev_state.light_val); // 映射函数
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pwm_val);
  }
  // 手动模式下,设备状态由APP指令直接控制,不执行自动逻辑

  // 3. 上传数据到OneNet (JSON格式)
  char json_buffer[256];
  sprintf(json_buffer,
          "{\"temp\":%.1f,\"humi\":%.1f,\"light\":%d,\"water\":%d,\"food\":%.1f,\"mode\":%d}",
          dev_state.temperature, dev_state.humidity, dev_state.light_val,
          dev_state.water_level, dev_state.food_weight, work_mode);
  ESP8266_MQTT_Publish("$dp", json_buffer); // 发布到OneNet

  // 4. 处理来自OneNet的下行指令 (在串口中断中接收并解析)
  if (rx_cmd_received) {
      Parse_OneNet_Command(rx_buffer); // 解析JSON,执行开关设备、切换模式等操作
      rx_cmd_received = 0;
  }

  // 5. 按键扫描
  Key_Scan(); // 用于切换模式、本地手动开关灯、设置阈值等
  HAL_Delay(3000); // 每3秒上传一次数据
}

OneNet下行指令解析函数示例

void Parse_OneNet_Command(char *json) {
  // 使用cJSON库解析JSON字符串
  cJSON *root = cJSON_Parse(json);
  cJSON *obj_mode = cJSON_GetObjectItem(root, "mode");
  cJSON *obj_led = cJSON_GetObjectItem(root, "led");

  if (obj_mode != NULL) {
      work_mode = obj_mode->valueint; // 切换手动/自动模式
  }
  if (obj_led != NULL && work_mode == MODE_MANUAL) {
      // 只有在手动模式下,才执行APP的开关指令
      if (obj_led->valueint == 1) {
          TurnOn_LED();
      } else {
          TurnOff_LED();
      }
  }
  // ... 同理解析风扇、加湿器、水泵的控制指令
  cJSON_Delete(root);
}

五、系统测试与优化

(一)测试方案

  1. 功能测试

    • 自动模式测试:用吹风机加热DHT11测试风扇启动;喷水加湿测试加湿器;降低水位测试水泵;遮挡光敏电阻测试LED亮度变化;减少重量测试缺粮报警。

    • 手动模式测试:在APP上点击各个设备开关按钮,测试响应是否正确。

    • 模式切换测试:测试按键和APP切换模式时,系统行为是否正确。

    • 通信测试:拔插网线模拟网络异常,测试系统重连和数据恢复能力。

  2. 性能与安全测试

    • 压力测试:模拟传感器数据频繁变化和大量APP指令,测试系统稳定性。

    • 安全测试:确保继电器控制高压设备的部分绝缘良好,无漏电风险。

优化方向

  • 本地日志存储:增加SPI Flash或EEPROM,存储历史操作和报警记录,网络恢复后上报。

  • 低功耗设计:在无事件发生时,让STM32和ESP8266进入睡眠模式,由定时器或中断唤醒。

  • OTA远程升级:通过OneNet平台实现STM32固件的远程无线升级。

  • 视频监控:增加ESP32-CAM模块,通过另一路串口将图像数据上传到云平台。

六、结论与展望

(一)未来展望

本系统成功设计了一个功能完备、实用性强的智能宠物看护系统原型,很好地解决了宠物独自在家的看护痛点。未来可向以下方向发展:

  1. AI行为分析:集成微型摄像头,利用边缘计算能力分析宠物行为(如是否焦虑、是否活跃),提供更深入的健康报告。

  2. 自动喂食器集成:将本系统与一个由舵机或电机控制的自动喂食器结合,实现远程定时、定量投喂。

  3. 多宠物识别与管理:通过RFID技术为不同宠物佩戴标签,实现精准的个体化管理(如按体重分配食物)。

  4. 语音交互:增加语音模块,让主人可以通过APP与宠物进行单向或双向的语音交流。

  5. 产品化与市场化:优化工业设计,将其打造成一款美观、安全、可靠的消费级产品。

如有侵权,或需要完整代码,请及时联系博主。


网站公告

今日签到

点亮在社区的每一天
去签到