基于单片机的温室环境数据监测系统的设计
温馨提示:这篇文章已超过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; } } } }








