ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

STM32单片机智能农业大棚灌溉系统--开源!(实物+仿真)

STM32单片机智能农业大棚灌溉系统--开源!(实物+仿真) 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录一、前言二、项目简介三、PCB硬件设计四、原理图设计五、程序设计六、包含内容七、项目分享一、前言实物项目成品图片仿真项目成品图片哔哩哔哩视频链接资料分享见文末二、项目简介1、功能介绍1采用 STM32F103C8T6最小系统集成模块。2采用防水式 DS18B20 检测土壤温度当温度高于设定最大值时触发声光报警并启动风扇降温当温度低于设定最小值时触发声光报警并启动加热片升温2通过土壤湿度模块检测土壤湿度当湿度低于设定最小值时触发声光报警并启动水泵补水当湿度高于设定最大值时自动关闭水泵并停止声光报警。3利用光敏电阻检测光照强度当光照值低于设定最小值时自动开启补光。4支持通过按键设置各项参数阈值同时可手动控制风扇、水泵、加热片的启停。5OLED显示屏显示各项测量值6集成蓝牙模块可将测量数据无线传输至蓝牙 APP实现远程监测。2、主要硬件硬件组成STM32OLED 屏幕防水式DS18B20温度传感器光敏传感器土壤湿度传感器继电器有源蜂鸣器加热片水泵风扇模块LED照明灯模块蓝牙模块三、PCB硬件设计四、原理图设计五、程序设计代码如下#includesys.h#includestdio.h#includestring.h#includestdlib.h#includemath.h#includedelay.h#includegpio.h#includekey.h#includeoled.h#includeusart.h#includeds18b20.h#includeadc.h/********************************** 变量定义 **********************************/uint8_tkey_num0;//按键扫描标志位uint8_tflag_display0;//显示界面标志位uint16_ttime_num0;//10ms计时uint16_tlight_value0;//光照数值uint16_tlight_min50;//光照最小值uint16_tsoil_value0;//土壤湿度数值uint16_tsoil_max50;//土壤湿度最大值uint16_tsoil_min20;//土壤湿度最小值uint16_ttemp_value0;//温度数值uint16_ttemp_max40;//温度最大值uint16_ttemp_min10;//温度最小值_Boolflag_temp_min0;//温度最小值声光报警标志位_Boolflag_temp_max0;//温度最大值声光报警标志位_Boolflag_soil_min0;//湿度最小值声光报警标志位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%100)LED_SYS~LED_SYS;if(time_num5000){time_num0;}}}/**** *******按键函数 *****/voidKey_function(void){key_numChiclet_Keyboard_Scan(0);//按键扫描if(key_num!0)//有按键按下{switch(key_num){case1://按键1切换设置界面flag_display;if(flag_display6)flag_display0;Oled_Clear_All();//清屏break;case2://按键2switch(flag_display){case1://界面1温度最大值1if(temp_max99)temp_max;break;case2://界面2温度最小值1if(temp_mintemp_max-1)temp_min;break;case3://界面3湿度最大值1if(soil_max99)soil_max;break;case4://界面4湿度最小值1if(soil_minsoil_max-1)soil_min;break;case5://界面5光照最小值if(light_min99)light_min;break;default:break;}break;case3://按键3switch(flag_display){case1://界面1温度最大值-1if(temp_maxtemp_min1)temp_max--;break;case2://界面2温度最小值-1if(temp_min0)temp_min--;break;case3://界面3湿度最大值-1if(soil_maxsoil_min1)soil_max--;break;case4://界面4湿度最小值-1if(soil_min0)soil_min--;break;case5://界面5光照最小值-1if(light_min0)light_min--;break;default:break;}break;default:break;}}}/**** *******监测函数 *****/voidMonitor_function(void){if(flag_display0)//测量界面{if(time_num%50)//获取数据{temp_valueDS18B20_Get_Temp();light_value99-30*(Get_Adc_Average(0,3)*3.3/4096.0);soil_value99-30*(Get_Adc_Average(1,3)*3.3/4096.0);}if(time_num%300)//发送数据{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%50){sprintf(display_buf,%d ,temp_max);Oled_ShowString(2,7,display_buf);}if(time_num%100){Oled_ShowString(2,7, );}break;case2://界面2设置温度最小值Oled_ShowCHinese(1,0,设置温度最小值);if(time_num%50){sprintf(display_buf,%d ,temp_min);Oled_ShowString(2,7,display_buf);}if(time_num%100){Oled_ShowString(2,7, );}break;case3://界面3设置湿度最大值Oled_ShowCHinese(1,0,设置湿度最大值);if(time_num%50){sprintf(display_buf,%d ,soil_max);Oled_ShowString(2,7,display_buf);}if(time_num%100){Oled_ShowString(2,7, );}break;case4://界面4设置湿度最小值Oled_ShowCHinese(1,0,设置湿度最小值);if(time_num%50){sprintf(display_buf,%d ,soil_min);Oled_ShowString(2,7,display_buf);}if(time_num%100){Oled_ShowString(2,7, );}break;case5://界面5设置光照最小值Oled_ShowCHinese(1,0,设置光照最小值);if(time_num%50){sprintf(display_buf,%d ,light_min);Oled_ShowString(2,7,display_buf);}if(time_num%100){Oled_ShowString(2,7, );}break;default:break;}}/**** *******处理函数 *****/voidManage_function(void){if(flag_display0)//测量界面{if(temp_valuetemp_min*10)//温度小于最小值开启加热和声光报警{flag_temp_min1;flag_temp_max0;FS0;JR1;}elseif(temp_valuetemp_max*10)//温度大于最大值开启风扇和声光报警{flag_temp_min0;flag_temp_max1;FS1;JR0;}else//温度在两者之间关闭风扇和加热和声光报警{flag_temp_min0;flag_temp_max0;FS0;JR0;}if(soil_valuesoil_min)//湿度小于最小值开启水泵和声光报警{flag_soil_min1;JS1;}elseif(soil_valuesoil_max)//湿度大于最大值关闭水泵和声光报警{flag_soil_min0;JS0;}else//湿度在两者之间关闭声光报警{flag_soil_min0;}if(light_valuelight_min)//光照小于最小值开启补光BG1;else//光照大于最小值关闭补光BG0;if(flag_temp_min1||flag_temp_max1||flag_soil_min1){if(time_num%30)//开启声光报警{LED~LED;BEEP~BEEP;}}else//关闭声光报警{LED1;BEEP0;}}else//设置界面{LED1;BEEP0;FS0;JS0;JR0;BG0;}}六、包含内容七、项目分享资料获取请查看主页介绍
返回列表