基于STM32单片机的室内植物浇水系统设计_第1页
基于STM32单片机的室内植物浇水系统设计_第2页
基于STM32单片机的室内植物浇水系统设计_第3页
基于STM32单片机的室内植物浇水系统设计_第4页
基于STM32单片机的室内植物浇水系统设计_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

附录A参考文献[1]闫红来.基于单片机控制的花草自动浇水系统的设计[J].机电一体化,2014(10):3.[2]王力,邓鹏,马雪芬.基于单片机的盆栽智能浇水控制系统设计[J].轻工科技,2018(4):2.[3]陈春燕.单片机定时浇水系统设计[J].中国新技术新产品,2010(12):1.[4]孙浩文.基于单片机的智能浇水控制系统设计[J].2024(7):254-255.[5]王其.室内花卉自动浇水系统装置的分析与设计[J].2020.[6]孟磊,王冉,刘佳.基于单片机绿植养护系统的设计与实现[J].电子制作,2022,30(23):4.[7]肖欢.基于单片机的智能浇水系统设计[J].微计算机信息,2019,000(011):8-9,12.[8]石蕊,刘永莉,刘辉.基于单片机的盆花智能浇水控制系统的设计[J].甘肃高师学报,2018,23(2):2.[9]杨风霞.基于单片机的智能浇花系统设计[J].智库时代,2018.D[10]宋小令.家庭花卉智能灌溉系统的设计与实现[D].重庆三峡学院,2019.[11]王斌.基于AVR单片机的绿植自动浇水系统[J].现代商贸工业,2016,37(15):2.[12]许庆阳.基于单片机下的新型智能花盆设计[J].中国新通信,2017,19(4):1.[13]高志军.基于单片机控制的花草自动浇水系统的设计研究[J].电子世界,2016(12):1.[14]王维,杜诗婷,韩改宁.基于STM32和云平台的植物浇水系统的设计与实现[J].微型电脑应用,2023,39(12):5-8.[15]刘强强,李海潮,王爽,等.基于单片机控制的园林智能浇水系统设计[J].模具制造,2023,23(10):190-192.[16]刘英男,王鑫,闫宇.基于单片机的智能阳台养花系统设计[J].中阿科技论坛(中英文),2020.[17]滕海坤,蒋翊彬,梁欣欣.基于STC89C52单片机的家居盆栽自动浇水系统的设计[J].智库时代,2018(12):2.[18]刘红权,潘虹,刘浩,等.基于单片机的智能花卉浇水系统的设计与实现[J].计算机产品与流通,2019(1):1.[19]马洪波,郑嘉元,白浩,等.基于STC单片机的混凝土智能浇水养护系统设计[J].山东工业技术,2019(6):1.[20]方泽鸱,黄双萍,陈仲涛.基于单片机的花盆土壤湿度控制系统设计[J].现代农业装备,2013.

附录/*USERCODEBEGINHeader*//*********************************************************************************@file:main.c*@brief:Mainprogrambody*******************************************************************************@attention**Copyright(c)2022STMicroelectronics.*Allrightsreserved.**ThissoftwareislicensedundertermsthatcanbefoundintheLICENSEfile*intherootdirectoryofthissoftwarecomponent.*IfnoLICENSEfilecomeswiththissoftware,itisprovidedAS-IS.********************************************************************************//*USERCODEENDHeader*//*Includes*/#include"main.h"#include"adc.h"#include"tim.h"#include"usart.h"#include"gpio.h"/*Privateincludes*//*USERCODEBEGINIncludes*/#include"./HAL/key/key.h"#include"./HAL/OLED/OLED_NEW.H"#include"./HAL/DELAY/delay.h"#include"./HAL/dht11/dht11.h"#include"./HAL/AliESP8266/AliESP8266.h"/*USERCODEENDIncludes*//*Privatetypedef*//*USERCODEBEGINPTD*/voidKey_function(void); //按键函数voidMonitor_function(void); //监测函数voidDisplay_function(void); //显示函数voidManage_function(void); //处理函数/*USERCODEENDPTD*//*Privatedefine*//*USERCODEBEGINPD*/#defineBEEP(a)(a?HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_SET):HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_RESET))#defineRELAY(a)(a?HAL_GPIO_WritePin(RELAY_GPIO_Port,RELAY_Pin,GPIO_PIN_SET):HAL_GPIO_WritePin(RELAY_GPIO_Port,RELAY_Pin,GPIO_PIN_RESET))uint8_tUSART2_TX_BUF[200];#defineu2_printf(...)HAL_UART_Transmit(&huart2,USART2_TX_BUF,sprintf((char*)USART2_TX_BUF,__VA_ARGS__),0xffff)/*USERCODEENDPD*//*Privatemacro*//*USERCODEBEGINPM*//*USERCODEENDPM*//*Privatevariables*//*USERCODEBEGINPV*/uint8_tkey_num,flag_display;//按键与显示变量uint16_ttime_1ms,time_500ms,time_s=5;//计时变量1ms,500msuint16_ttime_1,flag_1,time_2,flag_2;//计时变量uint16_ttime_ms_ms,time_1400ms;//计时变量1ms,500msuint16_ttime_ms;//串口2的数据获取uint8_tuart2_value;//串口传的单个数据//串口的储存数组,串口的接收时间,串口存值的数量uint8_tuart2_buf[36],uart2_time,uart2_num;uint8_tuart2_rx_flag;//串口的获取值的标志位uint16_ttemp,humi;//温湿度uint16_tlight_max=50;uint16_thumi_soil_max1=50,humi_soil_max2=90;uint8_tadc_ch; //adc的个数uint32_tadc_buf[3]; //adc数值的存储数组uint16_tlight,humi1_soil,humi2_soil;uint16_tSG90_angle=500;//舵机角度控制变量(500-25000-180°)uint8_trelay_falg,steering_falg,mode;/*USERCODEENDPV*//*Privatefunctionprototypes*/voidSystemClock_Config(void);/*USERCODEBEGINPFP*//*USERCODEENDPFP*//*Privateusercode*//*USERCODEBEGIN0*/uint16_tdong_get_adc(){//开启ADC1HAL_ADC_Start(&hadc1);//等待ADC转换完成,超时为100msHAL_ADC_PollForConversion(&hadc1,100);//判断ADC是否转换成功if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC)){//读取值returnHAL_ADC_GetValue(&hadc1);}return0; }/***********按键设置函数*****/voidKey_function(void){ key_num=Chiclet_Keyboard_Scan(); //按键扫描 if(key_num!=0) //有按键按下 { switch(key_num) { case1: //按键1,切换模式 flag_display++; if(flag_display>=4) //一共4个模式 flag_display=0; OLED_Clear(); //按一下,清屏一次 break; case2: //按键2 if(flag_display==0) (relay_falg==0)?(relay_falg=1):(relay_falg=0); if(flag_display==1) humi_soil_max1++; if(flag_display==2) humi_soil_max2++; if(flag_display==3) light_max++; break; case3: //按键3 if(flag_display==0) { steering_falg++; if(steering_falg>=3) steering_falg=0; } if(flag_display==1) humi_soil_max1--; if(flag_display==2) humi_soil_max2--; if(flag_display==3) light_max--; break; case4: //按键4,切换模式 (mode==0)?(mode=1):(mode=0); break; } }}/***********监测函数*****/voidMonitor_function(void){ if(time_500ms==1) { time_500ms=0;DHT11_Read_TempAndHumidity(&DHT11_Data);//调用获取温湿度函数 temp=DHT11_Data.temperature;//获取温度 humi=DHT11_Data.humidity;//获取湿度//将获取的值存储到adc_buf中 for(adc_ch=0;adc_ch<3;adc_ch++){//分别存放通道1、2、3的ADC值adc_buf[adc_ch]=dong_get_adc(); } light=adc_buf[2]/4095.0*100; humi1_soil=(4096-adc_buf[0]-1093)/1853.00*100; humi2_soil=(4096-adc_buf[1]-1093)/1853.00*100; }if(flag_1==1)//通过WiFi将数据上传至阿里云{flag_1=0;Ali_MQTT_Publish1();}if(flag_2==1){flag_2=0;Ali_MQTT_Publish();}if(time_1400ms==1) { time_1400ms=0; Ali_MQTT_Publish2(); }}/***********显示函数*****/voidDisplay_function(void){ switch(flag_display) //根据不同的显示模式标志位,显示不同 { case0: Oled_ShowCHinese(0,0,(uint8_t*)"土壤温度");OLED_Show_Temp(70,0,temp);Oled_ShowCHinese(0,2,(uint8_t*)"土壤湿度");OLED_Show_Humi(60,2,humi1_soil);OLED_Show_Humi(90,2,humi2_soil); Oled_ShowCHinese(0,4,(uint8_t*)"光照强度");OLED_ShowNum(80,4,light,2); Oled_ShowCHinese(0,6,(uint8_t*)"当前模式·"); if(mode==0) Oled_ShowCHinese(80,6,(uint8_t*)"手动"); if(mode==1) Oled_ShowCHinese(80,6,(uint8_t*)"自动"); break; case1: Oled_ShowCHinese(0,2,(uint8_t*)"设置土壤湿度阈值"); OLED_ShowNum(50,4,humi_soil_max1,3); break; case2: Oled_ShowCHinese(0,2,(uint8_t*)"设置土壤湿度阈值"); OLED_ShowNum(50,4,humi_soil_max2,3); break; case3: Oled_ShowCHinese(0,2,(uint8_t*)"设置光照强度阈值"); OLED_ShowNum(50,4,light_max,3); break; }}/***********处理函数*****/voidManage_function(void){ if(relay_falg==1) { RELAY(1); } else { RELAY(0); } if(steering_falg==0) { SG90_angle=500; } elseif(steering_falg==1) { SG90_angle=1500; } elseif(steering_falg==2) { SG90_angle=2000; } if(mode==1) { if(humi1_soil<humi_soil_max1&&humi2_soil<humi_soil_max2) { relay_falg=1; } else { relay_falg=0; } if(light>light_max&&light<80) steering_falg=1; if(light>80) steering_falg=2; if(light<light_max) steering_falg=0; }}/*USERCODEEND0*//***@briefTheapplicationentrypoint.*@retvalint*/intmain(void){/*USERCODEBEGIN1*//*USERCODEEND1*//*MCUConfiguration*//*Resetofallperipherals,InitializestheFlashinterfaceandtheSystick.*/HAL_Init();/*USERCODEBEGINInit*//*USERCODEENDInit*//*Configurethesystemclock*/SystemClock_Config();/*USERCODEBEGINSysInit*//*USERCODEENDSysInit*//*Initializeallconfiguredperipherals*/MX_GPIO_Init();MX_TIM1_Init();MX_USART2_UART_Init();MX_ADC1_Init();MX_TIM3_Init();/*USERCODEBEGIN2*/HAL_TIM_Base_Start_IT(&htim1);HAL_UART_Receive_IT(&huart2,&uart2_value,1); HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);//定时器3pwm初始化/*USERCODEEND2*//*Infiniteloop*//*USERCODEBEGINWHILE*/OLED_Init();OLED_Clear(); DHT11_GPIO_Init(); ESP8266_init(); while(1){Key_function(); //按键函数 Monitor_function(); //监测函数 Display_function(); //显示函数 Manage_function(); //处理函数 Ali_MQTT_Recevie(); /*USERCODEENDWHILE*//*USERCODEBEGIN3*/ __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_3,SG90_angle);//舵机的角度控制 }/*USERCODEEND3*/}/***@briefSystemClockConfiguration*@retvalNone*/voidSystemClock_Config(void){RCC_OscInitTypeDefRCC_OscInitStruct={0};RCC_ClkInitTypeDefRCC_ClkInitStruct={0};RCC_PeriphCLKInitTypeDefPeriphClkInit={0};/**InitializestheRCCOscillatorsaccordingtothespecifiedparameters*intheRCC_OscInitTypeDefstructure.*/RCC_OscInitStruct.OscillatorType=RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState=RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue=RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState=RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource=RCC_PLLSOURCE_HSI_DIV2;RCC_OscInitStruct.PLL.PLLMUL=RCC_PLL_MUL16;if(HAL_RCC_OscConfig(&RCC_OscInitStruct)!=HAL_OK){Error_Handler();}/**InitializestheCPU,AHBandAPBbusesclocks*/RCC_ClkInitStruct.ClockType=RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider=RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider=RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider=RCC_HCLK_DIV1;if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct,FLASH_LATENCY_2)!=HAL_OK){Error_Handler();}PeriphClkInit.PeriphClockSelection=RCC_PERIPHCLK_ADC;PeriphClkInit.AdcClockSelection=RCC_ADCPCLK2_DIV6;if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit)!=HAL_OK){Error_Handler();}}/*USERCODEBEGIN4*/voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){ if(htim->Instance==htim1.Instance) //定时器1触发中断 { time_1ms++; if(time_1ms>=500) { time_1ms=0; time_500ms=1; } time_ms_ms++; if(time_ms_ms>=1300) { time_ms_ms=0; time_1400ms=1; } if(mode==1&&relay_falg==1) { time_ms++; if(time_ms>=1000) { time_ms=0; if(time_s>0) time_s--; } }time_1++;if(time_1>=1000){time_1=0;flag_1=1;}time_2++;if(time_2>=1600){time_2=0;flag_2=1;} //定时器中串口2处理过程if(uart2_num!=0)//串口接收到数据传来 { uart2_time++;//计时开始 if(uart2_time>=10)//一帧数据接受完成 {//将标志位清零 uart2_time=0; uart2_num=0;//接收标志位置1 uart2_rx_flag=1; } } }}//串口回调函数使用方法voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart){

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论