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

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

文章目录

概要

与农业发达国家相比,我国的农业科技方面还处于刚刚起步的状态,多数自动化农业设备仍然使用在科研方。目前在温室环境数据监测方面,自动化设备比较落后。本文介绍了以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 主程序设计流程图

原理图

程序

clike 复制代码
附录(源程序):


#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<T_Alarm_L)
		{
			L_T_Led_1;
			M_T_Led_0;
			H_T_Led_0;
			}else if(temperature>T_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<RH_Alarm_L)
			{
			L_RH_Led_0;
			H_RH_Led_1;
			}else if(humidity>RH_Alarm_H)
			{
			L_RH_Led_1;
			H_RH_Led_0;	
			}else{
			L_RH_Led_1;
			H_RH_Led_1;
			}
			//判断光照
			if(Light<Light_Alarm)
			{
				Light_Led_1;	
			}else{
				Light_Led_0;
			}
		}
	}
}

四、 结论

首先STM32微控芯片的基本功能完全可以满足系统设计的需要。作为一个工业级的控制芯片能够有足够的的I/O口用于外接各种外设。在此之外,微控芯片高达72MHZ的处理速度能够相当迅速的对信息判断进行处理,这对于系统性能的优化提供了先决条件。再利用DHI11、土壤湿度传感器的过程中,高集成的微控制器提供了便利的开发环境。其次是本系统采用OLED屏幕以及蜂鸣器作为报警装置,相比较于传统的人工监测更加智能化。在软件方面,使用将系统工作过程具象化的状态机思想可以及为具体的分析,完善程序逻辑。除此之外,使用模块化编程,将每一个模块当成一个任务描写,将模块的信息详尽的编写,在以后改进修改时能更简单,毕竟读程序无论是自己的还是被人的都是一件困难的事。

五、 文章目录

目 录

摘 要: I

ABSTRACT:. II

1 绪论 1

1.1 国内外的研究现状 1

1.2 设计的目的与意义 2

1.3 设计说明书的结构安排 2

2 总体方案设计 4

2.1 总体架构设计 4

2.1 核心控制器选择 4

2.2 电源电路 5

2.3 显示模块 5

3 整体硬件电路设计 6

3.1 主控制器电路 6

3.2 测量模块 8

3.2.1 测量温湿度原因 8

3.2.1 DHT11温湿度传感器 9

3.2.2 土壤湿度传感器 10

3.3 人机交互模块 11

3.3.1 显示模块 11

3.3.2 按键输入模块 13

3.4 执行模块 14

4 软件设计 15

4.1 软件设计支持 15

4.2 主程序设计 17

4.3 显示程序的设计 18

4.4 按键程序设计 19

4.5 检测模块设计 21

5 系统调试与结果 23

5.1 各个模块的调试结果显示 23

5.1.1 OLED屏幕的调试结果显示 23

5.1.2 温湿度模块调试 23

5.1.3 土壤湿度模块调试 24

5.1.4 光敏强度模块调试 24

5.1.4 报警值设置 24

5.2 总体调试结果 25

6 总结 27

7 致谢 28

参 考 文 献 29

附录(源程序): 31

相关推荐
Aczone2833 分钟前
硬件(五) 存储、ARM 架构与指令系统
arm开发·嵌入式硬件·架构
LS·Cui1 小时前
单片机按键示例功能
单片机
【ql君】qlexcel1 小时前
MCU上电到运行的全过程
单片机·嵌入式硬件·mcu·启动过程
搞一搞汽车电子1 小时前
S32K3平台eMIOS 应用说明
开发语言·驱动开发·笔记·单片机·嵌入式硬件·汽车
pQAQqa2 小时前
FreeRTOS项目(2)摇杆按键检测
stm32·单片机·嵌入式硬件·freertos
小莞尔3 小时前
【51单片机】【protues仿真】基于51单片机停车场的车位管理系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
一川月白7094 小时前
51单片机---硬件学习(跑马灯、数码管、外部中断、按键、蜂鸣器)
单片机·学习·51单片机·外部中断·蜂鸣器·数码管·跑马灯
月阳羊4 小时前
【硬件-笔试面试题-69】硬件/电子工程师,笔试面试题(知识点:电机驱动电路的反馈电路)
java·经验分享·嵌入式硬件·面试
weixin_468466857 小时前
树莓派32位与64位系统安装teamviewer远程软件
linux·单片机·自动化·树莓派·远程控制·vnc·teamviewer
沐欣工作室_lvyiyi7 小时前
2025-2026单片机物联网毕业设计题目推荐(定稿付款)
单片机·物联网·课程设计