站内搜索
发作品签到
专业版

STM32物联网环境检测

工程标签

2.8k
0
0
7

简介

基于STM32的物联网环境检测系统,连接阿里云,可以实时检测屋内的环境数据

简介:基于STM32的物联网环境检测系统,连接阿里云,可以实时检测屋内的环境数据

开源协议

GPL 3.0

创建时间:2023-11-30 10:50:40更新时间:2024-03-04 16:34:09

描述

1.1  研究背景及其意义

随着经济的快速发展和城市化进程的加快,人们的生活水平不断提高,对生活环境的舒适度和健康性也越来越关注。然而,现代建筑中的封闭性和密集性使得室内环境问题日益凸显。室内空气质量、温度、湿度、光照强度等环境因素直接关系到人们的身体健康和生活质量。因此,研究室内环境监测技术,实现对室内环境的实时监测和调控,对于提高人们的生活质量和健康水平具有重要意义。

目前,市场上已经存在一些室内环境监测设备,但大部分设备功能单一,只能监测温度、湿度等基本环境参数,而且价格较高。为了满足人们对室内环境监测的需求,降低成本,提高监测精度和可靠性,本文提出了一种基于单片机的室内环境监测系统。该系统可以实时监测室内温度、湿度、烟雾、空气质量和光照强度等多个环境参数,并通过LCD显示屏显示监测数据,同时具有报警功能,还能通过物联网上传阿里云,可为人们提供舒适的室内环境。

室内环境监测对于人们的健康和生活质量具有重要意义。室内环境质量与人们的日常生活密切相关,不良的室内环境会对人体健康产生不良影响。通过实时监测室内环境参数,可以及时了解室内环境状况,采取相应的措施改善室内环境,提供舒适的居住和工作环境。还可以降低室内环境问题的发生率和影响程度。通过对室内环境的实时监测,可以及时发现和解决室内环境问题,如空气污染、潮湿、光照不足等。这样可以减少室内环境问题对人们的身心健康造成的影响,提高生活质量。

 

1.2  研究的内容和要求

基本功能:

检测当前环境的温度湿度等相关参数,每过10秒通过WIFI模块把测得数据发送到手机,

1)采用STM32最小系统板

2)温湿度传感器DHT11

3WIFI模块:ESP8266

发挥部分:

1) 光照传感器  GY-30  

2) 气体传感器  MQ135  

3) 烟雾传感器  MQ2

   4  气压传感器  BMP180

   ESP8266每隔10秒把检测到的数据发送到阿里云服务器,手机可以通过微信小程序,查看数据。

 

 

 

.系统设计

2.1 系统总体结构

基于STM32单片机的室内环境检测终端主要包括传感器模块、数据处理模块、显示模块和报警模块和数据上传模块。传感器模块用于采集室内环境参数,数据处理模块对采集到的数据进行处理和分析,显示模块用于实时显示监测数据,报警模块用于发出报警信号,数据上传模块用于把数据上传到阿里云。

2.2 传感器模块

传感器模块包含了DHT11温湿度模块,GY-30光照度模块,MQ135空气质量模块,MQ-2烟雾模块,BMP180测气压模块。

DHT11模块是一款温湿度传感器,能够测量环境中的温度和湿度。该传感器具有数字信号输出,内置了校准系数,因此无需用户进行复杂电路处理即可直接读取精确的数据。DHT11采用了专用的数字模块采集技术和温湿度传感技术,确保了产品的可靠性和稳定性。此外,它还具有响应速度快、抗干扰能力强和性价比高等优点。DHT11模块的工作电压范围是3.3V5.5V,适用于各种场合。它的温度测量范围为050摄氏度,湿度测量范围为20%90%相对湿度。温度误差为+-2摄氏度,湿度误差为+-5%DHT11模块的接口简单,通过一个I/O口即可实现与微控制器的通信。采用单总线协议,用户可以通过简单的编程实现对DHT11模块的控制和数据读取,进而获取温度和湿度信息。这使得DHT11模块在智能家居、环境监测、农业等领域有着广泛的应用。

GY-30模块是一款基于I2C通信的16位数字型光强传感器模块。它以BH1750数字型光强感应芯片为核心,搭配一些外围驱动电路。GY-30模块具有高精度、直接数字输出、省略复杂计算和标定、不分环境光源、接近视觉灵敏度分光特性以及高可靠性等优点。GY-30模块有5个引脚,分别为VCC(外接供电电源输入端)、GND(地线)、SDAI2C通信模式数据信号)、SCLI2C通信模式时钟信号)和ADDRI2C地址引脚)。其光强测量范围最大可达100000勒克斯。该模块可以广泛应用于各种场景,如手机、LCD TV、便携式游戏机、数码相机、数码摄像机、车载导航、LCD显示等领域。通过与微控制器、单片机或开发板(如ArduinoSTM32ESP32等)连接,可以实现对环境光照强度的监测和控制。

MQ135模块是一款空气质量检测传感器模块,主要用于检测空气中的二氧化碳、酒精、苯、氮氧化物、氨等气体的浓度。该模块采用气敏材料二氧化锡(SnO2)作为传感器,当传感器所处环境中存在有害气体时,气敏材料的电导率会发生变化,从而可以检测空气质量。

MQ135模块具有4个引脚,分别为VCC(接5V直流电源输入)、GND(接地)、DO(模拟信号输出)和AO(数字信号[TTL]输出)。模块内部有一个可调电位器,用于调节灵敏度。MQ135模块可以与微控制器、单片机或开发板(如ArduinoSTM32ESP32等)连接,通过读取模拟信号输出端(A0)的电压值,再经过AD转换和一定的公式转换,可以得到空气中各种气体的浓度值。此外,该模块也可用于检测烟雾等空气污染物。

MQ135模块广泛应用于智能家居、环境监测、农业、工业等领域,用于实时监测和控制空气质量。

MQ2模块是一款烟雾气敏传感器模块,主要用于检测空气中的可燃气体,如液化气、丙烷、氢气、天然气等。该模块采用气敏材料二氧化锡(SnO2)作为传感器,当传感器所处环境中存在可燃气体时,传感器的电导率会随空气中可燃气体的浓度增加而增大。通过简单的电路,可以将电导率的变化转换为与气体浓度相对应的输出信号。

MQ2模块具有以下几个特点:

1. 双路信号输出:模拟量输出和TTL电平输出。

2. TTL输出有效信号为低电平:当输出低电平时,信号灯亮,可直接接单片机。

3. 模拟量输出0~5V电压:浓度越高,电压越高。

4. 对液化气、天然气、城市煤气有较好的灵敏度。

5. 具有长期的使用寿命和可靠的稳定性。

6. 快速的响应恢复特性。

MQ2模块可以应用于家庭或工厂的气体泄漏监测装置,适宜于液化气、丁烷、丙烷、甲烷、酒精、氢气、烟雾等监测装置。通过与微控制器、单片机或开发板(如ArduinoSTM32ESP32等)连接,可以实现气体泄漏的实时监测和控制。

BMP180模块是一款高精度的数字气压传感器模块,可以用于测量大气压力和海拔高度。该模块基于BMP180气压传感器,采用I2C通信接口,具有高精度、低功耗、响应速度快等特点。BMP180模块具有以下特点:

1. 高精度:BMP180模块可以提供高精度的气压和高度测量结果,其测量精度可以达到0.1米。

2. 低功耗:该模块的工作电流小于2mA,待机电流小于1uA,非常适合需要长时间运行的场合。

3. 响应速度快:BMP180模块的响应时间短,可以在短时间内完成气压和高度的测量。

4. 抗干扰能力强:该模块具有很强的抗干扰能力,能够在各种恶劣环境下稳定工作。

5. I2C通信接口:BMP180模块采用I2C通信接口,可以方便地与各种微控制器连接。

BMP180模块可以广泛应用于气象、地质、农业、林业、航空、无人机等领域,用于实时监测大气压力和海拔高度。

2.3 数据处理模块

数据处理模块采用STM32F407ZGT6作为核心控制器,负责与传感器模块通信,获取实时监测数据,并将数据显示在LCD中。数据处理模块还负责对数据进行处理和分析,包括计算温度、湿度的平均值,判断环境参数是否超过设定阈值等。同时把数据传给ESP8266模块。

2.4 显示模块

显示模块采用LCD显示屏,用于实时显示室内环境参数。LCD显示屏可以显示温度、湿度、海拔、烟雾浓度、空气质量等环境参数。

2.5 报警模块

报警模块包括蜂鸣器和LED灯和语音播放器。当环境参数超过设定阈值时,蜂鸣器会发出报警声,LED灯闪烁,语音播放器提醒人们注意室内环境质量。同时,显示屏上也会显示相应报警信息。

.系统实现

3.1 硬件设计

基于STM32单片机的室内环境检测终端硬件部分主要包括STM32单片机、传感器、LCD显示屏、蜂鸣器、LED灯等。硬件电路设计主要包括电源电路、传感器接口电路、LCD显示屏接口电路、蜂鸣器接口电路等。通过排母将各个传感器连接起来,然后通过立创EDA打板。然后完成焊接和调试。

硬件原理图:

 

硬件PCB:

 

3.2 软件设计

室内环境检测终端的软件设计主要包括数据采集、数据处理、显示和报警等功能。数据采集程序负责与传感器模块通信,获取实时监测数据。数据处理程序对采集到的数据进行处理和分析,判断环境参数是否超过设定阈值。显示程序负责将实时监测数据显示在LCD显示屏上。报警程序负责发出报警信号,提醒人们注意室内环境质量。

使用FreeRTOS将各个传感器分成一个个任务,确保实时性。

//任务1的的入口,连接阿里云,并上传数据

void ESP01Function( void *pvParameters )

{

    int i=0;

    LCD_ShowString(30,0,(u8*)"EDSystem",BLUE,WHITE,32,1);

    //wifi模块和MQTT协议初始化

        while(esp8266_mqtt_init())

        {

                 printf("esp8266_mqtt_init ...");

                 Delay_ms(1000);

        }

    while(1)

    {

        publish_data();

        vTaskDelay(60000);     //60S发送一次心跳包

        if(i==6)

        {

            i=0;

            if(mqtt_send_heart()==-1)

            {

                esp8266_mqtt_init();

            }

        }

        i++;

       

        //当心跳包没有回应,重连阿里云服务器

    }

}

 

//任务2的的入口,连接手机蓝牙并传数据

void BlueToothFunction( void *pvParameters )

{

    while(1)

    {

        vTaskDelay(8000);    //8秒发一次数据

        BlueTooth_SendString("温度:");

        BlueTooth_SendString(tmp);

        BlueTooth_SendString("C\r\n");

        BlueTooth_SendString("湿度:");

        BlueTooth_SendString(Humidity);

        BlueTooth_SendString("%\r\n");

       

    }

   

}

 

//任务3的的入口,获取温湿度,刷新在oled

void DHT11Function( void *pvParameters )

{

    xSemaphoreTake(MyMutex,portMAX_DELAY);

    OLED_ShowString(1,1,"Tmp:  C");

    OLED_ShowString(2,1,"%RH:  %RH");

    LCD_ShowString(10,42,(u8*)"Tmp:  C",BLUE,WHITE,32,1);

    LCD_ShowString(10,74,(u8*)"%RH:  %RH",BLUE,WHITE,32,1);

    xSemaphoreGive(MyMutex);

    while(1)

    {  

       

        if(DHT11_ReadData(DHT11Data)==true)

        {  

            if(DHT11Data[2]>30 || DHT11Data[0]>70)   //温湿度报警

            {

                xSemaphoreGive(SemaphoreNum);   

                xSemaphoreGive(SemaphoreNum);

               

                xSemaphoreGive(g_sem_tmp);

               

            }

            sprintf(tmp,"%d",DHT11Data[2]);           //转化为字符串

            sprintf(Humidity,"%d",DHT11Data[0]);      //转化为字符串

        }

        xSemaphoreTake(MyMutex,portMAX_DELAY);

        LCD_ShowIntNum(70,42,DHT11Data[2],2,RED,WHITE,32);//显示整数变量

        LCD_ShowIntNum(70,74,DHT11Data[0],2,RED,WHITE,32);//显示整数变量

        OLED_ShowNum(1,5,DHT11Data[2],2);         //显示温度

        OLED_ShowNum(2,5,DHT11Data[0],2);         //显示湿度        

        xSemaphoreGive(MyMutex);

       

        vTaskDelay(6000);

    }

}

 

//任务4的的入口,获取光照强度

void GY30Function( void *pvParameters )

{

    xSemaphoreTake(MyMutex,portMAX_DELAY);

    OLED_ShowString(3,1,"Lig:     LX");

    LCD_ShowString(10,106,(u8*)"Lig:     LX",BLUE,WHITE,32,1);

    xSemaphoreGive(MyMutex);

    while(1)

    {

       

        IlluminationData=GY30_GetData();     //获取光照强度

        if((int)IlluminationData>2000)       //光强报警

        {

            xSemaphoreGive(SemaphoreNum);   

            xSemaphoreGive(SemaphoreNum);

            xSemaphoreGive(g_sem_lx);

        }

        sprintf(Illumination,"%f",IlluminationData);    //转化为字符串

        xSemaphoreTake(MyMutex,portMAX_DELAY);

        LCD_ShowIntNum(70,106,(u32)IlluminationData,5,RED,WHITE,32);//显示整数变量

        OLED_ShowNum(3,5,(u32)IlluminationData,5);         //显示光照强度

        xSemaphoreGive(MyMutex);

        vTaskDelay(2000);

    }

   

}

 

//任务5的的入口,获取空气质量

void MQ135Function( void *pvParameters )

{

    xSemaphoreTake(MyMutex,portMAX_DELAY);

    LCD_ShowString(10,138,(u8*)"AQI:",BLUE,WHITE,32,1);

    OLED_ShowString(4,1,"AQI:");

    xSemaphoreGive(MyMutex);

    while(1)

    {

      

       xSemaphoreTake(MyMutex,portMAX_DELAY);

       MQ135ADC_Init();            //空气质量模块初始化

       ADC_SoftwareStartConv(ADC3); //启动转换

       while( ADC_GetFlagStatus(ADC3,ADC_FLAG_EOC) == RESET );  //等待转换完成

       AirQualityData = ADC_GetConversionValue(ADC3); // 转换精度12bit  所以转换                     数字量范围0 ~ 4095

       sprintf(AirQuality,"%d",AirQualityData);    //转化为字符串

       OLED_ShowNum(4,5,AirQualityData,5);         //显示空气质量

       LCD_ShowIntNum(70,138,AirQualityData,3,RED,WHITE,32);//显示整数变量

       DisableMQ135();

       xSemaphoreGive(MyMutex);

      

       vTaskDelay(2000);

    }

}

 

//任务6的的入口,获取烟雾

void MQ2Function( void *pvParameters )

{

    xSemaphoreTake(MyMutex,portMAX_DELAY);

    LCD_ShowString(10,170,(u8*)"SMO:",BLUE,WHITE,32,1);

    xSemaphoreGive(MyMutex);

    while(1)

    {

       xSemaphoreTake(MyMutex,portMAX_DELAY);

       MQ2ADC_Init();              //烟雾传感器初始化

       ADC_SoftwareStartConv(ADC3); //启动转换

       while( ADC_GetFlagStatus(ADC3,ADC_FLAG_EOC) == RESET );  //等待转换完成

       SmokeData = ADC_GetConversionValue(ADC3); // 转换精度12bit  所以转换数字                         量范围0 ~ 4095

       sprintf(Smoke,"%d",SmokeData);    //转化为字符串

       LCD_ShowIntNum(70,170,SmokeData,3,RED,WHITE,32);//显示整数变量

       DisableMQ2();

       xSemaphoreGive(MyMutex);

      

       vTaskDelay(3000);

    }

}

 

//任务7的的入口,获取海拔

void BMP180Function( void *pvParameters )

{

    u8 ID = 0;

    xSemaphoreTake(MyMutex,portMAX_DELAY);

    LCD_ShowString(10,202,(u8*)"ALT:   m",BLUE,WHITE,32,1);

    xSemaphoreGive(MyMutex);

    while(1)

    {

        BMP_Init();

        BMP_ReadCalibrationData(); 

        ID = BMP_ReadOneByte(0xd0);

        BMP_UncompemstatedToTrue();

        printf("ID = %d\t  temp = %ld.%ldC\t   Pressure = %ldPa\t   Altitude                              = %.5fm\r\n",ID,bmp180.Temp/10,bmp180.Temp%10,bmp180.p,bmp180.altitude);

        xSemaphoreTake(MyMutex,portMAX_DELAY);

        LCD_ShowIntNum(70,202,(int)(bmp180.altitude)+100,3,RED,WHITE,32);//显示整数变量

        xSemaphoreGive(MyMutex);

        memset(&bmp180,0,sizeof(bmp180));

        vTaskDelay(2000);

    }

}

 

//任务8的的入口,温湿度蜂鸣器报警

void BEEPFunction( void *pvParameters )

{

    while(1)

    {

       xSemaphoreTake(g_sem_tmp,portMAX_DELAY);

       

       Start_ZhiDing(0XC);

       vTaskDelay(500);

       Beep_On();   //蜂鸣器响

       vTaskDelay(500);

       Beep_Off();   //蜂鸣器响

       

       vTaskDelay(500);

       Redled_On();;   //LED闪烁

       vTaskDelay(500);

       Redled_Off();;   //LED闪烁

    }

}

 

//任务9的的入口,光照强度报警LED闪烁报警

void LEDFunction( void *pvParameters )

{

    while(1)

    {

      xSemaphoreTake(g_sem_lx,portMAX_DELAY);

      Start_ZhiDing(0XB);

      vTaskDelay(500);

      Beep_On();   //蜂鸣器响

      vTaskDelay(500);

      Beep_Off();   //蜂鸣器响

       

      vTaskDelay(500);

      Redled_On();;   //LED闪烁

      vTaskDelay(500);

      Redled_Off();;   //LED闪烁

    }

}

3.3 小程序设计

使用阿里云图形化编程界面,进行小程序设计,显示效果如图:

 

 

.测试数据分析

通过实际测试,基于STM32单片机的室内环境检测终端可以实时监测室内环境质量,包括温度、湿度、烟雾、空气质量等参数。当环境参数超过设定阈值时,蜂鸣器会发出报警声,提醒人们注意室内环境质量。实验结果表明,该终端具有良好的稳定性和准确性,可为人们提供舒适的室内环境。

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

3D模型

序号文件名称下载次数
暂无数据

附件

序号文件名称下载次数
1
c9a707dfc6bd65c7eb74908710660466.mp4
121
克隆工程
添加到专辑
0
0
分享
侵权投诉

工程成员

评论

全部评论(1
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航