基于STM32的温室环境智能调控系统仿真(仿真+代码)
资料下载地址:基于STM32的温室环境智能调控系统仿真(仿真+代码)
目录
一、功能介绍
二、仿真图
三、程序
一、功能介绍
1.单片机和app、OneNet云平台通过wifi进行通信
2.可检测二氧化碳,并显示在app和显示屏
3.可检测光照强度,并显示在app和显示屏
4.可检测温湿度,并显示在app和显示屏
5.可检测土壤湿度,并显示在app和显示屏
6.自动模式下,co2、温湿度过高时风扇转动降温/除湿/通风
7.自动模式下,土壤湿度过低时水泵转动进行灌溉
8.自动模式下,温度过低时加热片工作进行加热
9.自动模式下,光线较弱时亮灯进行补光
10.自动模式下,光线过强时舵机转动进行遮光
11.温湿度过高、土壤湿度过低、温度过低、co2过高或高低、光线过强或过弱时,蜂鸣器报警,并上报到app上提醒
12.app上可设置湿度、土壤湿度阈值,co2、温度、光线的高低阈值,显示在显示屏上
13.手动模式下,可在app上远程控制灌溉、补光、风扇、遮光、加热开关
14.可在APP上app上切换手动/自动模式
二、仿真图
主界面
阈值设定界面
三、程序
#include "key.h"
#include "main.h"
#include "string.h"
#include "oled.h"_DEF_KEY KeyType = {0xff};
_DEF_KEY_SHA KeySha[12]={0};
unsigned char xing = 0;
unsigned char password[10] = {"123456" };//默认密码
unsigned char keydata[10 ] = {0};//
uint8_t counts;//按键输入次数
uint8_t errcounts;
extern uint16_t Current_Voltage;
extern uint16_t Current_Voltage2;
extern uint16_t Current_Voltage3;
extern uint8_t shidu ;
extern uint8_t wendu ;
char lines = 0;
_DEF_KEY_VALUE Sys_Key;
_DEF_PARA_VALUE Sys_Para =
{35,15,35,15,35,15,35,15,
};
_DEF_PARA_VALUE_STR Sys_Para_Str =
{"35","15","35","15","35","15","35","15",
};void Motor_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitStructure.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8;GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8,GPIO_PIN_SET);}
void Key_GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure;KEY1_GPIO_CLK_ENABLE(); /*开启按键GPIO口的时钟*/GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1 |GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12; GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING; GPIO_InitStructure.Pull = GPIO_NOPULL;HAL_GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);HAL_NVIC_EnableIRQ(EXTI0_IRQn); /* 使能中断 */HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0);HAL_NVIC_EnableIRQ(EXTI1_IRQn); /* 使能中断 */HAL_NVIC_SetPriority(EXTI2_IRQn, 0, 0);HAL_NVIC_EnableIRQ(EXTI2_IRQn); /* 使能中断 */HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0);HAL_NVIC_EnableIRQ(EXTI3_IRQn); /* 使能中断 */HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);HAL_NVIC_EnableIRQ(EXTI4_IRQn); /* 使能中断 */HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); /* 使能中断 */HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); /* 使能中断 */}unsigned char Key_Scan(void)
{if(KeySha[1].KeyTimeCnt>const_key_time)//按键去抖{//设置键KeySha[1].KeyStartFlag=0;KeySha[1].KeyTimeCnt=0;Sys_Key.KeySet++;Sys_Key.KeySet1Flag = 1;if(Sys_Key.KeySet == 9)Sys_Key.KeySet = 0;}if(KeySha[2].KeyTimeCnt>const_key_time)//按键去抖{//参数加KeySha[2].KeyStartFlag=0;KeySha[2].KeyTimeCnt=0;if(Sys_Key.KeySet == 1){Sys_Para.tempH++;if(Sys_Para.tempH >= 95)Sys_Para.tempH = 95;}else if(Sys_Key.KeySet == 2){Sys_Para.tempL++;if(Sys_Para.tempL >= 30)Sys_Para.tempL = 30;}else if(Sys_Key.KeySet == 3){Sys_Para.PressH++;if(Sys_Para.PressH >= 95)Sys_Para.PressH = 95;}else if(Sys_Key.KeySet == 4){Sys_Para.PressL++;if(Sys_Para.PressL >= 30)Sys_Para.PressL = 30;}else if(Sys_Key.KeySet == 5){Sys_Para.GasH++;if(Sys_Para.GasH >= 95)Sys_Para.GasH = 95;}else if(Sys_Key.KeySet == 6){Sys_Para.GasL++;if(Sys_Para.GasL >= 30)Sys_Para.GasL = 30;}else if(Sys_Key.KeySet == 7){Sys_Para.humiH++;if(Sys_Para.humiH >= 95)Sys_Para.humiH = 95;}else if(Sys_Key.KeySet == 8){Sys_Para.humiL++;if(Sys_Para.humiL >= 30)Sys_Para.humiL = 30;}}if(KeySha[3].KeyTimeCnt>const_key_time)//按键去抖{//参数减KeySha[3].KeyStartFlag=0;KeySha[3].KeyTimeCnt=0;if(Sys_Key.KeySet == 1){Sys_Para.tempH--;if(Sys_Para.tempH <= 30)Sys_Para.tempH = 30;}else if(Sys_Key.KeySet == 2){Sys_Para.tempL--;if(Sys_Para.tempL <= 5)Sys_Para.tempL = 5;}else if(Sys_Key.KeySet == 3){Sys_Para.PressH--;if(Sys_Para.PressH <= 30)Sys_Para.PressH = 30;}else if(Sys_Key.KeySet == 4){Sys_Para.PressL--;if(Sys_Para.PressL <= 5)Sys_Para.PressL = 5;}else if(Sys_Key.KeySet == 5){Sys_Para.GasH--;if(Sys_Para.GasH <= 30)Sys_Para.GasH = 30;}else if(Sys_Key.KeySet == 6){Sys_Para.GasL--;if(Sys_Para.GasL <= 5)Sys_Para.GasL = 5;}else if(Sys_Key.KeySet == 7){Sys_Para.humiH--;if(Sys_Para.humiH <= 30)Sys_Para.humiH = 30;}else if(Sys_Key.KeySet == 8){Sys_Para.humiL--;if(Sys_Para.humiL <= 5)Sys_Para.humiL = 5;}}if(KeySha[4].KeyTimeCnt>const_key_time)//按键去抖{KeySha[4].KeyStartFlag=0;KeySha[4].KeyTimeCnt=0;if(Sys_Key.KeySet == 1){}}if(KeySha[5].KeyTimeCnt>const_key_time)//按键去抖{KeySha[5].KeyStartFlag=0;KeySha[5].KeyTimeCnt=0;if(Sys_Key.KeySet == 1){}}if(KeySha[6].KeyTimeCnt>const_key_time)//按键去抖{KeySha[6].KeyStartFlag=0;KeySha[6].KeyTimeCnt=0;if(Sys_Key.KeySet == 1){}}if(KeySha[7].KeyTimeCnt>const_key_time)//按键去抖{KeySha[7].KeyStartFlag=0;KeySha[7].KeyTimeCnt=0;if(Sys_Key.KeySet == 1){}}if(KeySha[8].KeyTimeCnt>const_key_time)//按键去抖{KeySha[8].KeyStartFlag=0;KeySha[8].KeyTimeCnt=0;counts++;lines--;if(lines <=0){lines = 0;}if(xing == 0)printf("8");elseprintf("*");}if(KeySha[9].KeyTimeCnt>const_key_time)//按键去抖{KeySha[9].KeyStartFlag=0;KeySha[9].KeyTimeCnt=0;counts++;if(xing == 0)printf("9");elseprintf("*");}if(KeySha[10].KeyTimeCnt>const_key_time)//按键去抖{xing ++;KeySha[10].KeyStartFlag=0;KeySha[10].KeyTimeCnt=0;}if(KeySha[11].KeyTimeCnt>const_key_time)//{int len = 0;KeySha[11].KeyStartFlag=0;KeySha[11].KeyTimeCnt=0;len = strlen(keydata);keydata[len - 1] = 0;}}void DisPlay_Para(void)
{sprintf(Sys_Para_Str.tempH,"%d ",Sys_Para.tempH);//转化为字符串sprintf(Sys_Para_Str.tempL,"%d ",Sys_Para.tempL);//转化为字符串OLED_ShowString(30,0,Sys_Para_Str.tempH);//:oled显示温度值OLED_ShowString(85,0,Sys_Para_Str.tempL);//:oled显示温度值OLED_ShowString(0,0,"TH:");//:OLED_ShowString(55,0,"TL:");//:sprintf(Sys_Para_Str.PressH,"%d ",Sys_Para.PressH);//转化为字符串sprintf(Sys_Para_Str.PressL,"%d ",Sys_Para.PressL);//转化为字符串OLED_ShowString(30,2,Sys_Para_Str.PressH);//:oled显示温度值OLED_ShowString(85,2,Sys_Para_Str.PressL);//:oled显示温度值OLED_ShowString(0,2,"PH:");//:OLED_ShowString(55,2,"PL:");//:sprintf(Sys_Para_Str.GasH,"%d ",Sys_Para.GasH);//转化为字符串sprintf(Sys_Para_Str.GasL,"%d ",Sys_Para.GasL);//转化为字符串OLED_ShowString(30,4,Sys_Para_Str.GasH);//:oled显示温度值OLED_ShowString(85,4,Sys_Para_Str.GasL);//:oled显示温度值OLED_ShowString(0,4,"FH:");//:OLED_ShowString(55,4,"FL:");//:sprintf(Sys_Para_Str.humiH,"%d ",Sys_Para.humiH);//转化为字符串sprintf(Sys_Para_Str.humiL,"%d ",Sys_Para.humiL);//转化为字符串OLED_ShowString(30,6,Sys_Para_Str.humiH);//:oled显示温度值OLED_ShowString(85,6,Sys_Para_Str.humiL);//:oled显示温度值OLED_ShowString(0,6,"HH:");//:OLED_ShowString(55,6,"HL:");//:}void Display_Para_on_off(void)
{if(Sys_Key.KeySet == 1) OLED_ShowString(30,0," "); else if(Sys_Key.KeySet == 2) OLED_ShowString(85,0," ");else if(Sys_Key.KeySet == 3) OLED_ShowString(30,2," ");else if(Sys_Key.KeySet == 4) OLED_ShowString(85,2," ");else if(Sys_Key.KeySet == 5) OLED_ShowString(30,4," ");else if(Sys_Key.KeySet == 6) OLED_ShowString(85,4," ");else if(Sys_Key.KeySet == 7) OLED_ShowString(30,6," ");else if(Sys_Key.KeySet == 8) OLED_ShowString(85,6," ");
}void ComPare_Para(void)
{if(wendu >= Sys_Para.tempL && wendu <= Sys_Para.tempH&&//温度正常shidu >= Sys_Para.humiL && wendu <= Sys_Para.humiH&&Current_Voltage >= Sys_Para.PressL && Current_Voltage <= Sys_Para.PressH&&Current_Voltage2 >= Sys_Para.GasL && Current_Voltage2 <= Sys_Para.GasH&&Current_Voltage3 >=20 &&Current_Voltage3<=80){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);
// HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
// HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
// HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
// HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET);
// HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);}if(wendu > Sys_Para.tempH || Current_Voltage> Sys_Para.PressH||shidu>Sys_Para.humiH){//温湿度过高降温除湿HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);}else if(wendu <Sys_Para.tempL){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);}else if(wendu >= Sys_Para.tempL && wendu <= Sys_Para.tempH&&shidu >= Sys_Para.humiL && wendu <= Sys_Para.humiH&&Current_Voltage >= Sys_Para.PressL && Current_Voltage <= Sys_Para.PressH){HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);}if(Current_Voltage2 <Sys_Para.GasL) {//土壤湿度过低,水泵浇水HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);}else{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);}if(Current_Voltage3 < 20){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);}else if(Current_Voltage3 >80){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);}else{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);}
}
void match_password(void)
{ComPare_Para();if(Sys_Key.KeySet == 0){if(Sys_Key.KeySet1Flag == 1){OLED_Clear() ;Sys_Key.KeySet1Flag = 0;}DisPlay_Init();Get_Pressure_Gas_Value();}else {if(Sys_Key.KeySet == 1){if(Sys_Key.KeySet1Flag == 1){OLED_Clear() ;Sys_Key.KeySet1Flag = 0;}}Display_Para_on_off();DisPlay_Para();}}