基于STM32单片机设计的宠物喂食监控系统设计

举报
DS小龙哥 发表于 2024/12/25 15:17:30 2024/12/25
【摘要】 随着宠物数量的增加,尤其是人们对宠物的养护需求日益增多,传统的人工喂养和管理方式难以满足现代养宠生活的需求。人们越来越希望通过智能化手段提高宠物养护的质量和效率,特别是对于宠物喂食、饮水、温湿度控制等方面的智能化管理。

 

1. 项目开发背景

随着宠物数量的增加,尤其是人们对宠物的养护需求日益增多,传统的人工喂养和管理方式难以满足现代养宠生活的需求。人们越来越希望通过智能化手段提高宠物养护的质量和效率,特别是对于宠物喂食、饮水、温湿度控制等方面的智能化管理。

基于这一需求,设计并实现了一种基于STM32单片机的宠物喂食监控系统。该系统通过集成多种传感器,结合蓝牙无线通信和云物联网技术,实现了对宠物环境、饮水、喂食等多项功能的智能监控和管理。这不仅能提高宠物生活质量,还能为主人提供更便捷的管理方式。

image-20241225151156565

2. 设计实现的功能

本项目的目标是设计一款智能宠物喂食监控系统,具体功能包括:

  1. 1. 温湿度环境监控 采用温湿度传感器,实时采集当前环境的温湿度数据。当温度超过设定阈值时,自动开启风扇进行散热;当湿度超过设定阈值时,自动开启风扇进行空气除湿。
  2. 2. 水位检测与自动加水 采用水位传感器,检测宠物水盆的水位情况。当水位低于设定阈值时,自动开启水泵进行加水,保障宠物水量充足。
  3. 3. 食物检测与自动投喂 采用红外传感器,实时检测宠物食物盆中的食物量。当食物不足时,自动开启继电器控制投喂装置进行喂食。
  4. 4. 手动模式与智能模式切换 提供7个按键进行手动模式与智能模式的切换,允许用户手动控制喂食、喂水、散热、除湿等功能,同时可以设置温湿度阈值。
  5. 5. OLED液晶显示 系统通过OLED显示屏实时显示采集到的环境数据,包括当前的温湿度、设定的温湿度阈值、水位、食物量、控制模式等信息。
  6. 6. 蓝牙无线控制 采用HC-05蓝牙模块实现与手机APP的无线通信,通过手机APP显示当前环境状态并支持远程控制,如模式切换、温湿度阈值设置、喂食、喂水、散热、除湿等操作。
  7. 7. 数据上云与可视化管理 系统支持将数据通过WIFI模块上传至华为云物联网平台,采用MQTT协议进行数据传输。用户可以通过可视化网页查看历史数据、实时监控宠物的状态,并远程控制系统。
  8. 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. 1. 传感器数据采集 使用温湿度传感器、红外传感器和水位传感器采集环境数据、食物量和水量。
  2. 2. 数据处理与控制决策 STM32单片机根据采集到的实时数据,进行处理和判断,是否满足自动控制的条件(如温湿度过高、水位不足、食物不足等),然后通过继电器控制设备的启停。
  3. 3. 用户交互与模式切换 通过按键电路提供用户手动模式的操作,允许用户设置阈值和直接控制设备。用户也可以通过手机APP与系统进行无线通信,控制和查看宠物状态。
  4. 4. 显示与反馈 使用OLED显示模块实时反馈当前环境的温湿度、水位、食物量等信息,让用户能够直观地了解宠物的状态。
  5. 5. 数据上云与远程监控 系统通过ESP8266模块连接WIFI,并将数据上传至华为云物联网平台。用户可以通过PC端或手机端的网页实时查看宠物的状态、历史数据,并进行远程控制。
  6. 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(&current_temp, &current_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. 1. 初始化函数(System_Init 初始化所有硬件模块,包括OLED显示、温湿度传感器、水位传感器、食物传感器、继电器模块、蓝牙和WiFi模块。
  2. 2. 传感器数据读取(Read_Sensors 通过调用各自的函数获取传感器数据。温湿度数据通过 SHT30_Read_Temperature_Humidity 获取,水位和食物数据分别通过 Water_Level_Read  Food_Level_Read 获取。
  3. 3. 自动模式处理(Handle_Auto_Mode 根据当前的传感器数据,自动判断是否需要开启风扇(散热或去湿),是否需要加水和投食。
  4. 4. 手动模式处理(Handle_Manual_Mode 在手动模式下,允许用户通过按键设置温湿度阈值,并通过蓝牙控制手动加水、喂食等操作。
  5. 5. 风扇控制(Control_Fans 如果温度超过设定阈值或湿度超过阈值,开启风扇;否则,关闭风扇。
  6. 6. 水泵控制(Control_Water_Pump 如果水位低于设定阈值,开启水泵加水。
  7. 7. 食物投喂控制(Control_Food_Dispenser 如果食物量不足,启动继电器进行食物投喂。
  8. 8. OLED显示更新(Update_Display 将温湿度、水位、食物量和当前模式等信息显示在OLED屏上。
  9. 9. 蓝牙控制(Bluetooth_Control 从蓝牙接收控制命令,切换模式或执行操作(如加水、投喂)。

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。