基于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");
		else
			printf("*");
		
	}
	if(KeySha[9].KeyTimeCnt>const_key_time)//按键去抖
	{
		KeySha[9].KeyStartFlag=0;
		KeySha[9].KeyTimeCnt=0;
		counts++;
		 if(xing == 0)
			printf("9");
		else
			printf("*");
		
	}
	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();
		
	}
	
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森旺电子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值