基于STM32单片机设计的宠物喂食监控系统设计
1. 项目开发背景
随着宠物数量的增加,尤其是人们对宠物的养护需求日益增多,传统的人工喂养和管理方式难以满足现代养宠生活的需求。人们越来越希望通过智能化手段提高宠物养护的质量和效率,特别是对于宠物喂食、饮水、温湿度控制等方面的智能化管理。
基于这一需求,设计并实现了一种基于STM32单片机的宠物喂食监控系统。该系统通过集成多种传感器,结合蓝牙无线通信和云物联网技术,实现了对宠物环境、饮水、喂食等多项功能的智能监控和管理。这不仅能提高宠物生活质量,还能为主人提供更便捷的管理方式。
2. 设计实现的功能
本项目的目标是设计一款智能宠物喂食监控系统,具体功能包括:
- 1. 温湿度环境监控 采用温湿度传感器,实时采集当前环境的温湿度数据。当温度超过设定阈值时,自动开启风扇进行散热;当湿度超过设定阈值时,自动开启风扇进行空气除湿。
- 2. 水位检测与自动加水 采用水位传感器,检测宠物水盆的水位情况。当水位低于设定阈值时,自动开启水泵进行加水,保障宠物水量充足。
- 3. 食物检测与自动投喂 采用红外传感器,实时检测宠物食物盆中的食物量。当食物不足时,自动开启继电器控制投喂装置进行喂食。
- 4. 手动模式与智能模式切换 提供7个按键进行手动模式与智能模式的切换,允许用户手动控制喂食、喂水、散热、除湿等功能,同时可以设置温湿度阈值。
- 5. OLED液晶显示 系统通过OLED显示屏实时显示采集到的环境数据,包括当前的温湿度、设定的温湿度阈值、水位、食物量、控制模式等信息。
- 6. 蓝牙无线控制 采用HC-05蓝牙模块实现与手机APP的无线通信,通过手机APP显示当前环境状态并支持远程控制,如模式切换、温湿度阈值设置、喂食、喂水、散热、除湿等操作。
- 7. 数据上云与可视化管理 系统支持将数据通过WIFI模块上传至华为云物联网平台,采用MQTT协议进行数据传输。用户可以通过可视化网页查看历史数据、实时监控宠物的状态,并远程控制系统。
- 8. 服务器与前端展示 采用Python作为后端服务器,接收华为云物联网平台的数据,并通过HTML前端页面展示。支持局域网或公网访问,用户可以在任何地方查看宠物状态并进行操作。
3. 项目硬件模块组成
本系统的硬件部分基于STM32单片机进行设计,主要包含以下模块:
3.1. 核心控制单元:STM32单片机
- • 型号:STM32F103RCT6
- • 功能:作为整个系统的核心控制单元,负责接收传感器数据、控制设备、进行数据传输与无线通信。
3.2. 温湿度传感器(SHT30)
- • 功能:用于实时监测环境的温度和湿度,当温湿度超过设定阈值时,控制风扇启停以调整环境。
3.3. 水位传感器
- • 功能:检测宠物水盆中的水位情况,当水位低于设定阈值时,自动开启水泵进行加水。
3.4. 红外传感器
- • 功能:用于检测宠物食物盆中的食物量,当食物不足时,自动启动继电器进行食物投喂。
3.5. 风扇与水泵控制模块
- • 功能:风扇和水泵的控制电路,通过继电器控制风扇、泵和喂食装置的启停。
3.6. 蓝牙模块(HC-05)
- • 功能:实现与手机APP的无线通信,允许用户通过蓝牙进行远程控制和数据查看。
3.7. OLED显示模块
- • 功能:用于实时显示环境数据,包括温湿度、设定阈值、水位、食物量等信息。
3.8. 继电器模块
- • 功能:控制喂食装置、电动水泵和风扇的启停。
3.9. 无线网络模块(ESP8266)
- • 功能:用于将数据上传至华为云物联网平台,实现数据存储和历史数据分析。
3.10. 电源模块
- • 功能:为系统提供稳定的电源供应,保证各模块正常运行。
4. 设计思路
本项目的设计思路可以概括为以下几个步骤:
- 1. 传感器数据采集 使用温湿度传感器、红外传感器和水位传感器采集环境数据、食物量和水量。
- 2. 数据处理与控制决策 STM32单片机根据采集到的实时数据,进行处理和判断,是否满足自动控制的条件(如温湿度过高、水位不足、食物不足等),然后通过继电器控制设备的启停。
- 3. 用户交互与模式切换 通过按键电路提供用户手动模式的操作,允许用户设置阈值和直接控制设备。用户也可以通过手机APP与系统进行无线通信,控制和查看宠物状态。
- 4. 显示与反馈 使用OLED显示模块实时反馈当前环境的温湿度、水位、食物量等信息,让用户能够直观地了解宠物的状态。
- 5. 数据上云与远程监控 系统通过ESP8266模块连接WIFI,并将数据上传至华为云物联网平台。用户可以通过PC端或手机端的网页实时查看宠物的状态、历史数据,并进行远程控制。
- 6. 网页展示与控制 后端Python服务器通过API接口拉取华为云物联网平台的数据,将其展示在前端网页上,支持用户通过网页进行远程监控与控制。
5. 系统功能总结
功能模块 | 功能描述 | 实现方式 |
温湿度环境监控 | 实时采集环境温湿度,当温湿度超过阈值时自动启动风扇和除湿 | SHT30传感器、继电器模块控制风扇 |
水位检测与自动加水 | 检测水盆水位,低于设定值时自动启动水泵加水 | 水位传感器、继电器模块控制水泵 |
食物检测与自动投喂 | 检测食物盆中食物量,低于设定值时自动投喂食物 | 红外传感器、继电器模块控制投喂装置 |
手动模式与智能模式切换 | 用户可手动设置阈值或切换模式,系统根据数据自动控制设备 | 7个按键电路、STM32控制逻辑 |
OLED显示功能 | 显示环境数据、设备状态、控制模式等信息 | OLED显示模块 |
蓝牙无线控制 | 通过手机APP无线控制温湿度阈值、喂食、喂水等操作 | HC-05蓝牙模块、手机APP |
数据上云与可视化管理 | 将实时数据上传至华为云,支持历史数据查看和远程控制 | ESP8266、华为云物联网平台、MQTT协议 |
前端网页展示与控制 | 通过网页展示宠物状态,并允许用户远程控制 | Python后端、HTML前端、API接口 |
6. 使用的模块技术详情介绍
6.1. STM32F103RCT6
STM32F103RCT6是STM32系列中一款基于ARM Cortex-M3核心的32位单片机,具有较强的处理能力和丰富的外设接口,适合嵌入式应用。该单片机具有高达72MHz的主频,支持多种通信接口(如USART、SPI、I2C等),广泛应用于物联网、自动化控制等领域。
6.2 SHT30温湿度传感器
SHT30是一款高精度的温湿度传感器,具有较高的测量精度和稳定性,适用于对温湿度要求较高的应用场景。通过I2C接口与STM32单片机进行通信,能够实时获取环境温湿度数据。
6.3. HC-05蓝牙模块
HC-05是一款常用的蓝牙串口模块,通过串口通信与STM32单片机连接,提供无线通信能力。用户通过手机APP与系统进行蓝牙连接,能够实现远程控制和数据查看。
6.4. ESP8266 WiFi模块
ESP8266是一款低成本、低功耗的WiFi模块,支持与STM32单片机进行串口通信,能够将采集到的数据通过WIFI上传至云端。该模块支持MQTT协议,用于物联网设备之间的数据传输。
6.5. OLED显示屏
OLED显示屏是一种广泛应用的显示模块,具有高对比度、广视角和低功耗的特点。在本系统中,OLED显示屏用于实时显示温湿度、水位、食物量等信息。
7. 总结
基于STM32单片机设计的宠物喂食监控系统通过集成多种传感器、无线通信技术和云物联网平台,实现了对宠物生活环境的全面监控和管理。系统具有智能自动模式和手动模式两种操作方式,用户通过手机APP可以随时远程控制系统,并且能够实时查看宠物状态。通过将数据上传至华为云物联网平台,本系统还支持历史数据的查看和分析,进一步提升了宠物管理的智能化程度。
在今后的工作中,系统可以进一步优化传感器的精度和控制策略,增加更多的智能功能,如智能预警、自动喂食计划等,进一步提高系统的智能化水平和实用性。
8. STM32代码设计
以下是一个基本的 main.c
文件。此文件包括了系统初始化、各个模块的调用,以及手动模式和智能模式的切换。代码中已经使用了 STM32 HAL 库。
main.c
完整代码
#include "main.h"
#include "stm32f1xx_hal.h"
#include "sht30.h" // 温湿度传感器库
#include "oled.h" // OLED显示库
#include "water_level.h" // 水位传感器库
#include "food_level.h" // 食物红外传感器库
#include "relay_control.h"// 继电器控制库
#include "bluetooth.h" // 蓝牙控制库
#include "wifi.h" // WiFi上传库
// 定义阈值
#define TEMP_THRESHOLD_HIGH 30 // 温度上限 (30°C)
#define TEMP_THRESHOLD_LOW 20 // 温度下限 (20°C)
#define HUM_THRESHOLD_HIGH 70 // 湿度上限 (70%)
#define HUM_THRESHOLD_LOW 40 // 湿度下限 (40%)
#define WATER_LEVEL_THRESHOLD 30 // 水位下限(单位:%)
#define FOOD_LEVEL_THRESHOLD 10 // 食物下限(单位:%)
// 定义系统模式
#define MODE_MANUAL 0
#define MODE_AUTO 1
// 全局变量
uint8_t system_mode = MODE_AUTO; // 初始为自动模式
float current_temp, current_hum; // 当前温湿度
int water_level, food_level; // 当前水位和食物量
uint8_t temp_threshold_high = TEMP_THRESHOLD_HIGH;
uint8_t temp_threshold_low = TEMP_THRESHOLD_LOW;
uint8_t hum_threshold_high = HUM_THRESHOLD_HIGH;
uint8_t hum_threshold_low = HUM_THRESHOLD_LOW;
// 函数声明
void System_Init(void);
void Read_Sensors(void);
void Handle_Auto_Mode(void);
void Handle_Manual_Mode(void);
void Update_Display(void);
void Control_Fans(void);
void Control_Water_Pump(void);
void Control_Food_Dispenser(void);
int main(void)
{
// 系统初始化
HAL_Init();
System_Init();
// 主循环
while (1)
{
// 读取传感器数据
Read_Sensors();
// 根据当前模式执行相应的操作
if (system_mode == MODE_AUTO) {
Handle_Auto_Mode();
} else if (system_mode == MODE_MANUAL) {
Handle_Manual_Mode();
}
// 更新OLED显示
Update_Display();
}
}
void System_Init(void)
{
// 初始化硬件外设
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); // 初始化GPIO
OLED_Init(); // 初始化OLED显示
SHT30_Init(); // 初始化温湿度传感器
Water_Level_Init(); // 初始化水位传感器
Food_Level_Init(); // 初始化食物传感器
Relay_Init(); // 初始化继电器控制
Bluetooth_Init(); // 初始化蓝牙模块
Wifi_Init(); // 初始化WiFi模块
}
void Read_Sensors(void)
{
// 读取温湿度传感器
SHT30_Read_Temperature_Humidity(¤t_temp, ¤t_hum);
// 读取水位传感器
water_level = Water_Level_Read();
// 读取食物量传感器
food_level = Food_Level_Read();
}
void Handle_Auto_Mode(void)
{
// 根据温湿度自动控制风扇和除湿
Control_Fans();
// 根据水位自动控制加水
if (water_level < WATER_LEVEL_THRESHOLD) {
Control_Water_Pump();
}
// 根据食物量自动控制投喂
if (food_level < FOOD_LEVEL_THRESHOLD) {
Control_Food_Dispenser();
}
}
void Handle_Manual_Mode(void)
{
// 手动控制模式下,蓝牙控制命令判断
Bluetooth_Control();
// 用户通过按键手动调整温湿度阈值
if (Button_Pressed(UP_TEMP_BTN)) {
temp_threshold_high += 1; // 增加温度阈值
}
if (Button_Pressed(DOWN_TEMP_BTN)) {
temp_threshold_high -= 1; // 减少温度阈值
}
if (Button_Pressed(UP_HUM_BTN)) {
hum_threshold_high += 5; // 增加湿度阈值
}
if (Button_Pressed(DOWN_HUM_BTN)) {
hum_threshold_high -= 5; // 减少湿度阈值
}
// 手动控制加水和喂食
if (Button_Pressed(WATER_BTN)) {
Control_Water_Pump();
}
if (Button_Pressed(FEED_BTN)) {
Control_Food_Dispenser();
}
}
void Control_Fans(void)
{
// 控制温湿度风扇
if (current_temp > temp_threshold_high || current_hum > hum_threshold_high) {
Relay_On(FAN_RELAY);
} else if (current_temp < temp_threshold_low && current_hum < hum_threshold_low) {
Relay_Off(FAN_RELAY);
}
}
void Control_Water_Pump(void)
{
// 控制水泵
Relay_On(WATER_PUMP_RELAY);
HAL_Delay(3000); // 延时3秒钟加水
Relay_Off(WATER_PUMP_RELAY);
}
void Control_Food_Dispenser(void)
{
// 控制食物投喂
Relay_On(FEED_RELAY);
HAL_Delay(2000); // 延时2秒钟投喂
Relay_Off(FEED_RELAY);
}
void Update_Display(void)
{
// 更新OLED显示屏,显示传感器数据和系统状态
OLED_Clear();
OLED_Display_String(0, 0, "Temp: %.1f C", current_temp);
OLED_Display_String(0, 1, "Humidity: %.1f %%", current_hum);
OLED_Display_String(0, 2, "Water: %d %%", water_level);
OLED_Display_String(0, 3, "Food: %d %%", food_level);
if (system_mode == MODE_AUTO) {
OLED_Display_String(0, 4, "Mode: Auto");
} else {
OLED_Display_String(0, 4, "Mode: Manual");
}
}
void Bluetooth_Control(void)
{
// 读取蓝牙指令并处理
uint8_t command = Bluetooth_Read_Command();
if (command == 'M') {
system_mode = MODE_MANUAL; // 切换到手动模式
} else if (command == 'A') {
system_mode = MODE_AUTO; // 切换到自动模式
} else if (command == 'W') {
Control_Water_Pump(); // 手动加水
} else if (command == 'F') {
Control_Food_Dispenser(); // 手动投喂
}
}
代码解释
- 1. 初始化函数(
System_Init
) 初始化所有硬件模块,包括OLED显示、温湿度传感器、水位传感器、食物传感器、继电器模块、蓝牙和WiFi模块。 - 2. 传感器数据读取(
Read_Sensors
) 通过调用各自的函数获取传感器数据。温湿度数据通过SHT30_Read_Temperature_Humidity
获取,水位和食物数据分别通过Water_Level_Read
和Food_Level_Read
获取。 - 3. 自动模式处理(
Handle_Auto_Mode
) 根据当前的传感器数据,自动判断是否需要开启风扇(散热或去湿),是否需要加水和投食。 - 4. 手动模式处理(
Handle_Manual_Mode
) 在手动模式下,允许用户通过按键设置温湿度阈值,并通过蓝牙控制手动加水、喂食等操作。 - 5. 风扇控制(
Control_Fans
) 如果温度超过设定阈值或湿度超过阈值,开启风扇;否则,关闭风扇。 - 6. 水泵控制(
Control_Water_Pump
) 如果水位低于设定阈值,开启水泵加水。 - 7. 食物投喂控制(
Control_Food_Dispenser
) 如果食物量不足,启动继电器进行食物投喂。 - 8. OLED显示更新(
Update_Display
) 将温湿度、水位、食物量和当前模式等信息显示在OLED屏上。 - 9. 蓝牙控制(
Bluetooth_Control
) 从蓝牙接收控制命令,切换模式或执行操作(如加水、投喂)。
- 点赞
- 收藏
- 关注作者
评论(0)