0 前言
🔥
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 毕设分享 基于STM32的智能水产养殖系统(源码+硬件+论文)
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:4分
🧿 项目分享:见文末!
1 主要功能
本系统是基于Cortex-M4内核的STM32F407VGT6微控制器的水产养殖自动化控制装置,在硬件方面主要有无线传输以及电机驱动,抽水机,温湿度模块,OV7670摄像头,蜂鸣器,光电门,连通器以及用大型鱼缸代替的鱼塘,HX8325液晶,嵌入式操作系统ucOSii的移植以及嵌入式图形管理器ucGUI的移植。 整个设计过程包括电子系统的设计技术及调试技术,包括需求分析,原理图的绘制,pcb板的绘制,制版,器件采购,安装,焊接,硬件调试,软件模块编写,软件模块测试,系统整体测试等整个开发调试过程,从而实现水产养殖智能化控制。
2 硬件设计(原理图)
针对水产养殖控制系统的多模块化控制,以及多设备协调工作的特点,力求达到系统的最优配置,本系统整体采用集散式控制系统,即是以微处理器为基础的对整个系统运行过程进行集中监视、操作、管理和分散控制的集中分散控制系统。上位采用STM32F407VGT6芯片设计的显示输入预设置面板,下位采用基于STM32F407VET6芯片设计的控制器,通信方式采用基于SPI的无线通信及控制器上的直接通信,下图是基于离散控制的水产养殖控制系统框图
由于STM32F40x及摄像头模块使用的是3.3V供电,而显示模块驱动芯片是ili9327采用的是5V供电,所以在外置电源所带来的12V电源已经不能满足系统的需求,所以需要设置一个电源模块,将外置电源12V转化为系统所需要的5V和3.3V电压对系统进行供电,下图是本系统的电源部分电路设计
3 核心软件设计
首先,程序进入初始化阶段,对芯片的时钟(RCC),I/O(GPIO),串口(USART),ADC,PWM波以及液晶进行初始化。其中系统时钟定义为168MHz,这样程序运行的速度是最快的;I/O口对输入(按键)、输出(显示)、通信(USART)分别进行定义;USART异步串行通信则需要对数据位,校验位,波特率进行初始化。
然后,程序进入循环判断阶段,如果有触屏按键按下,则系统进入手动控制模式,通过触摸屏滚动条来控制电机的转动速率;如果没有按键按下,而鱼塘上的触发器有反馈回来电平信号,则开启摄像头对环境进行监视;在没有任何外界出发的情况下,主控制器部分能仅仅显示当前水温,水质,沼气浓度,光线强度等信息
关键代码
#include "main.h"
#include "ssd1963.h"
#include "touch.h"
TOUCH_Def touch;
extern volatile unsigned int pen_touch;
static void led_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable the GPIO_LED Clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
/* Configure the GPIO_LED pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
int main(void)
{
led_init();
lcd_init();
touch_init();
if (touch.calibrating != 1)
{
calibration(&touch);
}
/* Infinite loop */
lcd_display_string_line(464,0,RED,BLUE,"#");
while (1)
{
if (pen_touch == 1)
{
do
{
touch_point(&touch);
if((touch.x>464) &&(touch.y < 16))
{
lcd_clear(BLUE);
lcd_display_string_line(464,0,RED,BLUE,"#");
}
ssd1963_draw_pixel(touch.x,touch.y,WHITE);
} while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9) == Bit_RESET);
pen_touch = 0;
exti_enable(1);
}
}
}
4 实现效果
5 最后
包含内容
🧿 项目分享:见文末!