【Proteus仿真】【STM32单片机】大棚远程监测控制

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

系统运行后,LCD1604显示传感器检测的环境温湿度、土壤湿度、光照强度、CO2浓度和阈值;可通过上位机远程观察传感器采集的数据显示;可通过K3键进入阈值设置模式,K1和K2调节,K4确定。如果温度高于上限,散热;如果温度低于下限,加热;如果温度正常,关闭;如果湿度高于上限,除湿;如果湿度低于下限,加湿;如果湿度正常,关闭;如果土壤湿度低于下限,加水;如果光照低于下限,补光;如果CO2高于上限,排气;


二、软件设计

/*
作者:嗨小易(QQ:3443792007)

*/


//系统数据显示
void sys_data_show(void)
{
	static u8 cnt=0;
	while(1)
	{
		if(sys_ctrl.mode==0)
		{
			//DHT11温湿度显示
			lcd1604_show_nums(3,0,sys_ctrl.temp,2,0);
			lcd1604_show_nums(3,1,sys_ctrl.humi,2,0);
			//土壤湿度显示
			lcd1604_show_nums(3,2,sys_ctrl.trhumi,2,0);
			//光照强度显示
			lcd1604_show_nums(13,2,sys_ctrl.light,2,0);
			//CO2浓度显示
			lcd1604_show_nums(4,3,sys_ctrl.co2,2,0);
			
			//温度阈值显示
			lcd1604_show_nums(7,0,sys_ctrl.templ,2,0);
			lcd1604_show_nums(10,0,sys_ctrl.temph,2,0);
			//湿度阈值显示
			lcd1604_show_nums(7,1,sys_ctrl.humil,2,0);
			lcd1604_show_nums(10,1,sys_ctrl.humih,2,0);
			//土壤湿度阈值显示
			lcd1604_show_nums(7,2,sys_ctrl.trhumil,2,0);
			//光照阈值显示
			lcd1604_show_nums(13,3,sys_ctrl.lightl,2,0);
			//CO2阈值显示
			lcd1604_show_nums(8,3,sys_ctrl.co2h,2,0);
			
			//发送数据到远程APP
			cnt++;
			if(cnt%10==0)
			{
				printf("\r\n温度:%d°C,湿度:%d%%\r\n",sys_ctrl.temp,sys_ctrl.humi);
				printf("土壤湿度:%d%%\r\n",sys_ctrl.trhumi);
				printf("光照强度:%d%%\r\n",sys_ctrl.light);
				printf("CO2浓度:%d%%\r\n",sys_ctrl.co2);
			}
		}
		
		//阈值闪烁
		switch(sys_ctrl.mode)
		{
			case 1://温度下
				lcd1604_show_string(7,0,"  ");
				delay_ms(1);
				lcd1604_show_nums(7,0,sys_ctrl.templ,2,0);
				break;
			case 2://温度上
				lcd1604_show_string(10,0,"  ");
				delay_ms(1);
				lcd1604_show_nums(10,0,sys_ctrl.temph,2,0);
				break;
			case 3://湿度下
				lcd1604_show_string(7,1,"  ");
				delay_ms(10);
				lcd1604_show_nums(7,1,sys_ctrl.humil,2,0);
				break;
			case 4://湿度上
				lcd1604_show_string(10,1,"  ");
				delay_ms(1);
				lcd1604_show_nums(10,1,sys_ctrl.humih,2,0);
				break;
			case 5://土壤湿度
				lcd1604_show_string(7,2,"  ");
				delay_ms(1);
				lcd1604_show_nums(7,2,sys_ctrl.trhumil,2,0);
				break;
			case 6://光照
				lcd1604_show_string(13,3,"  ");
				delay_ms(1);
				lcd1604_show_nums(13,3,sys_ctrl.lightl,2,0);
				break;
			case 7://CO2
				lcd1604_show_string(8,3,"  ");
				delay_ms(1);
				lcd1604_show_nums(8,3,sys_ctrl.co2h,2,0);
				break;
		}
		
		break;			
	}
}

//系统数据设置
void sys_data_set(void)
{
	u8 key=0;
	key=KEY_Scan(0);
	//模式设置
	if(key==KEY3_PRESS)
	{
		sys_ctrl.mode++;
		if(sys_ctrl.mode>7)sys_ctrl.mode=1;
	}
	//在设置模式下,加
	else if(key==KEY1_PRESS)
	{
		switch(sys_ctrl.mode)
		{
			case 1://温度下
				sys_ctrl.templ++;
				if(sys_ctrl.templ>99)sys_ctrl.templ=0;
				break;
			case 2://温度上
				sys_ctrl.temph++;
				if(sys_ctrl.temph>99)sys_ctrl.temph=0;
				break;
			case 3://湿度下
				sys_ctrl.humil++;
				if(sys_ctrl.humil>99)sys_ctrl.humil=0;
				break;
			case 4://湿度上
				sys_ctrl.humih++;
				if(sys_ctrl.humih>99)sys_ctrl.humih=0;
				break;
			case 5://土壤湿度下
				sys_ctrl.trhumil++;
				if(sys_ctrl.trhumil>99)sys_ctrl.trhumil=0;
				break;
			case 6://光照下
				sys_ctrl.lightl++;
				if(sys_ctrl.lightl>99)sys_ctrl.lightl=0;
				break;
			case 7://CO2上
				sys_ctrl.co2h++;
				if(sys_ctrl.co2h>99)sys_ctrl.co2h=0;
				break;
		}
	}
	//在设置模式下,减
	else if(key==KEY2_PRESS)
	{
		switch(sys_ctrl.mode)
		{
			case 1://温度下
				sys_ctrl.templ--;
				if(sys_ctrl.templ<0)sys_ctrl.templ=99;
				break;
			case 2://温度上
				sys_ctrl.temph--;
				if(sys_ctrl.temph<0)sys_ctrl.temph=99;
				break;
			case 3://湿度下
				sys_ctrl.humil--;
				if(sys_ctrl.humil<0)sys_ctrl.humil=99;
				break;
			case 4://湿度上
				sys_ctrl.humih--;
				if(sys_ctrl.humih<0)sys_ctrl.humih=99;
				break;
			case 5://土壤湿度下
				sys_ctrl.trhumil--;
				if(sys_ctrl.trhumil<0)sys_ctrl.trhumil=99;
				break;
			case 6://光照下
				sys_ctrl.lightl--;
				if(sys_ctrl.lightl<0)sys_ctrl.lightl=99;
				break;
			case 7://CO2上
				sys_ctrl.co2h--;
				if(sys_ctrl.co2h<0)sys_ctrl.co2h=99;
				break;
		}
	}
	//确定
	else if(key==KEY4_PRESS)
	{
		sys_ctrl.mode=0;
	}
}

//应用控制系统
void appdemo_show(void)
{
	u8 i=5;
	sys_parm_init();//系统参数初始化
	DHT11_Init();
	KEY_Init();
	ctrl_pin_init();
	pcf8591_init();
	USART1_Init(9600);
	while(i--)
	{
		//读取DHT11温湿度值
		DHT11_Read_Data(&sys_ctrl.temp,&sys_ctrl.humi);
		//获取土壤湿度
		sys_ctrl.trhumi=pcf8591_read_adcvalue(0);
		sys_ctrl.trhumi=pcf8591_read_adcvalue(0);
		sys_ctrl.trhumi=cal_map(sys_ctrl.trhumi,0,255,0,99);	
		//获取光照强度
		sys_ctrl.light=pcf8591_read_adcvalue(1);
		sys_ctrl.light=pcf8591_read_adcvalue(1);
		sys_ctrl.light=cal_map(sys_ctrl.light,0,255,0,99);
		//获取CO2浓度
		sys_ctrl.co2=pcf8591_read_adcvalue(2);
		sys_ctrl.co2=pcf8591_read_adcvalue(2);
		sys_ctrl.co2=cal_map(sys_ctrl.co2,0,255,0,99);
		delay_ms(100);
	}
	lcd1604_init();//LCD1604初始化
	sys_open_show();//系统初始界面显示

	while(1)
	{
		sys_data_get();//系统数据获取
		sys_data_show();//系统数据显示
		sys_data_set();//系统数据设置
		sys_fun_ctrl();//系统功能控制		
	}
}




三、实验现象

B站演示视频:https://space.bilibili.com/444388619

【Proteus仿真】【STM32单片机】大棚远程监测控制_第1张图片
【Proteus仿真】【STM32单片机】大棚远程监测控制_第2张图片
【Proteus仿真】【STM32单片机】大棚远程监测控制_第3张图片
【Proteus仿真】【STM32单片机】大棚远程监测控制_第4张图片
【Proteus仿真】【STM32单片机】大棚远程监测控制_第5张图片


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

你可能感兴趣的:(单片机,proteus,stm32)