基于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 完整代码

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. 初始化函数(System_Init
    初始化所有硬件模块,包括OLED显示、温湿度传感器、水位传感器、食物传感器、继电器模块、蓝牙和WiFi模块。
  2. 传感器数据读取(Read_Sensors
    通过调用各自的函数获取传感器数据。温湿度数据通过 SHT30_Read_Temperature_Humidity 获取,水位和食物数据分别通过 Water_Level_ReadFood_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
    从蓝牙接收控制命令,切换模式或执行操作(如加水、投喂)。
相关推荐
森焱森9 分钟前
水下航行器外形分类详解
c语言·单片机·算法·架构·无人机
小殷学长2 小时前
【单片机毕业设计17-基于stm32c8t6的智能倒车监测系统】
stm32·单片机·课程设计
TESmart碲视4 小时前
HKS201-M24 大师版 8K60Hz USB 3.0 适用于 2 台 PC 1台显示器 无缝切换 KVM 切换器
单片机·嵌入式硬件·物联网·游戏·计算机外设·电脑·智能硬件
花落已飘5 小时前
STM32中实现shell控制台(shell窗口输入实现)
stm32·单片机·嵌入式硬件
花落已飘5 小时前
STM32中实现shell控制台(命令解析实现)
stm32·shell
没有钱的钱仔6 小时前
STM32低功耗模式全面指南
css·stm32·css3
牵牛老人7 小时前
Qt处理USB摄像头开发说明与QtMultimedia与V4L2融合应用
stm32·单片机·qt
宇钶宇夕8 小时前
针对工业触摸屏维修的系统指南和资源获取途径
单片机·嵌入式硬件·自动化
和风化雨9 小时前
stm32的三种开发方式
stm32·单片机·嵌入式硬件
kanhao1009 小时前
三态逻辑详解:单片机GPIO、计算机总线系统举例
单片机·嵌入式硬件