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 最后

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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐