若该文为原创文章,转载请注明原文出处。
一、引言
随着现代生活节奏加快,宠物主人时常面临外出无法照料宠物的困境。传统的宠物喂养方式无法满足远程、精准、智能化的看护需求。本设计旨在开发一套基于STM32微控制器的智能宠物看护系统,通过集成多种传感器与执行器,实现对宠物生活环境(温湿度、光照)和生存资源(水、粮)的全天候自动监控与调节。系统核心在于通过WiFi接入物联网云平台(OneNet),使主人能够突破地理限制,通过手机APP远程查看宠物状态并进行手动干预,为爱宠提供一个舒适、安全的智能家居环境。
二、系统总体设计
(一)系统架构
系统采用“本地自动控制-云端远程监管”的双模式架构。
感知层:由DHT11(温湿度)、光敏电阻(光照强度)、水位传感器、称重传感器(余粮)组成,负责采集宠物环境数据。
控制层:以STM32F103C8T6为核心,处理传感器数据,执行自动控制逻辑,并管理通信。
执行层:包括继电器模块(控制风扇、加湿器、水泵)、LED灯、蜂鸣器,执行控制器指令。
交互层:包括按键,用于本地设置和模式切换。
云平台层:通过ESP8266 WiFi模块以MQTT协议接入中国移动OneNet平台,实现手机APP的远程监控与控制。
(二)功能模块划分
环境调控模块:温湿度自动/手动调节与光照自动调节。
资源供给模块:自动补水与缺粮报警。
通信模块:MQTT协议对接OneNet平台,实现数据上下行。
模式管理模块:自动模式与手动模式的切换与执行。
三、硬件设计与实现
(一)系统硬件框架图
系统硬件配置与功能说明表
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
)
温控风扇:
条件:
if (温度 > 温度阈值) { 启动风扇; } else { 关闭风扇; }
湿控加湿:
条件:
if (湿度 < 湿度阈值) { 启动加湿器; } else { 关闭加湿器; }
自动补水:
条件:
if (水位状态 == 缺水) { 启动水泵; } else { 关闭水泵; }
(需注意防溢出的逻辑)
自动调光:
动作:
LED亮度 = 最大亮度 - (当前光照强度 / 最大光照强度 * 最大亮度)
// 光线越强,灯光越弱
缺粮报警:
条件:
if (余粮状态 == 缺粮) { 启动蜂鸣器; } else { 关闭蜂鸣器; }
手动模式 (Auto_Mode = 0
)
本地手动: 可通过按键强制控制LED灯的开关。
远程手动: 所有执行器(风扇、加湿器、水泵、LED灯)的开关状态完全接收来自手机APP通过OneNet云平台下发的指令。传感器数据仍正常上传。
关键设计注意事项
强弱电隔离: 加湿器通常是220V供电,必须使用继电器模块进行隔离控制,确保低压电路的安全。
水泵与水位逻辑: 水泵抽水时,需有机制防止溢出。例如,采用双水位传感器(低水位触发抽水,高水位触发停止)或设置最大抽水时间。
数据上传策略: 为了节省网络资源,可以采用变化上传策略,即当数据变化超过一定范围或状态发生变化时再上传,而不是一味地高速轮询。
OneNet平台配置: 需要在OneNet上创建产品和设备,定义好数据流模板(如:Temperature, Humidity, Water_Level)和命令(如:LED_Switch, Pump_Switch),才能使STM32与云平台正确通信。
功耗考虑: 如果采用电池供电,需考虑低功耗设计。但此系统需持续工作,建议直接使用电源适配器供电。
四、软件设计与实现
(一)开发环境搭建
IDE:STM32CubeIDE。
库:使用HAL库。需自行添加DHT11、HX711、OneNet MQTT协议封装等驱动代码。
云平台:在中国移动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);
}
五、系统测试与优化
(一)测试方案
功能测试:
自动模式测试:用吹风机加热DHT11测试风扇启动;喷水加湿测试加湿器;降低水位测试水泵;遮挡光敏电阻测试LED亮度变化;减少重量测试缺粮报警。
手动模式测试:在APP上点击各个设备开关按钮,测试响应是否正确。
模式切换测试:测试按键和APP切换模式时,系统行为是否正确。
通信测试:拔插网线模拟网络异常,测试系统重连和数据恢复能力。
性能与安全测试:
压力测试:模拟传感器数据频繁变化和大量APP指令,测试系统稳定性。
安全测试:确保继电器控制高压设备的部分绝缘良好,无漏电风险。
优化方向:
本地日志存储:增加SPI Flash或EEPROM,存储历史操作和报警记录,网络恢复后上报。
低功耗设计:在无事件发生时,让STM32和ESP8266进入睡眠模式,由定时器或中断唤醒。
OTA远程升级:通过OneNet平台实现STM32固件的远程无线升级。
视频监控:增加ESP32-CAM模块,通过另一路串口将图像数据上传到云平台。
六、结论与展望
(一)未来展望
本系统成功设计了一个功能完备、实用性强的智能宠物看护系统原型,很好地解决了宠物独自在家的看护痛点。未来可向以下方向发展:
AI行为分析:集成微型摄像头,利用边缘计算能力分析宠物行为(如是否焦虑、是否活跃),提供更深入的健康报告。
自动喂食器集成:将本系统与一个由舵机或电机控制的自动喂食器结合,实现远程定时、定量投喂。
多宠物识别与管理:通过RFID技术为不同宠物佩戴标签,实现精准的个体化管理(如按体重分配食物)。
语音交互:增加语音模块,让主人可以通过APP与宠物进行单向或双向的语音交流。
产品化与市场化:优化工业设计,将其打造成一款美观、安全、可靠的消费级产品。
如有侵权,或需要完整代码,请及时联系博主。