2025届毕设 基于STM32的农业大棚环境监控系统设计与实现(源码+硬件+论文+答辩)

0 前言

🔥
2025届大三大四毕业生也到了毕业论文写作阶段,很多第一次写毕设的学弟学妹一头雾水,对于论文选题、开题报告、论文写作、答辩PPT等流程很是陌生,为了帮助电子信息类学弟学妹及时完成论文写作、通过答辩最终实现顺利毕业,在这里分享优质毕业设计项目的整个流程,今天要分享的是:

🚩 2025单片机/电子信息/物联网毕设 基于STM32的农业大棚环境监控系统设计与实现(源码+硬件+论文+答辩)

🥇这里给一个题目综合评分(每项满分5分)

难度系数:3分
工作量:3分
创新点:4分

🧿 项目分享:见文末!

1 开题报告

在这里插入图片描述
在这里插入图片描述

1 主要功能

本系统主要由单片机系统STM32F103、OLED显示、温湿度采集模块、CO2采集模块、光线强度采集模块以及风扇、水泵等控制模块。采用单片机作为主控芯片,将采集到的温湿度和光线,二氧化碳浓度显示到1.8寸OLED显示屏上,来实现当前大棚的采集和控制。

在这里插入图片描述

总体的设计和要求如下:

  • (1)检测农业大棚中各种环境数据,例如:光照、空气温湿度、气体浓度和土壤湿度等。通过手动或自动实现对环境的控制,使大棚内的环境保持在适宜农作物生长的状态。
  • (2)及时显示大棚内温湿度、光照强度、气体浓度和土壤湿度等状态。
  • (3)大棚内的环境参数的上限和下限值可手动进行预设定。
  • (4)大棚内的环境参数低于或高于上下限值时,蜂鸣器启动报警功能,以便用户执行相应的措施,控制参数的变化。
  • (5)手机APP上设置自动和手动状态,满足用户的需求。
  • (6)设置无线通信模块,可通过手机APP显示并远程监控各种环境参数。

2 硬件设计(PCB+原理图+模块)

原理图:

在这里插入图片描述

PCB:

在这里插入图片描述

模块清单(淘宝搜索直接购买):
在这里插入图片描述

3 核心软件设计

核心代码main.c

void chuishi_1(void) // 初始界面1显示
{

	Gui_DrawFont_GBK16(0, 0, BLACK, WHITE, "空气温度:    ℃");
	Gui_DrawFont_GBK16(0, 16, BLACK, WHITE, "空气湿度:    %");
	Gui_DrawFont_GBK16(0, 32, BLACK, WHITE, "土壤湿度:    %");
	Gui_DrawFont_GBK16(0, 48, BLACK, WHITE, "光照强度:    lux");
	Gui_DrawFont_GBK16(0, 64, BLACK, WHITE, "二氧化碳:    ‰");
	Gui_DrawFont_GBK16(10, 144, BLACK, WHITE, "WIFI:");
	if (Onenet_succes)
		Gui_DrawFont_GBK16(60, 144, BLACK, WHITE, "已连接:");
	else
		Gui_DrawFont_GBK16(60, 144, BLACK, WHITE, "未连接:");
}
void chuishi_2(void)
{
	Gui_DrawFont_GBK16(10, 30, BLACK, WHITE, "温度阈值:");
	Gui_DrawFont_GBK16(10, 46, BLACK, WHITE, "温度阈值:");
	Gui_DrawFont_GBK16(10, 62, BLACK, WHITE, "土壤湿度阈值:");
	Gui_DrawFont_GBK16(10, 88, BLACK, WHITE, "光照阈值:");
	Gui_DrawFont_GBK16(10, 102, BLACK, WHITE, "二氧化碳阈值:");
}
void control_gui(void) // 控制端口显示
{

	switch (control_mode)
	{
	case 0:
		Gui_DrawFont_GBK16(0, 128, BLUE, WHITE, "自动");
		Gui_DrawFont_GBK16(45, 128, BLACK, WHITE, "手动");
		Gui_DrawFont_GBK16(90, 128, BLACK, WHITE, "云端");
		break;
	case 1:
		Gui_DrawFont_GBK16(0, 128, BLACK, WHITE, "自动");
		Gui_DrawFont_GBK16(45, 128, BLUE, WHITE, "手动");
		Gui_DrawFont_GBK16(90, 128, BLACK, WHITE, "云端");
		break;
	case 2:
		Gui_DrawFont_GBK16(0, 128, BLACK, WHITE, "自动");
		Gui_DrawFont_GBK16(45, 128, BLACK, WHITE, "手动");
		Gui_DrawFont_GBK16(90, 128, BLUE, WHITE, "云端");
		break;
	}
}
void GUI_Test1(void) /// 主界面控制和显示,环境数据显示
{

	if (Gui_mode_last != Gui_mode) // 判断是否改变,更新固定显示
	{
		chuishi_1();
		Gui_mode_last = Gui_mode;
	}

	LCD_ShowNum(70, 0, SUR_status.air_tem, 2, BLACK, WHITE);
	LCD_ShowNum(70, 16, SUR_status.air_hum, 2, BLACK, WHITE);
	LCD_ShowNum(70, 32, SUR_status.soil_hum, 2, BLACK, WHITE);
	LCD_ShowNum(70, 48, SUR_status.light, 4, BLACK, WHITE);
	LCD_ShowNum(70, 64, SUR_status.car, 2, BLACK, WHITE); // 数据显示
}
void GUI_Test2(void) // 参数设置显示
{
	if (Gui_mode_last != Gui_mode) // 初始显示
	{

		Gui_DrawFont_GBK16(40, 0, BLACK, WHITE, "参数设置");
		Gui_DrawFont_GBK16(10, 16, BLACK, WHITE, "温度阈值:");
		Gui_DrawFont_GBK16(10, 32, BLACK, WHITE, "土湿阈值:");
		Gui_DrawFont_GBK16(10, 48, BLACK, WHITE, "光照阈值:");
		Gui_DrawFont_GBK16(10, 64, BLACK, WHITE, "CO2阈值:");
		Gui_mode_last = Gui_mode;
	}
	Gui_DrawFont_GBK16(0, threshold_sta * 16, BLACK, WHITE, "*");
	LCD_ShowNum(80, 16, SUR_status.air_tem_num, 2, BLACK, WHITE);
	LCD_ShowNum(80, 32, SUR_status.soil_hum_num, 2, BLACK, WHITE);
	LCD_ShowNum(80, 48, SUR_status.light_num, 4, BLACK, WHITE);
	LCD_ShowNum(80, 64, SUR_status.car_num, 3, BLACK, WHITE); // 参数显示
}

void GUI_Test3(void) // 手动控制界面
{
	if (Gui_mode_last != Gui_mode) // 界面显示
	{

		Gui_DrawFont_GBK16(40, 0, BLACK, WHITE, "手动控制");
		Gui_DrawFont_GBK16(20, 16, BLACK, WHITE, "风扇:");
		Gui_DrawFont_GBK16(20, 32, BLACK, WHITE, "水泵:");
		Gui_DrawFont_GBK16(20, 48, BLACK, WHITE, "灯光:");
		Gui_mode_last = Gui_mode;
	}
	Gui_DrawFont_GBK16(0, threshold_sta_control * 16, BLACK, WHITE, "*"); // 显示选择位置
	if (FAN_KEY)														  // 手动控制显示文字
		Gui_DrawFont_GBK16(80, 16, BLACK, WHITE, "开");
	else
		Gui_DrawFont_GBK16(80, 16, BLACK, WHITE, "关");

	if (Water_pump_KEY)
		Gui_DrawFont_GBK16(80, 32, BLACK, WHITE, "开");
	else
		Gui_DrawFont_GBK16(80, 32, BLACK, WHITE, "关");

	if (LED_KEY)
		Gui_DrawFont_GBK16(80, 48, BLACK, WHITE, "开");
	else
		Gui_DrawFont_GBK16(80, 48, BLACK, WHITE, "关");
}


int main(void)
{
	unsigned char *dataPtr = 0;
	delay_init();		 // 延时函数初始化
	SWITCH_Init();		 // 初始化与LED连接的硬件接口 水泵 风扇
	Usart2_Init(115200); // wifi模块串口
	uart_init(115200);	 // 串口1

	I2C_GPIO_Config(); // iic初始化  ccs811,模块初始化  检测CO2
	CS_EN();		   // 对ccs811 配置
	delay_ms(100);
	ON_CS();
	delay_ms(100);
	Single_ReadI2C(CCS811_Add, 0x20, Information, 1); // Read CCS's information  ,ID,0x81

	Single_ReadI2C(CCS811_Add, 0x23, &Information[1], 2); // FW_Boot_Version
	Single_ReadI2C(CCS811_Add, 0x24, &Information[3], 2); // FW_App_Version
	Single_ReadI2C(CCS811_Add, 0x00, &Status, 1);
	if (Status & 0x10)
		Single_MWriteI2C_byte(CCS811_Add, 0xF4, &temp, 0); // Used to transition the CCS811 state from boot to application mode, a write with no data is required.
	Single_ReadI2C(CCS811_Add, 0x00, &Status, 1);
	Single_ReadI2C(CCS811_Add, 0x01, &MeasureMode, 1);
	Single_WriteI2C_byte(CCS811_Add, 0x01, 0x10); // Write Measure Mode Register,sensor measurement every second,no interrupt
	OFF_CS();
	// 二氧化碳模块初始化

	KEY_Init();			 // 按键初始化
	Lcd_Init();			 // st7735 LCD屏幕初始化
	LCD_LED_SET;		 // 通过IO控制背光亮
	Lcd_Clear(WHITE);	 // 清屏
	Adc_Init();			 // ADc初始化,采集土壤湿度模块的模拟量
	init_data();		 // 初始阈值参数设置
	while (DHT11_Init()) // DHT11初始化	温湿度
	{
		delay_ms(200);
	}
	// TIM4_Int_Init(999,7199);
	bh1750_iic_init(); /// 光照模块初始化
	Gui_DrawFont_GBK16(10, 60, BLACK, WHITE, "正在连接ONENET");
	ESP8266_Init();			 // 初始化ESP8266 wifi
	while (OneNet_DevLink()) // 接入OneNET
		delay_ms(500);
	Onenet_succes = 1; /// 表示接入成功
	Lcd_Clear(WHITE);  // 清屏
	Shuju();		   // 获取环境数据
	Gui_DrawFont_GBK16(10, 144, BLACK, WHITE, "WIFI:");
	if (Onenet_succes)
		Gui_DrawFont_GBK16(60, 144, BLACK, WHITE, "已连接:");
	else
		Gui_DrawFont_GBK16(60, 144, BLACK, WHITE, "未连接:");
	while (1)
	{
		key = KEY_Scan(0); // 检测按键
		threshold_value(); // 界面和按键处理
		counts++;		   // 累加,用于onenet数据上传计时
		control_set();	   // 控制处理
		if (counts > 20)   // counts>90  向云平台发送数据
		{
			OneNet_SendData(); // 发送数据
			ESP8266_Clear();   // 清理esp8266 wifi模块数据缓存
			counts = 0;
			Shuju(); // 数据采集
		}
		dataPtr = ESP8266_GetIPD(0); // 检测onenet是否下发数据
		if (dataPtr != NULL)
			OneNet_RevPro(dataPtr); // 处理下发数据
		delay_ms(2);				// 延迟
	}
}

4 实现效果

在这里插入图片描述

在这里插入图片描述

5 编写论文

论文目录:
在这里插入图片描述
整体结构:大概一万多字

在这里插入图片描述

5 答辩PPT

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6 最后

最后对选题、开题、毕设、编程等方面的问题都可以随时与我沟通哦~

智慧农业-基于STM32F103C8T6开发的智能大棚温湿度传感系统源码(课程设计) 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到94.5分,放心下载使用! 该资源适合计算机相关专业(如人工智能、通信工程、自动化、软件工程等)的在校学生、老师或者企业员工下载,适合小白学习或者实际项目借鉴参考! 当然也可作为毕业设计、课程设计、课程作业、项目初期立项演示等。如果基础还行,可以在此代码基础之上做改动以实现更多功能。 简介 ``` 本温室传感系统包括数据采集模块无线蓝牙传输模块,主控MCU为STM32F103C8T6。 主要文件及文件夹为: - ./Drivers/Peripheral - ./Core/Src/main.c ``` 开发环境 ``` - 系统:windows 10 - 集成开发环境:STM32CubeIDE - 下载工具:STM32CubeProgrammer + CH340(USB to TTL) ``` 子模块 传感模块 ``` - SHT31 SHT31为I2C总线协议温湿度传感模块,支持“单次转换”和“周期转换”模式,本次设计中使用单次转换模式。 - GY30 GY30为I2C总线协议光照传感模块,支持“单次转换”和“周期转换”模式,本次设计中使用周期转换模式。 ``` 传输模块 HC-05为无线蓝牙传输模块,支持串口收发。预先于PC上使用AT指令配置蓝牙热点,接上单片机即可直接收发数据。 引脚分配 ``` - STM32 === 外设/引脚 - PA2 === HC-05/RXD - PA3 === HC-05/TXD - PA5 === LCD1602/WR - PA6 === LCD1602/RD - PA7 === LCD1602/E - PA15 === LCD1602/D0 - PB3 === LCD1602/D1 - PB4 === LCD1602/D2 - PB5 === LCD1602/D3 - PB6 === LCD1602/D4 - PB7 === LCD1602/D5 - PB8 === LCD1602/D6 - PB9 === LCD1602/D7 - PB10 === I2C-SCL(总线) - PB11 === I2C-SDA(总线)
前言: 是德科技(NYSE:KEYS)是全球领先的电子测量公司,通过在无线、模块化和软件解决方案等领域的不断创新,为您提供全新的测量体验。是德科技专注于测量技术,旨在帮助科学家、研究人员和工程师精准和充满信心地应对最严苛的测量挑战。 越来越多的工程师开始选择是德科技示波器,因为它们能够帮助您: 利用屡获殊荣的示波器执行测试,从而加速将您的产品推向市场。这些示波器可以提供最快的更新速率、最深的存储器、独特的电容触摸屏,以及最广泛的示波器软件选件 利用可以信赖的测量生产出性能最高的产品。这些测量由具有业界领先信号完整性的示波器和最广泛的示波器探头提供 通过在一台主机中集成多种仪器以及轻松进行升级,实现最低的拥有成本 同时本文重点介绍了基于单片机STM32控制、Android显示的便携式数字示波器的毕业设计 数字示波器毕业设计概述: 基于单片机STM32控制的、并在Android上进行显示的便携式数字示波器。STM32单片机是一款性价比非常之高的处理器,最高时钟可达72M,完全能满足本设计的要求。采用Android设备作为显示平台,是本设计最大的一个特点。本设计的基本思路是,由单片机对ADC采样到的数据进行处理,再通过蓝牙把波形数据发送到Android设备上进行显示。同时由于Android设备都采用触摸屏,因此示波器的参数可以很方便的通过触摸屏进行设置。本设计采用Android设备取代液晶屏,并使用蓝牙进行数据传输,充分利用了Android设备的硬件资源。 由于A/D转换器的输入范围一般都比较小(低于2Vpp),不可能直接测量几十伏甚至是几百伏的信号。而且由于A/D转换器的分辨率有限,对于幅值很低的信号测量误差将会很大甚至是无法测量。所以在输入级必须要设计一个程控放大电路,以现实对信号进行不失真的处理,而后再送至A/D数模转换器,以达到A/D数模转换器的输入要求。基于本设计便携小巧的宗旨,和电路复杂度的考虑,本设计使用专用PGA芯片AD603,可以通过MCU来控制AD603的基准,进而实现不同放大倍数的调节。该电路优点是控制比较简单,且增益调节范围大,外围电路简单。缺点是成本稍微偏高。 AD603它是美国ADI公司的专利产品,是一个低噪、90MHz带宽增益可调的集成运放,如增益用分贝表示,则增益控制电压成线性关系,压摆率为275V/μs。管脚间的连接方式决定了可编程的增益范围,增益在-11~+30dB时的带宽为90Mhz,增益在+9~+41dB时具有9MHz带宽,改变管脚间的连接电阻,可使增益处在上述范围内。该集成电路可应用于射频自动增益放大器、视频增益控制、A/D转换量程扩展和信号测量系统。 AD603封装引脚图: Android示波器电路原理图 电路城语:此资料为卖家免费分享,不提供技术支持,请大家使用前验证资料的正确性!如涉及版权问题,请联系管理员删除! 附件包含以下资料:
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

行稳方能走远

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

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

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

打赏作者

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

抵扣说明:

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

余额充值