基于STM32的变色龙养殖智能监控系统

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

一、引言

(一)研究背景及意义

变色龙作为一种对环境变化极度敏感的奇特宠物,其饲养难度远高于普通宠物。其对温度、湿度、光照、饮水及食物的要求极为苛刻,传统的人工饲养方式难以提供持续稳定且精准的照料,极易导致变色龙出现应激、拒食、脱水等健康问题,甚至死亡。变色龙的体色变化是其健康状况和环境适应性的“晴雨表”,但普通人难以准确解读。因此,开发一套集自动喂食、智能补水、环境监测与体色状态解析于一体的智能化养殖系统,具有重要的应用价值。本项目基于STM32单片机,通过传感器实时监控养殖环境,并创新性地引入颜色传感器解读变色龙的情绪与状态,通过蓝牙与手机App交互,旨在为变色龙提供一个稳定、安全、智能的生存环境,极大降低饲养难度,提升饲养乐趣和成功率。

(二)国内外研究现状

目前,智能宠物饲养设备多集中于猫、狗、鱼等常见宠物,如智能喂食器、智能鱼缸。针对爬行动物,尤其是变色龙这类对环境有特殊要求的物种,专业化、智能化的养殖设备几乎处于市场空白。现有研究大多集中于大型农场的环境监控,或功能单一的温湿度控制器。将精准定时喂食水位自动维持基于颜色的生物反馈相结合,并用于变色龙养殖,是一项创新性的探索。本研究旨在填补这一空白,提供一个高度定制化、自动化的智能养殖解决方案。

二、系统总体设计

(一)系统架构

本系统采用“环境感知-状态解读-智能执行-人工交互”的闭环控制架构。

  • 感知层:由DS1302、水位传感器、颜色传感器(如TCS34725)组成,负责采集时间、水位和变色龙体色数据。

  • 决策层:STM32主控制器,是系统的核心大脑。它处理传感器数据,运行核心逻辑(如定时判断、颜色解析),并生成控制指令。

  • 执行层:包括步进电机(模拟喂食)、水泵(加水)、加湿器(增湿)、蜂鸣器(报警),负责完成具体的物理操作。

  • 交互层:包括OLED显示屏、按键和蓝牙模块(如HC-05/HC-08),实现本地设置、状态显示以及与手机App的无线数据交互和控制。

(二)功能模块划分

  1. 定时与喂食模块:DS1302计时 + 步进电机执行。

  2. 供水模块:水位传感器 + 水泵。

  3. 状态监测与调节模块:颜色传感器 + 蜂鸣器 + 加湿器。

  4. 人机交互模块:OLED显示屏 + 按键。

  5. 通信模块:蓝牙模块。

三、硬件设计与实现

(一)系统硬件框架图

  • STM32F103C8T6 (主控核心)

  • DS1302时钟模块:RST接 PA4, DAT接 PA5, CLK接 PA6

  • 水位传感器(数字):DO引脚接 PA0

  • TCS34725颜色传感器(I2C):SCL接 PB6, SDA接 PB7

  • ULN2003驱动板 & 28BYJ-48步进电机(喂食):IN1-IN4接 PB8PB9PB10PB11

  • 继电器模块 x 2:分别接 PC13(水泵)、PC14(加湿器)

  • 蜂鸣器(有源):接 PA8

  • OLED (SSD1306) : I2C接口,与颜色传感器共享I2C总线(地址不同)

  • 按键 x 4:设置、加、减、确认/喂食 接至 PA1PA2PA3PA15

  • HC-05蓝牙模块:接USART2 PA2(TX), PA3(RX)

(二)主控模块选型及介绍

主控芯片选用STM32F103C8T6。其丰富的外设资源完美匹配本项目:

  • 多个GPIO:用于连接DS1302(模拟三线时序)、驱动继电器、蜂鸣器和按键。

  • I2C接口:同时挂载颜色传感器TCS34725和OLED显示屏,节省引脚。

  • UART接口:用于与蓝牙模块进行双向通信。

  • 充足的IO:用于控制步进电机驱动板的4个输入信号。

(三)传感器模块选型及电路设计

  1. DS1302时钟模块:提供精准的实时时钟,保证定时喂食的准确性。即使系统断电,靠后备电池也能继续走时。

  2. 水位传感器:选用数字输出型模块,当液位低于探头时,DO输出高电平;反之输出低电平。直接与STM32 GPIO连接。

  3. 颜色传感器TCS34725:一款高性能RGB颜色光数字转换器,可获取精确的R(红)、G(绿)、B(蓝)三原色值。通过I2C接口与STM通信,是解读变色龙体色的关键。

(四)通信模块选型及配置

选用HC-05主从一体蓝牙串口模块。配置流程简单:

  1. 进入AT命令模式(KEY引脚拉高),通过USB转TTL模块配置其参数(如名称、配对码)。

  2. 在正常工作中,STM32通过串口将数据以特定格式发送给HC-05,HC-05即将其无线传输至已连接的手机App。反之,App发送的指令也通过串口传递给STM32。无需复杂的网络协议,简单易用

(五)执行模块选型及驱动电路

  1. 步进电机:选用28BYJ-48(5V减速步进电机)模拟喂食器的旋转撒食动作。通过ULN2003驱动板进行驱动。

  2. 水泵与加湿器:均为220V设备,安全第一! 必须使用继电器模块进行隔离控制。STM32 GPIO输出低电平控制继电器吸合,从而接通水泵/加湿器的电源。

  3. 蜂鸣器:有源蜂鸣器,通过一个NPN三极管驱动,基极串联电阻后接STM32的PA8引脚。

(六)显示模块选型及接口电路

选用0.96寸I2C接口的OLED显示屏,用于显示当前时间、设定的喂食时间、水位状态、当前检测到的RGB颜色值及解读出的状态(稳定/不稳定/干燥)。

(七)电源模块设计

系统包含数字电路和继电器负载,采用双路隔离供电最为安全:

  • 一路5V电源:经AMS1117-3.3稳压后,为STM32、传感器、OLED、蓝牙模块供电。

  • 另一路5V电源:专门为ULN2003驱动板(步进电机)和继电器线圈供电。

  • 强烈警告:继电器输出侧控制的220V水泵和加湿器,必须与所有低压电路完全物理隔离,接线处做好绝缘,防止触电。

四、软件设计与实现

1. 定时喂食功能 (核心):

  • 利用DS1302获取精确时间。

  • 用户通过按键或APP设置每日喂食时间点(如08:00, 18:00)。

  • 当系统时间与预设时间匹配时,STM32控制步进电机旋转特定角度,推动喂食器工作,完成投食。

  • APP或按键手动控制:随时发送指令触发上述动作。

2. 自动供水功能:

  • STM32通过ADC读取水位传感器的值。

  • 设定一个低水位阈值

  • 当水位低于阈值时,STM32启动水泵抽水;当水位上升到安全高度后,自动关闭水泵。

3. 颜色分析与智能控制 (核心与创新点):

  • 颜色识别: STM32控制TCS3200传感器,分别读取红色(R)、绿色(G)、蓝色(B)分量的频率值。

  • 逻辑判断:

    • 红色主导 (情绪不稳定): if (R > G && R > B && R > Red_Threshold) -> 触发蜂鸣器报警,提醒主人关注。

    • 绿色主导 (情绪稳定): if (G > R && G > B) -> 系统状态正常,无需操作。

    • 蓝色主导 (环境干燥): if (B > R && B > G && B > Blue_Threshold) -> STM32自动启动加湿器,直到蓝色强度降至阈值以下。

  • 阈值校准: 需要针对实际养殖环境和变色龙种类进行RGB阈值的实验和校准。

4. 蓝牙通信与APP功能:

  • HC-05与STM32通过串口通信,使用自定义的简单协议

  • STM32 -> APP (上报数据): 以字符串或JSON格式持续发送时间、水位状态、当前RGB值、解读出的颜色状态(“稳定”、“不稳定”、“干燥”)。

  • APP -> STM32 (发送指令): APP可发送指令,如:

    • FEED_NOW: 立即喂食

    • SET_TIME:12:30:00: 设置时间

    • SET_FEED:08:00: 设置喂食时间点

5. 按键功能:

  • 用于本地设置DS1302的当前时间。

  • 设置每日喂食的时间点。

  • 手动强制喂食、开启/关闭水泵、开启/关闭加湿器。

系统软件流程图

(三)系统初始化(代码片段)

// main.c
#include "ds1302.h"
#include "tcs34725.h"
#include "stepper.h"
#include "ssd1306.h"
#include "bluetooth.h"

I2C_HandleTypeDef hi2c1;
UART_HandleTypeDef huart2; // For Bluetooth

int main(void) {
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_USART2_UART_Init();

  OLED_Init();
  DS1302_Init();
  TCS34725_Init();
  STEPPER_Init();

  // Load feeding time from EEPROM
  target_hour = ...;
  target_minute = ...;

  while (1) {
      Main_Task();
      HAL_Delay(1000); // 主循环周期1秒
  }
}

(四)传感器数据采集与处理(代码片段)

void Sensor_ReadTask(void) {
    // 1. 读取DS1302时间
    DS1302_GetTime(&current_hour, &current_minute, &current_second);

    // 2. 读取水位传感器 (数字输入)
    water_low = (HAL_GPIO_ReadPin(WATER_GPIO_Port, WATER_Pin) == GPIO_PIN_SET);

    // 3. 读取颜色传感器
    TCS34725_GetRawData(&r, &g, &b, &c); // c是 Clear通道值
    // 计算归一化的RGB值,消除光照强度影响
    float sum = r + g + b;
    r_norm = r / sum;
    g_norm = g / sum;
    b_norm = b / sum;
}

(五)控制功能实现(代码片段)

void Control_Task(void) {
    // 1. 水位控制 (优先级高)
    if (water_low) {
        HAL_GPIO_WritePin(PUMP_RELAY_GPIO_Port, PUMP_RELAY_Pin, GPIO_PIN_RESET); // 继电器ON
    } else {
        HAL_GPIO_WritePin(PUMP_RELAY_GPIO_Port, PUMP_RELAY_Pin, GPIO_PIN_SET); // 继电器OFF
    }

    // 2. 颜色状态解析与控制
    if (r_norm > 0.5 && r_norm > g_norm && r_norm > b_norm) { // 红色主导
        // 情绪不稳定
        Buzz_Enable(1); // 蜂鸣器报警
        current_status = STATUS_STRESSED;
    } else if (g_norm > 0.5 && g_norm > r_norm && g_norm > b_norm) { // 绿色主导
        // 情绪稳定
        Buzz_Enable(0);
        current_status = STATUS_NORMAL;
    } else if (b_norm > 0.4 && b_norm > r_norm) { // 蓝色主导 (阈值需实验校准)
        // 环境干燥
        HAL_GPIO_WritePin(HUMIDIFIER_RELAY_GPIO_Port, HUMIDIFIER_RELAY_Pin, GPIO_PIN_RESET); // 加湿器ON
        current_status = STATUS_DRY;
    } else {
        // 其他颜色或不确定状态
        Buzz_Enable(0);
        HAL_GPIO_WritePin(HUMIDIFIER_RELAY_GPIO_Port, HUMIDIFIER_RELAY_Pin, GPIO_PIN_SET); // 加湿器OFF
        current_status = STATUS_UNKNOWN;
    }

    // 3. 定时喂食
    if (current_hour == target_hour && current_minute == target_minute && current_second == 0) {
        Feed_Once(); // 执行一次喂食动作
    }
}

// 喂食函数
void Feed_Once(void) {
    STEPPER_Move(512, 1); // 步进电机正转一定角度,投下食物
    HAL_Delay(1000);
    // 可以正反转几次模拟撒食动作
    Bluetooth_Send("Feeding completed."); // 通过蓝牙发送喂食完成通知
}

(六)远程控制功能实现(代码片段)

// 蓝牙数据发送函数
void Bluetooth_SendStatus(void) {
    char buffer[64];
    sprintf(buffer, "T:%02d:%02d,S:%d,R:%d,G:%d,B:%d", current_hour, current_minute, current_status, (int)(r_norm*100), (int)(g_norm*100), (int)(b_norm*100));
    HAL_UART_Transmit(&huart2, (uint8_t*)buffer, strlen(buffer), 100);
}

// 蓝牙数据接收解析 (在串口中断回调函数中处理)
void USART2_IRQHandler(void) {
    HAL_UART_IRQHandler(&huart2);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    if (huart == &huart2) {
        if (strstr(bluetooth_rx_buffer, "FEED")) {
            Feed_Once(); // App发送"FEED"指令,手动喂食
        } else if (strstr(bluetooth_rx_buffer, "SET_TIME")) {
            // 解析指令中的时间参数并设置DS1302, 如 "SET_TIME 14:30"
            sscanf(bluetooth_rx_buffer, "SET_TIME %d:%d", &new_hour, &new_minute);
            DS1302_SetTime(new_hour, new_minute, 0);
        } // ... 其他指令
    }
}

五、系统测试与优化

(一)测试方案

  1. 功能测试

    • 喂食测试:设置不同的喂食时间,测试步进电机是否准时、准确动作。

    • 水位控制测试:将水位传感器从水中拿出再放入,测试水泵自动启停。

    • 颜色解析测试:使用不同颜色的色卡或物体模拟变色龙,测试系统是否能正确解析RGB并触发相应动作(蜂鸣器、加湿器)。

  2. 可靠性测试:连续运行72小时,观察系统是否稳定,有无误动作。

  3. 用户体验测试:测试蓝牙连接稳定性,App指令发送与接收是否及时可靠。

(二)测试结果与分析

预计测试结果:核心功能均可实现。测试难点与关键点在于:

  1. 颜色识别的准确性:环境光照会严重影响RGB原始值,必须采用归一化算法,并在实际饲养环境中进行大量测试和校准,以确定不同状态下的RGB阈值。

  2. 机械结构的可靠性:喂食机构的出食量需要精确设计,防止卡死或出食不均。

  3. 防误触发:喂食判断需加上“一天只触发一次”的逻辑,防止在临界时间点反复触发。

(三)系统优化

  1. 光照补偿:颜色识别算法需持续优化,可采用更先进的白平衡算法或机器学习模型进行模式识别,提高状态判断的准确率。

  2. 历史数据记录:在App端记录颜色变化、喂食时间、加湿时长等数据,绘制趋势图,帮助饲养者更好地了解宠物状态。

  3. 多参数融合决策:结合温湿度传感器数据,与颜色判断结果进行交叉验证,使系统决策更智能(例如,蓝色且湿度低才启动加湿)。

  4. 低功耗设计:如果采用电池供电,需优化系统,在无操作时进入休眠模式,由定时器或外部中断唤醒。

六、结论与展望

(一)未来展望

  1. 图像识别升级:将颜色传感器升级为微型摄像头,通过CNN卷积神经网络图像识别算法,不仅能识别颜色,还能识别变色龙的姿态、体型丰满度,更全面地评估其健康状况。

  2. 环境参数扩展:增加温湿度、UVB紫外线强度监测,自动控制加热灯、UVB灯的开关,实现全环境闭环控制。

  3. Web端管理平台:开发Web后台,通过Wi-Fi而非蓝牙连接,实现远程、多用户、多设备的集中化管理。

  4. 社群化App:开发功能丰富的App,集成饲养知识库、异常报警推送、饲养经验分享社群等功能,构建爬宠饲养爱好者社区。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殷忆枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值