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 最后
最后对选题、开题、毕设、编程等方面的问题都可以随时与我沟通哦~