基于单片机的温室环境数据监测系统的设计

2024-03-19 1162阅读

温馨提示:这篇文章已超过370天没有更新,请注意相关的内容是否还可用!

收藏和点赞,您的关注是我创作的动力

文章目录

    • 概要
    • 一、总体方案设计
      • 2.1 总体架构设计
      • 二、整体硬件电路设计
        • 3.1 主控制器电路
        • 三 系统设计概要
          • 4.2 主程序设计
          • 原理图
          • 程序
          • 四、 结论
          • 五、 文章目录

            概要

              与农业发达国家相比,我国的农业科技方面还处于刚刚起步的状态,多数自动化农业设备仍然使用在科研方。目前在温室环境数据监测方面,自动化设备比较落后。本文介绍了以STM32F103RCT6微控制器为核心,结合多种外设进行设计的温室环境数据监测系统。主要以温湿度度传感器和土壤湿度湿度传感器作为获得农田环境的传感器测量模块。以继电器为执行模块。以基本的按键输入和OLED显示屏输出信息联合作为人机交互模块。程序则采用更加方便易懂的封装好的C语言库函数进行编写。

            关键词:STM32,温室环境,数据监测,传感器

            一、总体方案设计

              以农田节水灌溉系统为对象,采用合适的STM32硬件和软件系统,设计实现温室环境数据监测系统设计。

            2.1 总体架构设计

            温室环境数据监测系统由单片机、空气温湿度检测模块、按键输入模块、电源模块、继电器模块、土壤湿度传感器模块、OLCD液晶显示器等几部分组成 。土壤湿度检测模块检测土壤的湿度并把信息传给单片机,按键模块可以对土壤的湿度范围进行设置,显示模块使用的是液晶显示屏,可以将当前土壤湿度、空气温湿度范围显示出来,继电器模块用于加水。当湿度传感器检测到土壤湿度低于设定值,并且空气温度大于设定值时,单片机引脚输出控制继电器打开。电源模块由DC电源插座、自锁开关和外接USB电源组成,如下图2.1为系统总的原理架构。

            基于单片机的温室环境数据监测系统的设计

            图2.1 系统总体框图

            二、整体硬件电路设计

            3.1 主控制器电路

            本次系统的设计是以STM32F103C8T6作为核心控制器,这是意法半导体公司ST旗下的一款增强型的微控制器。具体的实物如图3.1所示。

            基于单片机的温室环境数据监测系统的设计

            图3.1 STM32_mini开发板实物图

            在工作频率上,C8T6所使用的内核具有很优良的性能。使用外设的8MHZ精准晶振,经过倍频后能够达到72MHZ的工作频率,优良的运行速度能购极大的提高系统的运行性能。外部晶振如图3.2。

            基于单片机的温室环境数据监测系统的设计

            图3.2 系统时钟晶振

            除此之外,微控制器集成了其他很多外设,有ADC/DAC转换器。在控制系统的设计中,使用传感器,除了少数的直接已经转换完成能够字接读取的数字型传感器,绝大多数传统传感器都是输出模拟量,需要接AD转换模块。有4个通用的定时器,可以用来提供有关计数定时、输出PWM波、捕获输入等功能。有两个IIC和三个SPI接口,可以用来提供通信接口,这是扩展外设例如链接显示屏、读取传感器、读写FLASH存储芯片等都要用到这些通信接口。该芯片引脚具体如图3.3所示。

            基于单片机的温室环境数据监测系统的设计

            图3.3 STM32RCT6引脚图

            三 系统设计概要

            4.2 主程序设计

            在本次设计中我使用了时间片轮转的设计思想,设计了一个多任务并行的控制系统。这一设计思想的具体实现是在一个时间片内设置多个时间点,在每一个时间点执行相应的任务,由于控制器极高的运行频率,一次任务并不会对其他的任务造成影响,也就造成了多任务并行的现相。

            以下将介绍main函数中的各个任务:

            下图4.3所示的是检测控制任务,顾名思义该任务的作用是检测环境参数和控制继电器。该任务调用Soil_read和Read_DHT11函数检测环境参数后与湿度设定值setnum和温度设定值settem相互比较,满足湿度低且温度符合后打开水泵进行灌溉。我将LED0作为水泵的开关指示灯,水泵打开时LED0亮。

            基于单片机的温室环境数据监测系统的设计

            图4.3 主程序设计流程图

            原理图

            基于单片机的温室环境数据监测系统的设计

            基于单片机的温室环境数据监测系统的设计

            基于单片机的温室环境数据监测系统的设计

            程序

            附录(源程序):
            #include "delay.h"
            #include "key.h"
            #include "sys.h"
            #include "usart.h"	 
            #include "dht11.h" 	
            #include "oled.h"
            #include "timer.h" 
            u8 key=0;
            u8 T_Alarm_L=20;
            u8 T_Alarm_H=30;
            u8 RH_Alarm_L=20;
            u8 RH_Alarm_H=60;
            u8 Light_Alarm=50;
            u8 Light=0;
            u8 MENU_NUM=0;
            //0;主界面 1;温度低 2;温度高 3:湿度低  4:湿度高  5;光照 
            int main(void)
            {	 	    
            u8 temperature;  	    
            u8 humidity;    
            delay_init();	  //延时函数初始化	 
            NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
            OLED_Init();
            DHT11_Init();
            KEY_Init();
            	Gpio_Init();
            	delay_ms(1000);
            	while(1)
            	{	 
            	delay_ms(200);
            	key=KEY_Scan(1);		
            	switch(key)
            	{				 
            	case WKUP_PRES:	
            	if(MENU_NUM>0)
            	{
            	MENU_NUM++;	
            	OLED_Clear();
            	if(MENU_NUM==2)
            	{
            OLED_ShowNum(40,2, T_Alarm_H,2,16);  
            	OLED_ShowString(0,0,"T_H Alarm:"); 
            }else if(MENU_NUM==3)
            	{	OLED_ShowNum(40,2, RH_Alarm_L,2,16);  
            	OLED_ShowString(0,0,"RH_L Alarm:"); 
            	}else if(MENU_NUM==4)
            	{	OLED_ShowNum(40,2, RH_Alarm_H,2,16);  			OLED_ShowString(0,0,"RH_H Alarm:"); 
            				}else if(MENU_NUM==5){
            		OLED_ShowNum(40,2, Light_Alarm,2,16);  			OLED_ShowString(0,0,"Light Alarm:"); 
            				}else if(MENU_NUM==6){		MENU_NUM=0;
            		}
            		}
            		break;
            		case KEY2_PRES:	
            		if(MENU_NUM==1)
            	{
            	T_Alarm_L++;
            	OLED_ShowNum(40,2, T_Alarm_L,2,16);  
            			}else if(MENU_NUM==2)
            			{
            	T_Alarm_H++;
            	OLED_ShowNum(40,2, T_Alarm_H,2,16);  
            			}else if(MENU_NUM==3)
            			{
            	RH_Alarm_L++;
            	OLED_ShowNum(40,2, RH_Alarm_L,2,16); 
            			}else if(MENU_NUM==4){
            	RH_Alarm_H++;
            					OLED_ShowNum(40,2, RH_Alarm_H,2,16); 
            			}else if(MENU_NUM==5){
            	Light_Alarm++;
            		OLED_ShowNum(40,2, Light_Alarm,2,16); 
            			}
            			break;
            			case KEY1_PRES:	 				 if(MENU_NUM==1)
            			{
            					T_Alarm_L--;
            		OLED_ShowNum(40,2, T_Alarm_L,2,16);  
            			}else if(MENU_NUM==2)
            			{
            		T_Alarm_H--;
            	OLED_ShowNum(40,2, T_Alarm_H,2,16);  
            			}else if(MENU_NUM==3)
            			{
            		RH_Alarm_L--;
            		OLED_ShowNum(40,2, RH_Alarm_L,2,16); 
            			}else if(MENU_NUM==4){
            	RH_Alarm_H--;
            	OLED_ShowNum(40,2, RH_Alarm_H,2,16); 
            			}else if(MENU_NUM==5){
            	Light_Alarm--;
            	OLED_ShowNum(40,2, Light_Alarm,2,16); 
            			}
            		break;
            	case KEY0_PRES:	
            	if(MENU_NUM==0)
            				{
            	MENU_NUM=1; 
            	OLED_Clear();
            OLED_ShowNum(40,2, T_Alarm_L,2,16);  
            	OLED_ShowString(0,0,"T_L Alarm:"); 
            			}
            		break;
            	}
             	if(MENU_NUM==0)			//每200ms读取一次
            		{							DHT11_Read_Data(&temperature,&humidity);	//读取温湿度值				OLED_ShowString(0,0,"T:");  
            	OLED_ShowString(0,2, "RH:");  
            				OLED_ShowNum(40,0,temperature,2,16);  
            OLED_ShowNum(40,2, humidity,2,16);  
            			}	
            		//判断温度
            if(humidity!=0||temperature!=0)
            	{
            	if(temperature
            			L_T_Led_1;
            			M_T_Led_0;
            			H_T_Led_0;
            			}else if(temperatureT_Alarm_H)
            			{
            			L_T_Led_0;
            			M_T_Led_1;
            			H_T_Led_1;		  
            			}else{
            			L_T_Led_0;
            			M_T_Led_1;
            			H_T_Led_0;		  
            			}
            			//判断湿度
            	if(humidity
            			L_RH_Led_0;
            			H_RH_Led_1;
            			}else if(humidityRH_Alarm_H)
            			{
            			L_RH_Led_1;
            			H_RH_Led_0;	
            			}else{
            			L_RH_Led_1;
            			H_RH_Led_1;
            			}
            			//判断光照
            			if(Light
            				Light_Led_1;	
            			}else{
            				Light_Led_0;
            			}
            		}
            	}
            }
            
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]