提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一、前言
- 二、项目简介
- 三、PCB硬件设计
- 四、原理图设计
- 五、程序设计
- 六、包含内容
- 七、项目分享
一、前言
实物项目成品图片:
仿真项目成品图片:
哔哩哔哩视频链接:
(资料分享见文末)
二、项目简介
1、功能介绍:
(1)采用 STM32F103C8T6最小系统集成模块。
(2)采用防水式 DS18B20 检测土壤温度:当温度高于设定最大值时,触发声光报警并启动风扇降温;当温度低于设定最小值时,触发声光报警并启动加热片升温
(2)通过土壤湿度模块检测土壤湿度:当湿度低于设定最小值时,触发声光报警并启动水泵补水;当湿度高于设定最大值时,自动关闭水泵并停止声光报警。
(3)利用光敏电阻检测光照强度:当光照值低于设定最小值时,自动开启补光。
(4)支持通过按键设置各项参数阈值,同时可手动控制风扇、水泵、加热片的启停。
(5)OLED显示屏显示各项测量值
(6)集成蓝牙模块,可将测量数据无线传输至蓝牙 APP,实现远程监测。
2、主要硬件
硬件组成:STM32+OLED 屏幕+防水式DS18B20温度传感器+光敏传感器+土壤湿度传感器+继电器+有源蜂鸣器+加热片+水泵+风扇模块+LED照明灯模块+蓝牙模块
三、PCB硬件设计
四、原理图设计
五、程序设计
代码如下:
#include"sys.h"#include"stdio.h"#include"string.h"#include"stdlib.h"#include"math.h"#include"delay.h"#include"gpio.h"#include"key.h"#include"oled.h"#include"usart.h"#include"ds18b20.h"#include"adc.h"/********************************** 变量定义 **********************************/uint8_tkey_num=0;//按键扫描标志位uint8_tflag_display=0;//显示界面标志位uint16_ttime_num=0;//10ms计时uint16_tlight_value=0;//光照数值uint16_tlight_min=50;//光照最小值uint16_tsoil_value=0;//土壤湿度数值uint16_tsoil_max=50;//土壤湿度最大值uint16_tsoil_min=20;//土壤湿度最小值uint16_ttemp_value=0;//温度数值uint16_ttemp_max=40;//温度最大值uint16_ttemp_min=10;//温度最小值_Boolflag_temp_min=0;//温度最小值声光报警标志位_Boolflag_temp_max=0;//温度最大值声光报警标志位_Boolflag_soil_min=0;//湿度最小值声光报警标志位externuint8_tusart1_buf[256];//串口1接收数组chardisplay_buf[16];//显示数组/********************************** 函数声明 **********************************/voidKey_function(void);//按键函数voidMonitor_function(void);//监测函数voidDisplay_function(void);//显示函数voidManage_function(void);//处理函数/**** ******* 主函数 *****/intmain(void){NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置中断优先分组Delay_Init();//延时初始化Gpio_Init();//IO初始化Key_Init();//按键初始化Oled_Init();//OLED初始化Oled_Clear_All();//清屏Usart1_Init(9600);//串口1初始化DS18B20_Init();//DS18B20初始化Adc_Init();//ADC初始化Delay_ms(1000);Delay_ms(1000);while(1){Key_function();//按键函数Monitor_function();//监测函数Display_function();//显示函数Manage_function();//处理函数time_num++;//计时变量+1Delay_ms(10);if(time_num%10==0)LED_SYS=~LED_SYS;if(time_num>=5000){time_num=0;}}}/**** *******按键函数 *****/voidKey_function(void){key_num=Chiclet_Keyboard_Scan(0);//按键扫描if(key_num!=0)//有按键按下{switch(key_num){case1://按键1,切换设置界面flag_display++;if(flag_display>=6)flag_display=0;Oled_Clear_All();//清屏break;case2://按键2switch(flag_display){case1://界面1:温度最大值+1if(temp_max<99)temp_max++;break;case2://界面2:温度最小值+1if(temp_min<temp_max-1)temp_min++;break;case3://界面3:湿度最大值+1if(soil_max<99)soil_max++;break;case4://界面4:湿度最小值+1if(soil_min<soil_max-1)soil_min++;break;case5://界面5:光照最小值if(light_min<99)light_min++;break;default:break;}break;case3://按键3switch(flag_display){case1://界面1:温度最大值-1if(temp_max>temp_min+1)temp_max--;break;case2://界面2:温度最小值-1if(temp_min>0)temp_min--;break;case3://界面3:湿度最大值-1if(soil_max>soil_min+1)soil_max--;break;case4://界面4:湿度最小值-1if(soil_min>0)soil_min--;break;case5://界面5:光照最小值-1if(light_min>0)light_min--;break;default:break;}break;default:break;}}}/**** *******监测函数 *****/voidMonitor_function(void){if(flag_display==0)//测量界面{if(time_num%5==0)//获取数据{temp_value=DS18B20_Get_Temp();light_value=99-30*(Get_Adc_Average(0,3)*3.3/4096.0);soil_value=99-30*(Get_Adc_Average(1,3)*3.3/4096.0);}if(time_num%30==0)//发送数据{UsartPrintf(USART1,"温度:%d.%dC\r\n",temp_value/10,temp_value%10);UsartPrintf(USART1,"湿度:%d%%\r\n",soil_value);UsartPrintf(USART1,"光照:%dLux\r\n",light_value);}}}/**** *******显示函数 *****/voidDisplay_function(void){switch(flag_display)//根据不同的显示模式标志位,显示不同的界面{case0://界面0:显示温度,湿度,光照的数值Oled_ShowCHinese(1,1,"土壤环境监测");Oled_ShowCHinese(2,0,"温度:");sprintf(display_buf,"%d.%dC ",temp_value/10,temp_value%10);Oled_ShowString(2,6,display_buf);Oled_ShowCHinese(3,0,"湿度:");sprintf(display_buf,"%d%% ",soil_value);Oled_ShowString(3,6,display_buf);Oled_ShowCHinese(4,0,"光照:");sprintf(display_buf,"%dLux ",light_value);Oled_ShowString(4,6,display_buf);break;case1://界面1:设置温度最大值Oled_ShowCHinese(1,0,"设置温度最大值");if(time_num%5==0){sprintf(display_buf,"%d ",temp_max);Oled_ShowString(2,7,display_buf);}if(time_num%10==0){Oled_ShowString(2,7," ");}break;case2://界面2:设置温度最小值Oled_ShowCHinese(1,0,"设置温度最小值");if(time_num%5==0){sprintf(display_buf,"%d ",temp_min);Oled_ShowString(2,7,display_buf);}if(time_num%10==0){Oled_ShowString(2,7," ");}break;case3://界面3:设置湿度最大值Oled_ShowCHinese(1,0,"设置湿度最大值");if(time_num%5==0){sprintf(display_buf,"%d ",soil_max);Oled_ShowString(2,7,display_buf);}if(time_num%10==0){Oled_ShowString(2,7," ");}break;case4://界面4:设置湿度最小值Oled_ShowCHinese(1,0,"设置湿度最小值");if(time_num%5==0){sprintf(display_buf,"%d ",soil_min);Oled_ShowString(2,7,display_buf);}if(time_num%10==0){Oled_ShowString(2,7," ");}break;case5://界面5:设置光照最小值Oled_ShowCHinese(1,0,"设置光照最小值");if(time_num%5==0){sprintf(display_buf,"%d ",light_min);Oled_ShowString(2,7,display_buf);}if(time_num%10==0){Oled_ShowString(2,7," ");}break;default:break;}}/**** *******处理函数 *****/voidManage_function(void){if(flag_display==0)//测量界面{if(temp_value<temp_min*10)//温度小于最小值,开启加热,和声光报警{flag_temp_min=1;flag_temp_max=0;FS=0;JR=1;}elseif(temp_value>temp_max*10)//温度大于最大值,开启风扇,和声光报警{flag_temp_min=0;flag_temp_max=1;FS=1;JR=0;}else//温度在两者之间关闭风扇和加热和声光报警{flag_temp_min=0;flag_temp_max=0;FS=0;JR=0;}if(soil_value<soil_min)//湿度小于最小值开启水泵和声光报警{flag_soil_min=1;JS=1;}elseif(soil_value>soil_max)//湿度大于最大值关闭水泵和声光报警{flag_soil_min=0;JS=0;}else//湿度在两者之间关闭声光报警{flag_soil_min=0;}if(light_value<light_min)//光照小于最小值开启补光BG=1;else//光照大于最小值关闭补光BG=0;if(flag_temp_min==1||flag_temp_max==1||flag_soil_min==1){if(time_num%3==0)//开启声光报警{LED=~LED;BEEP=~BEEP;}}else//关闭声光报警{LED=1;BEEP=0;}}else//设置界面{LED=1;BEEP=0;FS=0;JS=0;JR=0;BG=0;}}六、包含内容
七、项目分享
资料获取:请查看主页介绍