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

news2024/10/9 3:38:04

引言

本项目设计了一个基于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. 自动喂食系统工作原理
  • 定时喂食:系统通过内置的定时器,在预设的时间间隔内自动执行喂食操作,驱动步进电机旋转饲料盒。
  • 手动喂食:用户可以通过按键实现手动喂食功能,方便即时投放饲料。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2197864.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Validation —— 参数校验框架

案例说明——后端校验注册表单字段 在编写注册功能时&#xff0c;需要考虑字段校验的情况&#xff0c;这时候可以采用 Spring提供的一套参数校验框架工具——Spring Validation。一下是使用的步骤&#xff1a; 1. 导入validation坐标 2. 在参数上添加 Pattern注解&#xff0c…

单细胞|Signac 进行 Motif 分析

单细胞|Signac 进行 Motif 分析 引言 本教程将指导您如何在Signac平台上进行DNA序列的基序(Motif)分析。会介绍两种基序分析的方法&#xff1a;一种是在一组差异可访问的峰值中寻找出现频率较高的基序&#xff1b;另一种是在不同细胞群组间进行基序活性的差异分析。 library(Si…

simpread-OpenAI推出Canvas:让ChatGPT成为更出色的项目协作者

引言 OpenAI在最新一轮融资中创下了VC融资历史上的记录&#xff0c;与此同时&#xff0c;他们也推出了一项令人瞩目的新功能——Canvas。Canvas是一个专门为项目协作设计的界面&#xff0c;旨在让ChatGPT成为更高效的项目协作者。在现有的ChatGPT应用之外&#xff0c;它打开了…

LC538 - 把二叉搜索树转换为累加树

文章目录 1 题目2 思路3 ACM模式参考 1 题目 https://leetcode.cn/problems/convert-bst-to-greater-tree/description/ 给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09; 累加树&#…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-08

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07目录1. GraphRouter: A Graph-based Router for LLM Selections摘要创新点算法模型实验效果结论推荐阅读指数 2. DOTS: Learni…

2024年诺贝尔物理学奖授予AI先驱 Hopfield 和Hinton,奖金1100万瑞典克朗,他们是ChatGPT的忠实用户

2024年诺贝尔物理学奖得主&#xff1a;AI领域的杰出科学家 获奖者 2024年诺贝尔物理学奖的获奖者是两位在人工智能&#xff08;AI&#xff09;尤其是机器学习技术方面做出杰出贡献的科学家&#xff1a;约翰霍普菲尔德和杰弗里欣顿。 瑞典皇家科学院在周二宣布&#xff0c;这两…

Shamiko模块:隐藏root

开启Zygisk 在安装Shamiko模块之前&#xff0c;需要使用面具开启Zygisk&#xff0c;在面具的设置里可以开启&#xff0c;开启后重启手机Zygisk生效。 开启后的样子 开启面具随机报名 在面具的设置里&#xff0c;找到“隐藏Magisk应用”&#xff0c;点击这个选项&#xff0…

ESP8266使用AT指令完成MQTT功能

ESP8266使用AT指令完成MQTT功能 在esp8266设备中烧录安信可的AT固件之后&#xff0c;进行AT指令完成信息发布&#xff0c;并最终实现在Homeassistant中发布传感器并设置传感器状态。 一、基础指令 以下是完整的步骤和对应的AT指令&#xff1a; 1. 配置ESP8266为Station模式 …

在线培训知识库管理系统:企业的明智之选

在当今这个快速变化的时代&#xff0c;企业之间的竞争日益激烈&#xff0c;知识更新速度之快前所未有。为了保持竞争力&#xff0c;企业不仅需要不断引入新技术、新方法&#xff0c;还需要确保员工能够及时掌握这些新知&#xff0c;将其转化为生产力。在此背景下&#xff0c;在…

codetop标签双指针题目大全解析(四),双指针刷穿地心!!!!!

复习复习复习&#xff01;&#xff01; 1.长度最小的子数组2.移动零3.盛水最多的容器4.旋转链表5.最接近的三数之和6.删除有序数组中的重复项7.返回倒数第k个节点的值8.四数之和9.验证回文串 1.长度最小的子数组 考滑动窗口的 要注意是大于等于不是等于 看错题目一顿调 class …

CNAI趋势下,打造一体化AI赋能平台

在数字化转型的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;已成为推动企业创新和转型的核心力量。云原生技术以其灵活性和可扩展性&#xff0c;为AI的应用和发展提供了坚实的基础。本文将探讨云原生人工智能&#xff08;CNAI&#xff09;如何为企业带来颠覆性的变革…

cnn突破八(两层卷积核bpnet网络扩展)

cnn突破七中x【&#xff1f;】怎么求&#xff1f;我们举个例子&#xff1a; 接着cnn突破七&#xff1a; hicnn【】来自temphicnn【】2*2最大池化&#xff1a; temphicnn[0]x[i0,j0,5*5方阵]*w1cnn[0-24]&#xff0c; hicnn是5*5的&#xff0c;temphicnn是10*10的&#xff0…

YOLOv8改进 - 注意力篇 - 引入SimAM注意力机制

一、本文介绍 作为入门性篇章&#xff0c;这里介绍了SimAM注意力在YOLOv8中的使用。包含SimAM原理分析&#xff0c;SimAM的代码、SimAM的使用方法、以及添加以后的yaml文件及运行记录。 二、SimAM原理分析 SimAM官方论文地址&#xff1a;SimAM文章 SimAM官方代码地址&#…

【土地那些事儿】一文读懂“集体所有土地”

今天咱们来聊一个既熟悉又神秘的概念——集体所有土地。在中国广袤的大地上&#xff0c;除了国有土地外&#xff0c;还有一种特殊的土地所有权形式&#xff0c;它关乎亿万农民的切身利益&#xff0c;那就是集体所有土地。来&#xff0c;让我们一起揭开它的面纱吧&#xff01; …

根据指数做波段年化利率分析

根据指数做波段年化利率分析 股票投资&#xff0c;是众多投资方式中的一种。然而&#xff0c;每个人有不同的炒股方式&#xff0c;对股票不同的操作也会获得不同的收益/损失。作为“金融消费者”&#xff0c;如何做好自己在股票中的消费行为&#xff0c;是一门巨大的学问。这里…

D31【python 接口自动化学习】- python基础之输入输出与文件操作

day31 文件的打开 学习日期&#xff1a;20241008 学习目标&#xff1a;输入输出与文件操作&#xfe63;-43 常见常新&#xff1a;文件的打开 学习笔记&#xff1a; 文件的概念 使用open()函数打开文件 文件路径处理 文件打开模式 总结 文件操作包括&#xff1a;打开&#…

C++:string (用法篇)

文章目录 前言一、string 是什么&#xff1f;二、C语法补充1. auto2. 范围for 三、string类对象的常见构造1. Construct string object2. String destructor3. operator 四、string迭代器相关1. begin与end1&#xff09;begin2&#xff09;end3&#xff09;使用 2. rbegin 与 r…

第33次CCF计算机软件能力认证-第4题十滴水

题干&#xff1a; 十滴水是一个非常经典的小游戏。 小 C C C 正在玩一个一维版本的十滴水游戏。 我们通过一个例子描述游戏的基本规则。 游戏在一个 1 c 1c 1c 的网格上进行&#xff0c;格子用整数 x ( 1 ≤ x ≤ c ) x(1≤x≤c) x(1≤x≤c) 编号&#xff0c;编号从左往…

Metal之旅——数据

顶点数据 顶点数据&#xff08;Vertex Data&#xff09;是指一系列顶点的集合&#xff0c;这些顶点用于图形渲染管线的输入。每个顶点通常包含位置、颜色、纹理坐标等属性信息 mesh网络 Mesh网络是指metal中通过将不同数量形状的三角形拼在一起覆盖在要绘制图形表面的网络 顶…

007集—— 自动获取图形的外边界(外轮廓)(CAD—C#二次开发入门)

本文只适用于闭合多段线组成的图像,其他情况(圆、弧、椭圆、未封闭line)暂不支持。 效果如下图所示: 原始图: 代码运行后图: 附代码: public class 外轮廓{Database db = HostApplicationServices.WorkingDatabase;[CommandMethod("xx")]public void Demo(…