基于STM32的智能鱼缸自动喂食系统设计

引言

本项目设计了一个基于STM32的智能鱼缸自动喂食系统,能够按照预设的时间间隔自动投放饲料,同时监测鱼缸内的水温和光照情况。该系统通过电机控制喂食器的旋转来实现饲料投放,用户还可以通过按键实现手动喂食。该项目展示了STM32在定时控制、传感器监测和电机驱动中的应用。

环境准备

1. 硬件设备
  • STM32F103C8T6 开发板(或其他 STM32 系列)
  • 步进电机(用于驱动饲料盒旋转)
  • 步进电机驱动模块(如 ULN2003)
  • DS18B20 水温传感器
  • 光敏电阻(用于检测光照强度)
  • 按键(用于手动喂食控制)
  • OLED 显示屏(用于显示状态)
  • 面包板和杜邦线
  • USB-TTL 串口调试工具
2. 软件工具
  • STM32CubeMX:用于初始化 STM32 外设。
  • Keil uVision 或 STM32CubeIDE:用于编写和下载代码。
  • ST-Link 驱动程序:用于下载程序到 STM32。

项目实现

1. 硬件连接
  • 步进电机连接:将步进电机的四个线圈引脚连接到 ULN2003 驱动模块的输入端,驱动模块的输出端连接 STM32 的 GPIO(如 PA0, PA1, PA2, PA3)。
  • 水温传感器连接:将 DS18B20 的数据引脚连接到 STM32 的 GPIO(如 PA4),并接一个4.7kΩ上拉电阻。
  • 光敏电阻连接:将光敏电阻的输出引脚连接到 STM32 的 ADC 引脚(如 PA5),用于检测光照强度。
  • 按键连接:将按键连接到 STM32 的 GPIO(如 PA6),用于手动触发喂食。
  • OLED 显示屏连接:将 OLED 的 SDA 和 SCL 引脚连接到 STM32 的 I2C 接口(如 PB6 和 PB7),用于显示水温、光照和系统状态。
2. STM32CubeMX 配置
  • 打开 STM32CubeMX,选择你的开发板型号。
  • 配置系统时钟为 HSI,确保系统稳定运行。
  • 配置 GPIO 引脚用于步进电机驱动和按键控制。
  • 配置 ADC 用于读取光敏电阻数据。
  • 配置 I2C 用于 OLED 显示屏通信。
  • 配置定时器用于定时喂食功能。
  • 生成代码,选择 Keil 或 STM32CubeIDE 作为工具链。
3. 编写主程序

在生成的项目基础上,编写水温监测、光照强度检测、定时喂食控制以及步进电机驱动的代码。以下是智能鱼缸自动喂食系统的基本代码示例:

#include "stm32f1xx_hal.h"
#include "ds18b20.h"
#include "oled.h"
#include "stepper.h"

// 喂食时间间隔(单位:秒)
#define FEED_INTERVAL 3600 // 每小时喂食一次

// 定义引脚
#define BUTTON_PIN GPIO_PIN_6
#define BUTTON_PORT GPIOA

// 函数声明
void Feed_Fish(void);
uint8_t Check_Button(void);
uint32_t Measure_LightIntensity(void);
void Display_Status(float temperature, uint32_t light_intensity, uint8_t feeding);
void System_Init(void);

// 初始化系统
void System_Init(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_ADC1_Init();
    MX_I2C1_Init();
    
    OLED_Init();
    Stepper_Init();
    DS18B20_Init();
    
    OLED_ShowString(0, 0, "Fish Feeder Ready");
}

// 鱼缸喂食
void Feed_Fish(void)
{
    OLED_ShowString(0, 1, "Feeding...");
    
    // 控制步进电机旋转一圈投放饲料
    Stepper_Step(2048);  // 步进电机旋转2048步,相当于一圈
    
    OLED_ShowString(0, 1, "Feeding Done ");
}

// 检查按键输入(手动喂食)
uint8_t Check_Button(void)
{
    return HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN) == GPIO_PIN_RESET;
}

// 读取光照强度
uint32_t Measure_LightIntensity(void)
{
    uint32_t light_value = 0;
    
    HAL_ADC_Start(&hadc1);
    if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK)
    {
        light_value = HAL_ADC_GetValue(&hadc1);
    }
    HAL_ADC_Stop(&hadc1);
    
    return light_value;
}

// 显示当前系统状态
void Display_Status(float temperature, uint32_t light_intensity, uint8_t feeding)
{
    OLED_Clear();
    OLED_ShowString(0, 0, "Temp:");
    OLED_ShowFloat(48, 0, temperature, 1);
    
    OLED_ShowString(0, 1, "Light:");
    OLED_ShowNumber(48, 1, light_intensity, 4);
    
    if (feeding)
    {
        OLED_ShowString(0, 2, "Feeding: Yes");
    }
    else
    {
        OLED_ShowString(0, 2, "Feeding: No ");
    }
}

int main(void)
{
    System_Init();
    
    uint32_t last_feed_time = 0;
    uint32_t current_time = 0;
    
    while (1)
    {
        // 读取当前时间
        current_time = HAL_GetTick();
        
        // 读取水温
        float temperature = DS18B20_ReadTemperature();
        
        // 读取光照强度
        uint32_t light_intensity = Measure_LightIntensity();
        
        // 显示当前系统状态
        Display_Status(temperature, light_intensity, 0);
        
        // 检查手动喂食按键
        if (Check_Button())
        {
            Feed_Fish();
        }
        
        // 定时自动喂食
        if (current_time - last_feed_time >= FEED_INTERVAL * 1000)
        {
            Feed_Fish();
            last_feed_time = current_time;
        }
        
        HAL_Delay(1000);  // 每秒更新一次状态
    }
}
4. 水温传感器读取

以下是 DS18B20 水温传感器的读取代码示例:

#include "ds18b20.h"

// 初始化 DS18B20
void DS18B20_Init(void)
{
    // 初始化 GPIO 和 DS18B20 引脚
}

// 读取水温
float DS18B20_ReadTemperature(void)
{
    float temperature = 0.0;
    
    // 模拟读取水温
    temperature = 26.5;  // 假设读取到26.5摄氏度
    
    return temperature;
}
5. 光照强度检测

使用光敏电阻读取环境光照强度:

#include "adc.h"

// 读取光照强度
uint32_t Measure_LightIntensity(void)
{
    uint32_t light_value = 0;
    
    HAL_ADC_Start(&hadc1);
    if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK)
    {
        light_value = HAL_ADC_GetValue(&hadc1);
    }
    HAL_ADC_Stop(&hadc1);
    
    return light_value;
}
6. 步进电机控制喂食器

步进电机控制喂食器旋转投放饲料:

#include "stepper.h"

// 初始化步进电机
void Stepper_Init(void)
{
    // GPIO 初始化和电机控制引脚配置
}

// 控制步进电机旋转
void Stepper_Step(uint16_t steps)
{
    // 控制步进电机按指定步数旋转
    for (uint16_t i = 0; i < steps; i++)
    {
        // 模拟步进电机每一步的控制
        HAL_Delay(2);  // 每一步延时
    }
}

⬇帮大家整理了单片机的资料

包括stm32的项目合集【源码+开发文档】

点击下方蓝字即可领取,感谢支持!⬇

点击领取更多嵌入式详细资料

问题讨论,stm32的资料领取可以私信!

7. 自动喂食系统工作原理
  • 定时喂食:系统通过内置的定时器,在预设的时间间隔内自动执行喂食操作,驱动步进电机旋转饲料盒。
  • 手动喂食:用户可以通过按键实现手动喂食功能,方便即时投放饲料。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值