基于STM32的环境监测系统设计与实现

摘  要

当今,环境问题成为我们最关注的问题之一,环境中的各项数据如温度、湿度、光照度、PM2.5等关乎着我们的生活品质。随着人类社会的蓬勃发展,在人的生活条件逐渐便利的同时,也对环境造成了一定程度上的影响,这就需要对环境进行检测和治理,通过根据各地的实际情况不断的调整发展方向。本次的设计就是基于单片机的检测系统,对检测环境与治理有着重大的作用和意义。

本设计以单片机为核心,实时监测温度、湿度、光照度、PM2.5的值是否超出规定范围。要实现以上要求,首先需要对系统的硬件电路进行设计,选用合适的单片机作为核心和特定的传感器来获取温度、湿度、光照度、PM2.5的数值,然后对硬件部分和软件部分进行调试,达到数据显示基本正常和具有实时性的目的。本设计选择STM32F103单片机作为核心控制元件, 包括以下模块:液晶显示屏、PM2.5检测部分、温湿度检测部分、光敏电阻部分、电源电路等。

通过各个模块之间的相互配合,能够实时监测温度、湿度、光照度、PM2.5的参数,并把数据实时显示在显示屏上。本次设计的优点有:①实时性方面比较的好,因为可以通过延时函数的设计来决定每次采样数据的间隔时间;②使用时比较的方便,随开所用,不用做复杂的前置工作;③比较经济实惠,材料钱不需要花费太多。

关键词

STM32F103单片机;DHT11温湿度传感器;激光粉尘传感器;光敏电阻

  • 绪论

1.1 研究背景意义

环境问题已然成为了我们生活中最重要的问题之一,世界在快速发展的同时,也对环境造成了一定的负面影响,如PM2.5的超标,因此造成的大雾天气等。因此环境的各项数据,如温度、光照度、大气压强、湿度、PM2.5等逐渐引起重视,这些数据对环境的治理有着非常重要的意义,通过对这些数据的分析,我们可以根据各地的实际情况对环境或政策进行治理,环境问题因此可以得到缓解。同时这些数据也关乎到我们的生活质量,只有在适宜的环境中,我们才能发展的更好,社会才会更加繁荣,人们的生活才会更加美好。

1.2 现状分析

我们国家建设了中国环境监测总站用于环境的监控,在各行业部门也已建立起初具规模的环境监测体系;较大规模的环境监控系统在我国已经非常成熟,但规模较大,应用并不广泛,小规模、智能化的环境监控系统有待开发。

现在,我们国家环境监测仪的生产厂家有一百五十多家,而且年产值高达5亿元[3]。但我们国家的环境监测仪还不能适应我国环境监测工作发展的需要。而且我们国家生产的档次不是太高,大部分都是中低档的环境监测仪器,主要表现为:技术的档次有待提高,大部分都是低水平、重复生产,规模效益比较的低;产品质量较低,性能一般不稳定,而且一致性不好,使用寿命不长,引发故障率高;研究开发能力较低,而且研究投入较少,在线监测仪器的系统配套生产的能力较低,不能适应市场的需要。

1.3 主要研究的内容

本次环境监测系统以STM32F103为核心,以温湿度传感器、光敏电阻、PM2.5传感器为输入,传感器在空气中接收模拟量,再通过单片机的数模转换,把从空气中接收到的模拟量转化成数据量,此时在进行进一步的处理,把数据量通过一定的计算转化为我们常见的密度值。最后通过代码将其表现出来,显示到显示屏上,进而起到对温度、湿度、光照、 PM2.5的检测作用。

2.1 总体设计

本设计主要研究基于单片机的环境监测仪,采用STM32F103单片机为核心,温湿度传感器、PM2.5传感器、以及光敏电阻作为输入部分,液晶显示屏作为输出部分,以显示实时数据。

所用器件包括STM32开发板以及温湿度传感器、PM2.5传感器,通过杜邦线将光敏电阻,DHT11温湿度传感器,GP2Y1010AU粉尘传感器连接起来。STM32F103分别从PM2.5模块,温湿度传感器模块,光照度检测模块获取实时的监测数据,通过特定的转换公式将其显示到LCD屏幕。

硬件系统框图如图2.1所示:

 

图2.1 硬件系统框图

2.2 STM32F103芯片

整个系统最主要的部分是STM32单片机,也是中心部分,因为需要对控制器具有较高的需求,比如控制精度、好执行速度快、稳定性好以及高灵敏度,所以选择一个具有较高性能并且经济的单片机就很重要。所以此次选用是STM32F103ZET6。

此芯片属于STM32F1系列的一种,出品的公司都是意法半导体公司,STM32F103的芯片内核是Cortex-M3[4],是属于32位RAM控制器。内存的容量也十分的大,有521K的FLASH和64K的SRAM。而且芯片的外设功能十分的丰富十分的强大,例如定时器CAN,I2C,ADC,SPI,Timer,USB,UART等。

STM32F103主频为72MHZ,其引脚有144个,但IO口个数只有112个处模拟通道外大部分的IO口能耐得住5V的电压。GPIO即通用输入输出端口,使用时通过软件来控制GPIO的使用,配置各种的输入输出的模式,从而实现和外部的信息交换等通信功能。对于GPIO的配置,此次的实验用的是库函数来配置,库函数比较的方便快捷,不用一直去查询STM32F103的手册。

同时这次的设计还用到了ADC功能,STM32F103系列-般都有3个ADC,这些ADC 可以独立使用。A/D转换主要包括积分型、并行比较型、逐次逼近型,而STM32F1的AD逐次逼近型的模拟数字转换器。具有12位。它具有18个复用通道,来自2个内部源信号、16个外部源的信号都可以被测量。这些通道的 A/D转换可以单次、连续、扫描或间断模式执行。此次的ADC的执行模式我选择的是番茨执行模。ADC 的结果可以选择左对齐或右对齐两种方式,一般来说我们会选择右对齐。然后或存储在16位数据寄存器中。这些都可以在初始化ADC的时候进行配置。利用库函数来进行配置会比较的方便。此次的设计ADC就是用库函数来进行配置的。

此次用的开发板如下:

图2.2 开发板实物图

2.3 TFTLCD液晶显示屏幕

TFTLCD就是薄膜晶体管液晶显示器。是一款非常实用的液晶显示屏幕,LCD屏一般用于家用电器,电脑成本低,可以做大屏显示,相对于OLED屏来说的话,功耗比较高,而且也需要背光板,TFT-LCD同时也被叫做真彩液晶显示器。

此次选用的LCD屏的尺寸大小为2.8寸,工作电压为3.3V,分辨率为320*240RGB,色深为16位,103的LCD接口为8080并口,LCD的显示原理如下图:

图2.3 LCD显示原理

实物图和引脚说明如下:

                

      图2.4 LCD实物图                                    图2.5  LCD原理图

2.4 光敏电阻

光敏电阻的工作原理是基于内光电效应,是用硫化隔或华硒化隔半导体材料制成的电阻器。光照强度越小,光敏电阻的阻值就愈大,随着光照强度的减少,电阻值会升高、亮电阻值可减低至10KΩ。其在无光照时,暗电阻一般可到达1MΩ,呈高阻状态,可见光敏电阻对光线非常敏感,本次选用的光敏电阻型号为GL3528光敏电阻,具有体积小,反应速度快,性能稳定等特点,具体特点如下表:

表2.1光敏电阻参数

型号

限大电压

限大功耗

环境温度

光谱峰值

亮电阻

暗电阻

响应时间

GL3528

100V

50mW

0~70℃

540nm

10~20kΩ

1MΩ

上升:30ms

下降:30ms

此次的光敏电阻实物图如下:

                   

                                  图2.6 光敏电阻实物图        

2.5 温湿度传感器

此次的设计使用的温湿度传感器的名称为DHT11,它直接就输出的是已校准好的数字信号,因为其内部的8位单片机将其模拟信号转化为数字信号,数字采集功能和温湿度传感功能都比较先进精确,所以产品具有比较高的可靠性与长期稳定性,具有成本便宜、较强的抗干扰能力、信号传输距离长、响应时间短、校准比较精确等特点。

DHT11湿度的测量范围是20%-90%RH,温度的测量范围是0~50℃

湿度的测量精度为±5%RH,温度的测量精度为±2℃,湿度的分辨率为1%RH,温度的分辨率为1℃。传感器内部的因为有NTC测温器件和电容式感湿器件,还有一个性能比较高的8位单片机与之相连接,所以非常的方便。DHT11在非常多的生活领域都很常见,例如家里的空调,汽车上,气象站,甚至是医疗方面。


 

DHT11有四个引脚分别为VDD脚:供电引脚,供电范围为3.3~5.5V,NC脚:空脚悬空,DATA脚:单总线串行数据,GND脚:接地。实物图如下:

图2.7  DHT11实物图           

2.6 PM2.5传感器

本次用的PM2.5传感器为GP2Y1010AU,是日本夏普公司生产出来的或承诺的传感器,在检测非常小的颗粒、例如香烟颗粒等,是非常有效果的,他是通过其检测到空气中的灰尘反射光然后依靠输出脉冲的高度来判断颗粒的浓度的,因为GP2Y1010AU内部具有一个发光二极管和一个对光比较灵敏的光电晶体管,两者成相对布置。

该传感器具有很低的电流消耗最大为20毫安 ,正常情况下11毫安,其工作的电压在5-7V。输出是一个模拟电压,而且这个模拟电压和所测得粉尘浓度成正比,GP2Y1010AU敏感性非常好,为0.5V/0.1mg/m3。它的上面有四个管脚需要连接,分别是VCC、GND、PWM、OUT。VCC、GND分别连接STM32F103的VCC、GND。

        

图2.8 PM2.5传感器模块

3.1 整体程序处理

图3.1整体流程图

整体流程图如图3.1所示,在启动STM32F103后,先配置ADC,定时器等设置,初始化STM32,之后初始化LCD屏幕,接下来就可以处理数据了,接下来可以先处理温湿度传感器的数据,因为DHT11直接就输出的是数字量所以可以直接拿来用,而光敏电阻和PM2.5传感器则需要通过获取传感器的ADC的值,因为STM32的ADC是12位的,所示获取的数值的范围为0~4096,再在程序中通过一些特定的计算就可以将其转化为单位为LX和μg/m3的这些在我们生活中常见的单位。最后使用LCD的一些显示方法函数即可成功显示到LCD屏幕上。通过延时函数函数后再次进入获取参数阶段,以达到实时获取数据的目的。

3.2 温湿度传感器取值

DHT11与单片机连接如下图所示,GND连接地线,DATA线连接一个上拉电阻,VDD接电源,DATA用于STM32F103与DHT11之间的数据传输,把已经转换好的数字数据送入单片机中,数据分为小数部分和整数部分两部分,我们在此次的设计只用整数部分,而小数部分可以用于以后扩展使用。

通过DATA导线传输的数据长度为为40bit,首先传输的数据是湿度的整数和小数位,两个都是8bit。然后传输的就是温度的整数和小数位,两个同样也是8bit,最后也是8bit的校验位。校验位是用来校验数据是否正确,具体就是将温湿度的整数位和小数位这4个8bit相加,如果结果等于8bit的校验位,则数据是正确有效的。

STM32F103发送一次开始信号后,DHT11开始启动,等候主机开始信号结束后,DHT11发送回应信号,发出40bit长的数据,同时触发一次采集信号,获得的数据在DHT11的单面机中已经变成数字数据,所以可以直接使用。

                  

 

图3.2  DHT11的管脚连接

3.3 光敏电阻取值

光敏电阻在没有光照的情况下的阻值为1MΩ,所以串联一个1kΩ大小的电阻,接上3.3v电压,在有光照时测他们两个中间的电压,光敏电阻的阻值会随着光照的增加而减少,所以随着光照的增强,测定的电压会越来越小,用获取的电压计算出光敏电阻的电阻,电压U计算公式和光敏电阻阻值如下,设获取的ADC数值为X,光敏电阻阻值为Y。

U =  ( X / 4096 )* 3.3V               (3.1)

利用串联电流相等原理可得:

Y =  (U*1KΩ)/(3.3v-U)              (3.2)

对着光敏电阻随光照阻值变化曲线即可获得光照度变化曲线如下,因为其为一个不规律的曲线,设光照的未知数为为L,所以其近似其公式为log Y= -log L + 3,将光敏电阻,阻值Y带入即可获得光照度的数值。

     图3.3  阻值与光照的关系                                    图3.4  光谱响应特性

3.4 PM2.5取值

通过GP2Y1010AU来获取模拟量,通过ADC转换把模拟量转化为数字量,通过对数字量的进一步处理转化成电压,通过公式的计算转化为浓度,显示在LCD上。

GP2Y1010AU插上电源后1秒内会稳定,然后正常地运作,可以进行检出。因为ADC转换器是12位的,所以ADC的范围为0 ~4695,即AD_PM的值的范围为0 ~4695,根据GP2Y1010AU传感器的手册,计算公式如下:

 PM = 0.17*AD_PM - 0.1                 (3.3)

此时运算出的结果是一次PM2.5的值,要想值比较的精确,可以进行多次的检测,然后取平均数即可。此次取30个数据来取值平均数作为一次PM2.5的结果。然后通过延时函数后再进行取30次数据取平均值的操作,以此来体现实时性。

4.1硬件线路的连接

按照其设定好的原理图开始进行连接,用的导线是杜邦线,杜邦线可用于实验板的引脚扩展,无需焊接,非常的方便,将LCD屏幕插入单片机STM32F103的开发板上,将光敏电阻引出的模拟输入端口连接到单片机STM32F103芯片GPIO的PF8处。DHT11温湿度传感器的DATA线连接到GPIO的PG11处,最后是PM2.5传感器的模拟输入端口ANALOG连接到GPIO的PA0处,将DIGITAL连接到GPIO的PB1处,硬件电路连接完成。

4.2 温湿度调试

在不做任何处理的条件下,LCD屏幕温湿度显示如下图所示:

 

图4.1 温湿度正常情况时

此时对着温湿度传感器哈一口气后温湿度发生了变化,如下图所示:

图4.2 处理后的温湿度

4.3 光照度调试

在不做任何处理情况下的光照度的值为图4.1所示,此时拿一个小手电筒照向光敏电阻,即可发现光照度显著增加,如下图所示:

 

图4.3 光照度处理过后

4.4  PM2.5调试

在不做任何处理情况下的PM2.5的值为图4.1所示,此时点燃烟雾(已在有防火的条件下进行),让PM2.5传感器靠近烟雾,发现PM2.5浓度显著增加,如下图所示:

              

4.4  PM2.5处理过后

因为LCD的屏幕显示的东西太过于简陋,可以稍加一些其他的东西润色一下,例如图片等,把其他的数据文字放到比较适当的位置,此时可用如下图所示的图片取模软件进行取模,软件及取模条件如下图5.1.1所示:

    

图5.1 取模软件

           

    

图5.2取模软件设置条件

先选好要加入的图片,按照上图5.1.2所示进行配置,配置成功之后,点击保存按钮,即可生成文件,加入工程之后,在主函数中进行声明,声明过后即可在主函数中进行使用。此时主要是调用LCD屏幕的方法进行在LCD屏幕显示方法如下图所示:

图5.3 显示图片的方法

在添加完图片之后,可以把其他的参数位置进行调整一下,以免被挡在图片的后面,加入图片调整文字后的效果如下图所示:

         

图5.4展示效果图

本设计主要就是检测温度、湿度、光照度、PM2.5的数值,以此来对环境中的数值进行分析,对环境的监测和环境的治理有着非常大的意义,同时也让我对环境的现状以及一些关于环境的知识有了进一步 的了解。

这次的设计用的是STM32F103作为主控制器,传感器用的是GP2Y1010AU粉尘传感器、光敏电阻、DHT11温湿度传感器,结合硬件方案与软件编写,设计出可以检测温度、湿度、光照度、PM2.5在空气中的数值的功能。之所以选择DHT11温湿度传感器是因为DHT11温湿度传感器直接输出的是数据,我们只需要获取它的数据即可,非常的便捷快速。而GP2Y1010AU粉尘传感器和STM32F103在我以前的课程设计中有使用到,对两者比较的熟悉,所以自然而然的选择他们。

该环境监测系统操作方便,给单片机烧录程序后,只需接上电源即可使用。通过延时函数,每隔一段时间就会从空气中获取相应的参数,并可以将其显示在显示屏幕上。要监测各个传感器获取的数据是否有效,需要先在不做任何操作的情况下观察各个传感器的值是否处于正常值的范围内,然后做如同第四章一样的调试,观察传感器是否能正常工作,如果结果和第四章结果相同,则数据有效。此次设计的不足之处在于由于没有成功的设计出当数据超出一定值时会发出警报或者显示一张图片等,今后会加强此方面的学习。


附录A 本次设计的硬件电路图

          光敏电阻                           PM2.5模块                温湿度模块

LCD显示屏

附录B main 中的主要程序

#include "dht11.h"

#include "adc.h"

#include "pm25.h"

#include "usart.h"

#include "stdio.h"

extern const unsigned char gImage_MYX[106400];



char show_buff[30] = {0};

u32 light = 0;

u8 temperature;       

u8 humidity;

double pm = 0;

int main(void)

{  

delay_init();

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  

uart_init(115200);

LED_Init();

LCD_Init();//

MYADC_Init();

Adc_Init();

POINT_COLOR=RED;

    LCD_Clear(WHITE);

  LCD_ShowString(25,0,200,16,16,(u8 *)"Environmental monitoring");

  LCD_ShowString(95,20,200,16,16,(u8 *)"system");



LCD_Show_Photo(25,40,200,198, gImage_MYX);

while(DHT11_Init())

{

delay_ms(200);

  delay_ms(200);

}

while(1)

{  

light = Get_Adc3();//光照度

sprintf(show_buff,"light: %d   ",light);

LCD_ShowString(30,240,100,16,16,(u8 *)show_buff);



DHT11_Read_Data(&temperature,&humidity);

sprintf(show_buff,"temp: %dC ",temperature);温度

LCD_ShowString(130,240,100,16,16,(u8 *)show_buff);



sprintf(show_buff,"humi: %d%%",humidity);湿度

LCD_ShowString(30,265,100,16,16,(u8 *)show_buff);



pm = Get_GP2Y_Average(30);//PM2.5

sprintf(show_buff,"pm2.5: %3.1f ug/m3     ",pm);

LCD_ShowString(30,290,140,16,16,(u8 *)show_buff);



delay_ms(1000);

}

}

猜你喜欢

转载自blog.csdn.net/qq_58404700/article/details/131315739