
STM32物联网环境检测
简介
基于STM32的物联网环境检测系统,连接阿里云,可以实时检测屋内的环境数据
简介:基于STM32的物联网环境检测系统,连接阿里云,可以实时检测屋内的环境数据开源协议
:GPL 3.0
描述
随着经济的快速发展和城市化进程的加快,人们的生活水平不断提高,对生活环境的舒适度和健康性也越来越关注。然而,现代建筑中的封闭性和密集性使得室内环境问题日益凸显。室内空气质量、温度、湿度、光照强度等环境因素直接关系到人们的身体健康和生活质量。因此,研究室内环境监测技术,实现对室内环境的实时监测和调控,对于提高人们的生活质量和健康水平具有重要意义。
目前,市场上已经存在一些室内环境监测设备,但大部分设备功能单一,只能监测温度、湿度等基本环境参数,而且价格较高。为了满足人们对室内环境监测的需求,降低成本,提高监测精度和可靠性,本文提出了一种基于单片机的室内环境监测系统。该系统可以实时监测室内温度、湿度、烟雾、空气质量和光照强度等多个环境参数,并通过LCD显示屏显示监测数据,同时具有报警功能,还能通过物联网上传阿里云,可为人们提供舒适的室内环境。
室内环境监测对于人们的健康和生活质量具有重要意义。室内环境质量与人们的日常生活密切相关,不良的室内环境会对人体健康产生不良影响。通过实时监测室内环境参数,可以及时了解室内环境状况,采取相应的措施改善室内环境,提供舒适的居住和工作环境。还可以降低室内环境问题的发生率和影响程度。通过对室内环境的实时监测,可以及时发现和解决室内环境问题,如空气污染、潮湿、光照不足等。这样可以减少室内环境问题对人们的身心健康造成的影响,提高生活质量。
1.2 研究的内容和要求
基本功能:
检测当前环境的温度湿度等相关参数,每过10秒通过WIFI模块把测得数据发送到手机,
1)采用STM32最小系统板
2)温湿度传感器DHT11
3)WIFI模块: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.3V至5.5V,适用于各种场合。它的温度测量范围为0至50摄氏度,湿度测量范围为20%至90%相对湿度。温度误差为+-2摄氏度,湿度误差为+-5%。DHT11模块的接口简单,通过一个I/O口即可实现与微控制器的通信。采用单总线协议,用户可以通过简单的编程实现对DHT11模块的控制和数据读取,进而获取温度和湿度信息。这使得DHT11模块在智能家居、环境监测、农业等领域有着广泛的应用。
GY-30模块是一款基于I2C通信的16位数字型光强传感器模块。它以BH1750数字型光强感应芯片为核心,搭配一些外围驱动电路。GY-30模块具有高精度、直接数字输出、省略复杂计算和标定、不分环境光源、接近视觉灵敏度分光特性以及高可靠性等优点。GY-30模块有5个引脚,分别为VCC(外接供电电源输入端)、GND(地线)、SDA(I2C通信模式数据信号)、SCL(I2C通信模式时钟信号)和ADDR(I2C地址引脚)。其光强测量范围最大可达100000勒克斯。该模块可以广泛应用于各种场景,如手机、LCD TV、便携式游戏机、数码相机、数码摄像机、车载导航、LCD显示等领域。通过与微控制器、单片机或开发板(如Arduino、STM32、ESP32等)连接,可以实现对环境光照强度的监测和控制。
MQ135模块是一款空气质量检测传感器模块,主要用于检测空气中的二氧化碳、酒精、苯、氮氧化物、氨等气体的浓度。该模块采用气敏材料二氧化锡(SnO2)作为传感器,当传感器所处环境中存在有害气体时,气敏材料的电导率会发生变化,从而可以检测空气质量。
MQ135模块具有4个引脚,分别为VCC(接5V直流电源输入)、GND(接地)、DO(模拟信号输出)和AO(数字信号[TTL]输出)。模块内部有一个可调电位器,用于调节灵敏度。MQ135模块可以与微控制器、单片机或开发板(如Arduino、STM32、ESP32等)连接,通过读取模拟信号输出端(A0)的电压值,再经过AD转换和一定的公式转换,可以得到空气中各种气体的浓度值。此外,该模块也可用于检测烟雾等空气污染物。
MQ135模块广泛应用于智能家居、环境监测、农业、工业等领域,用于实时监测和控制空气质量。
MQ2模块是一款烟雾气敏传感器模块,主要用于检测空气中的可燃气体,如液化气、丙烷、氢气、天然气等。该模块采用气敏材料二氧化锡(SnO2)作为传感器,当传感器所处环境中存在可燃气体时,传感器的电导率会随空气中可燃气体的浓度增加而增大。通过简单的电路,可以将电导率的变化转换为与气体浓度相对应的输出信号。
MQ2模块具有以下几个特点:
1. 双路信号输出:模拟量输出和TTL电平输出。
2. TTL输出有效信号为低电平:当输出低电平时,信号灯亮,可直接接单片机。
3. 模拟量输出0~5V电压:浓度越高,电压越高。
4. 对液化气、天然气、城市煤气有较好的灵敏度。
5. 具有长期的使用寿命和可靠的稳定性。
6. 快速的响应恢复特性。
MQ2模块可以应用于家庭或工厂的气体泄漏监测装置,适宜于液化气、丁烷、丙烷、甲烷、酒精、氢气、烟雾等监测装置。通过与微控制器、单片机或开发板(如Arduino、STM32、ESP32等)连接,可以实现气体泄漏的实时监测和控制。
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
克隆工程

评论