基于STM32 的温室大棚环境检测设计

目录

一、绪论

1.1 研究背景及意义

1.2 研究内容

1.3 功能设计

二、系统方案设计

2.1 总体方案设计

三、系统硬件设计

3.1 STM32单片机最小系统

3.2 环境温度检测电路设计

3.3 土壤湿度检测电路设计

3.4 光照强度检测电路设计

3.5 水泵控制电路设计

3.6 风扇控制电路设计

3.7 灯光控制电路设计

四、系统软件设计

4.1 主程序设计

五、系统调试

5.1 系统硬件调试

5.2 系统运行测试

六、总结

七、附录


本文所涉及及所有资源均在传知代码平台可获取。

一、绪论

1.1 研究背景及意义

在传统农业灌溉模式下,监测系统通常分为两种,一是通过人工检测获得,二则是通过有线检测系统获得,前者的人工成本高、劳动强度大,而效率却相对较低,后者则会面临有线传输时信号衰减、架设线路困难等问题。同时,传统的人工灌溉不仅浪费人力资源,而且无法精准把握土壤温湿度,一定程度上造成了灌溉不均匀与水资源的浪费。而智能灌溉系统的出现有效的解决了这一系列问题。

智能灌溉系统是将物联网技术与农业技术这两者相结合,其具有现代化的田间数据采集系统,对农田中的空气温度、土壤湿度、光照强度等环境参数做到工业级的精准捕获,更高效地管理农业流程,同时该系统具备一个自动的灌溉系统,该系统根据所收集的数据做出响应,大大提高了水资源的利用和农作物的产量和品质,实现了农业生产的智能化、网络化和精准化。为此,本文给出一种基于物联网的自动浇灌系统。

1.2 研究内容

随着物联网技术蓬勃发展,对传统的农业带来巨大的挑战和机遇,基于物联网的智能农业越受到关注。本课题针对智能农业自动浇灌问题,基于嵌入式处理器平台,利用传感器技术和物联网通信技术,设计一种基于物联网的自动浇灌系统。在设计中:
(1)运用电路、传感器、物联网通信等相关工程原理,对植物生长环境参数采集、处理和分析,结合经济、安全等非技术因素,给出系统设计解决方案;
(2)根据解决方案,实现环境参数的信号检测、水阀及光强控制、无线通信电路、嵌入式处理器最小系统以及人机交互接口电路等系统硬件设计;
(3)对数据处理、数据传输及信息显示等功能进行嵌入式代码化编程,实现系统软件设计和整体调试;

1.3 功能设计

本课题采用传感器技术和物联网技术,并结合嵌入式开发平台设计了一种自动浇灌系统。可以实现对农作物生长环境的实时监控,并通过收集光照、环境温度、土壤湿度等数据,结合设置好的适宜农作物生长的环境阈值,实现自动灌溉、补光、通风等功能,达到省工省水的目的,切实实现农业灌溉智能化,本课题具有很强的实用性及巨大的市场空间。
① 监测植物生长的土壤温湿度、光照强度、环境温度;
② 控制水阀、风扇、补光灯等设备工作;
③ 可用手机APP显示数据并控制设备。

二、系统方案设计

2.1 总体方案设计

本课题针对智能农业自动浇灌问题,基于嵌入式处理器平台,利用传感器技术和物联网通信技术,设计一种基于物联网的自动浇灌系统,系统总体方案框图如图:


浇灌系统由三个传感器模块、单片机最小系统、三个外部设备和蓝牙模块组成,其中单片机最小系统以STM32F103C8T6单片机为核心控制器,STM32单片机实现对各个外设模块总体控制,负责处理从传感器采集到的数据信息,从而对各类不同信息进行相关操作,控制各个外设实现相关的功能。
外设模块其中包含温度检测模块,用于检测当前环境的温度;土壤湿度检测模块,用于获取当前土壤湿度;供电电路,给整个主机部分供电;水泵继电器,若土壤湿度小于湿度阈值,水泵继电器闭合,若土壤湿度小于土壤温度阈值,水泵继电器打开;风扇模块,继电器控制步进电机控制风扇闭合;显示模块,显示检测到的环境温度、土壤湿度、光照强度和设置的阈值;蓝牙模块,将检测到的数据通过该模块发送给移动端,也可通过该模块在移动端设置阈值。

三、系统硬件设计

3.1 STM32单片机最小系统

本次浇灌系统设计中,STM32单片机最小系统由单片机芯片STM32F103C8T6、晶振电路、复位电路、电源电路等部分组成。其原理图设计如图3.1所示。
单片机芯片选用STM32F103C8T6,该芯片是一款基于ARM Cortex-M内核STM32系列的32位的微控制器,其程序存储器容量是64KB,需要电压2V~3.6V,工作温度为-40°C ~ 85°C。计算性能方面卓越,出错率小、具有灵活的中断管理功能,价格适中。STM32F103C8T6广泛应用于电子设备中,具有复杂控制和算法的处理器。它的主要功能包括模拟数字转换(ADC)、定时器和中断控制器(TIM)、串行通信接口(USART)等功能。此外,它还拥有许多具有创新性和高性能的特性,如高速I/O端口、嵌入式硬件分支预测等,是一款成本低、功能强大的单片机芯片。

3.2 环境温度检测电路设计

环境温度传感器DS18B20模块测量农田周围环境的温度,模块具有3个引脚,其中两个分别接VCC和GND,最后一个引脚与单片机I/O口相连,传输数据。其原理图设计如图:


DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如不锈钢套管封装、TO-92封装和小轴DIP封装等,本次系统设计采用小轴DIP封装,此封装可适用于露天环境中温度较高的情况,契合农田环境的温度测量应用。本设计中封装后的DS18B20可用于检测农田环境的温度,工作精度较高,耐磨耐碰,体积小,使用方便,适用于各种狭小空间设备数字测温和控制领域。

3.3 土壤湿度检测电路设计

土壤湿度传感器YL-69模块检测盆栽的土壤湿度。YL-69是一个简单的土壤湿度传感器,是一种电容式传感器,主要使用的是湿敏电容。当环境的湿度发生改变时,会使得湿敏电容存在的环境中的介质发生改变,导致湿敏电容中的电容数值产生变化,电容的数值正比于湿度值。由于湿敏电容的灵敏度高、响应速度快、滞后量小,此外微小的体积、极低的功耗,使得湿敏电容很容易小型化和集成化。YL-69 采用CMOS工艺,可以确保其低功耗,同时还具有很高的可靠性和稳定性。传感器内部含有一个电容性聚合体湿度敏感元件和一个用能隙材料做成的温度传感器,在同一芯片上,与A/D转换器及串行接口电路实现连接。其原理图设计如图

3.4 光照强度检测电路设计

光照强度传感器模块检测农田中农作物所受到的光照强度。该模块选用光敏电阻5528,其原理图设计如图:


5528光敏电阻是一种基于半导体材料的光敏元件,其工作原理是通过外界光照强度对器件内部半导体材料的电荷载流子密度进行影响,从而改变器件的电阻值。当光照强度增加时,载流子密度增加,电阻值降低;反之,当光照强度减小时,载流子密度减小,电阻值升高。即通过不同阻值的电流来检测光照强度,测量光照强度范围为0-65535lx。

3.5 水泵控制电路设计

本系统的浇灌部分由一个JDQ-5继电器、小型抽水泵与驱动电路组成。在这个电路中,继电器JDQ-5用于控制外部高功率电器或电磁设备。将JDQ-5的控制电压与单片机的工作电压保持一致,即将JDQ-5的控制电压引脚与单片机的5V电源相连。当单片机输出的IO口电流较小时,无法直接驱动继电器,需要使用三极管等驱动器件进行缓冲放大,此时三极管型号选用S8050三极管,其是一款小功率NPN型硅管,集电极-基极电压最大可为40V,集电极电流为0.5A。当GPIO输出高电平时,NPN三极管导通,继电器线圈得到5V的供电,继电器吸合,触点闭合;当GPIO输出低电平时,NPN三极管截止,继电器线圈断电,继电器释放,触点断开。其原理图设计如图3.5所示。

3.6 风扇控制电路设计

本系统风扇模块部分由JDQ-5继电器、风扇和驱动电路组成,步进电机带动风扇旋转,其工作原理与上述水泵控制电路相似,原理图设计如图

3.7 灯光控制电路设计

本系统灯光模块部分由JDQ-5继电器、补光灯和驱动电路组成,继电器控制农田环境是否需要补光,其工作原理与上述水泵控制电路相似,原理图设计如图

四、系统软件设计

自动浇灌系统软件设计通过单片机核心控制,将采集到的环境温度、土壤湿度、光照强度实时显示在LCD1602液晶屏上,并将农田环境中的各项参数设定正常范围值,单片机核心控制器对数据进行分析处理后,若环境参数超出设定范围,则控制各模块运行;同时将检测到的数据通过无线通信模块传送到手机APP上,使手机也可以实时显示农田环境的数据,同时也可通过手机APP进行远程控制。

4.1 主程序设计

本次设计的自动浇灌系统将实现以下功能:采集农田生长环境中的温度、土壤湿度、光照强度,将采集到的数据显示在屏幕上,并通过无线通信模块将数据传输到手机APP上。若环境温度高于所设置的阈值,则打开风扇制冷,降低环境温度;若土壤湿度低于阈值,则打开水泵模块,抽水增加土壤湿度,使农作物处于适宜的土壤环境中;若光照强度低于阈值,则打开补光灯对环境进行补光。系统主程序设计流程图如图

五、系统调试

5.1 系统硬件调试

通过对浇灌系统的硬件进行调试,来检验系统的硬件电路能否正确地工作,具体包括以下五个部分:
(1)检查电路:组装好的电路要在通电之前仔细检查电路连线是否有错误,对照原理图按一定的顺序逐级检查。特别要注意电源与地是否有短路问题,集成电路和晶体管的引脚是否接错,轻轻拨动元器件观察其是否焊接牢固,以及能否实现期望的性能。确认后可以进行下一步骤。
(2)通电观察:上电前一定要调试好所需要的电源电压值,并确定电路板电源端没有短路现象后给电路通电,上电后先观察是否有异常现象,如冒烟、放电的声光、元器件发烫、异常气味等,如果有以上情况要立即切断电源,待排除故障后重新接通电源,随后测量每个集成块的电源引脚电压是否正常,以保证集成电路是否已通电工作。


(3)静态调试:不加入输入信号的情况下测量各级直流工作电压和电流是否正常。一般对晶体管和集成电路进行静态工作点调试。
(4)动态调试:加入输入信号观察电路输出信号是否符合要求,即各个传感器模块是否能正常工作。
(5)整体指标测试:对本次课题设计要求的计数指标进行测试并对测试数据进行分析,最后得出测试结论,以确定电路的技术指标是否符合设计要求。

5.2 系统运行测试

系统运行测试的目的在于处理整个系统在实际操作中发生的一些问题,如逻辑上的差错,以及对最后的结果与所期望的结果的一致性进行判定。在完成了硬件和软件的测试之后,就可以将该程序放入 MCU 进行调试。程序通电后,每个传感器模块开始正常工作,无线传输模块、LCD1602显示模块、风扇模块以及补光灯模块的工作现象如图5.7,5.8,5.9,5.10所示。
无线传输模块:单片机将数据通过蓝牙模块传输到手机APP上,此时手机APP可以实时监测农田的环境参数(光照强度5%,环境温度25℃,土壤湿度57%),且手机APP所显示的数据与LCD1602液晶显示屏中的数据一致。由下图APP界面可见,可通过手机APP设置农田环境参数的初始阈值,并可以控制或切换外部设备的工作状态,实现远程操控。


显示模块:单片机将传感器采集到的农田环境数据进行分析和处理后显示在LCD1602液晶屏上,实现农田环境参数的实时显示。


风扇模块:单片机将温度传感器DS18B20采集到的数据经过分析和处理后与提前设定的阈值相比,下图显示的是传感器捕获到的环境温度高于设定的阈值,此时风扇打开进入工作状态,当环境温度下降到适宜农作物生长的阈值时,风扇自动关闭。


补光灯模块:单片机将光敏电阻5528采集到的数据经过分析和处理后与提前设定的阈值相比,下图显示的是通过光敏电阻捕获到的光照强度低于设定的阈值,此时补光灯打开进入工作状态,当光照强度达到阈值时,补光灯会自动关闭。

六、总结

本次自动浇灌系统通过传感器对农作物生长环境中的环境温度、土壤湿度、光照强度等信息进行收集,通过单片机核心控制器对采集到的数据进行分析和处理,实现对农作物生长环境的实时监测,并判断是否需要开启控制模块来将农田环境调整到农作物生长最适宜的环境条件。最后,蓝牙HC-06模块将传感器采集到的环境参数发送到手机APP上,在手机APP上实时显示数据,也可以通过手机APP实现对各控制模块的远程操控。
本次设计的自动浇灌系统虽然已普遍实现了所需的功能,但仍在较多方面存在不足,例如极寒露天环境时无法使农田环境升温来保证农作物处在适宜的生长条件下,且系统捕获的农田环境参数会存在误差,进而影响浇灌效果。另外浇灌系统与移动端的连接不是非常稳定,可能会导致系统故障或停机。针对以上问题,我会在之后的时间里挑选合适的加热设备投入应用,对比其他传感器选取更为精准的来替换,保证数据的准确性。并精进自己的无线传输技术,实现浇灌系统与移动端的稳定连接。

七、附录

PCB设计:


部分代码:

#include "sys.h"
#include "adc.h"
#include "delay.h"
#include "lcd1602.h"
#include "ds18b20.h"
#include "timer.h"
#include "gpio.h"
#include "usart1.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#define STM32_RX1_BUF       Usart1RecBuf 
#define STM32_Rx1Counter    RxCounter
#define STM32_RX1BUFF_SIZE  USART1_RXBUFF_SIZE

unsigned int  light=0;
unsigned char temperature=0;
unsigned char setTempValue=35;        //温度设置值
unsigned int  setSoilMoisture=10;
unsigned char setLightValue=20;       //光照设置值
unsigned int  soilMoisture;           //土壤湿度

bool usart_send_flag = 0;
bool mode = 0;               //0是自动模式,1是手动模式
bool shuaxin  = 0;
bool shanshuo = 0;
bool sendFlag = 1;

unsigned char setn=0;//记录设置键按下的次数

void displayLight(void)//显示光照
{
		u16 test_adc=0;
	
	  /获取光线值
	  test_adc = Get_Adc_Average(ADC_Channel_8,10);//读取通道9的5次AD平均值
		light = test_adc*99/4096; //转换成0-99百分比
		light = light >= 99? 99: light; //最大只能到百分之99
	  if(light<=setLightValue && shanshuo)
		{
			  LCD_Write_Char(3,1,' '); 
				LCD_Write_Char(4,1,' '); 
		}
		else
		{
				LCD_Write_Char(3,1,light/10+'0'); 
				LCD_Write_Char(4,1,light%10+'0'); 
		}
}

void displaySoilMoisture(void)//显示土壤湿度
{

	   soilMoisture =100- (Get_Adc_Average(ADC_Channel_9,10)*100/4096);

		if(soilMoisture > 99)soilMoisture = 99;        //最大取百分之99

		 if(soilMoisture<=setSoilMoisture && shanshuo)
		{
			 LCD_Write_Char(9,0,' '); 
			 LCD_Write_Char(10,0,' ');
		}
		else
		{
			 LCD_Write_Char(9,0,soilMoisture/10+'0'); 
			 LCD_Write_Char(10,0,soilMoisture%10+'0');
		}
}

void displayTemperature(void)//显示温度
{
		temperature=ReadTemperature();
	  if(temperature>=setTempValue && shanshuo)
		{
			 LCD_Write_Char(12,1,' '); 
			 LCD_Write_Char(13,1,' ');
		}
		else
		{
			 LCD_Write_Char(12,1,temperature/10+'0'); 
			 LCD_Write_Char(13,1,temperature%10+'0');
		}
}

void displaySetValue(void)
{
		if(setn == 1)
		 {
				LCD_Write_Char(7,1,setSoilMoisture/10+'0'); 
			  LCD_Write_Char(8,1,setSoilMoisture%10+'0');
		 }
		 if(setn == 2)
		 {
				LCD_Write_Char(7,1,setTempValue/10+'0'); 
			  LCD_Write_Char(8,1,setTempValue%10+'0');
		 }
		 if(setn == 3)
		 {
				LCD_Write_Char(7,1,setLightValue/10+'0'); 
			  LCD_Write_Char(8,1,setLightValue%10+'0');
		 }
}

void keyscan(void)
{
	if(KEY1 == 0) //模式切换按键
	{
	 	delay_ms(10); //消抖
		if(KEY1 == 0)
		{
		 	while(KEY1 == 0); //等待按键松开
			BEEP=0;
			setn ++;
			 if(setn == 1)
			 {
					LCD_Write_String(0,0,"set the Moisture");//显示字符串
					LCD_Write_String(0,1,"       00%      ");
			 }
			 if(setn == 2)
			 {
					LCD_Write_String(0,0,"  set the Temp  ");//显示字符串
					LCD_Write_String(0,1,"       00 C     ");
				  LCD_Write_Char(9,1,0xdf);
			 }
			 if(setn == 3)
			 {
					LCD_Write_String(0,0,"  set the Light ");//显示字符串
					LCD_Write_String(0,1,"       00%      ");
			 }
			 if(setn == 4)
			 {
					LCD_Write_String(0,0,"  set the mode  ");//显示字符串
					LCD_Write_String(0,1,"       ZD       ");
				  if(mode==0)LCD_Write_String(7,1,"ZD");else LCD_Write_String(7,1,"SD");
			 }
			 displaySetValue();
			 if(setn >= 5)
			 {
					setn = 0;
				  LCD_Write_String(0,0,"Moisture:  %    ");//显示字符串
					LCD_Write_String(0,1,"Gx:  % Temp:   C");
					LCD_Write_Char(14,1,0xdf);
				  if(mode==0)LCD_Write_String(13,0,"ZD");else 

猜你喜欢

转载自blog.csdn.net/g310773517/article/details/143430701