演示视频:
基于STM32单片机温湿度PM2.5粉尘甲醛环境质量监测系统
目录
演示视频:
一、项目简介:
1.1 功能介绍:
1.2 设计背景:
1.3 设计意义:
1.4 设计目的
二、硬件设计:
2.1 整体原理图设计:
2.2 蜂鸣器
2.3 按键
2.4 DHT11温湿度传感器
2.5 LCD1602显示屏
2.6 PM2.5传感器
2.7 甲醛传感器
2.8 ESP8266 WiFi模块
2.9 供电模块:
三、软件设计:
3.1 模块化设计
1. 环境数据采集模块
2. PM2.5与甲醛浓度采集:
3.2 用户交互模块
1. 按键功能
2. 显示模式切换
3. 报警功能模块
4. 数据无线传输模块
3.3 代码结构与功能实现
四、系统焊接与调试
4.1 系统硬件与焊接
1. 系统硬件
2. 硬件焊接:
4.2 系统调试
五、结论与展望
资源下载详情与下载链接:毕业设计&课程设计&项目开发&大创-基于STM32单片机温湿度PM2.5粉尘甲醛环境质量监测系统wifi(完整工程资料).zip资源-CSDN文库
1. C程序:
2.原理图:
3.实物图片
4.设计资料
5.视频+软件下载
6.元件清单
7.参考论文
8.开题报告
9.制作详解
10.STM32视频教程
11.安卓app
13. xmind1
一、项目简介:
1.1 功能介绍:
实现一个基于STM32的环境监测系统,通过多种传感器采集环境数据,并通过LCD显示屏和WiFi模块进行显示和传输。系统主要采集温度、湿度、PM2.5和甲醛(CH2O)浓度等环境参数,并通过按键设置各参数的报警阈值。当采集到的数据超过设定的阈值时,系统会通过蜂鸣器进行报警提示。
代码的主要功能模块包括:传感器数据采集通过DHT11传感器采集温度和湿度数据,通过GP2Y传感器采集PM2.5数据,通过SGP30传感器采集甲醛浓度数据。按键扫描与阈值设置通过按键扫描函数scant(),用户可以设置温度、湿度、PM2.5和甲醛浓度的报警阈值。按键操作会切换不同的设置模式,并通过加减键调整阈值。
LCD显示通过LCD1602显示屏实时显示采集到的温度、湿度、PM2.5和甲醛浓度数据,并在设置模式下显示当前设置的阈值。WiFi数据传输通过ESP8266 WiFi模块将采集到的环境数据发送到远程服务器或客户端,实现数据的远程监控。
报警功能当采集到的温度、湿度、PM2.5或甲醛浓度超过设定的阈值时,系统会通过蜂鸣器灯进行报警提示。
代码通过LED1=~LED1实现蜂鸣器的闪烁报警。系统初始化在main()函数中,系统初始化了延时函数、LCD显示屏、按键、蜂鸣器、ADC模块、DHT11传感器、串口通信以及ESP8266 WiFi模块,确保各模块正常工作。
图1-1 整体实物模块效果
1.2 设计背景:
在现代社会,环境污染和空气质量问题逐渐成为公众关注的焦点,尤其是在城市化进程加速的背景下,环境监测变得尤为重要。随着工业化和交通运输的快速发展,空气污染物如PM2.5、甲醛等有害物质的浓度不断上升,直接威胁着人类的健康。尤其是室内空气质量问题,常常因为不易察觉而被忽视,长时间暴露在污染的环境中可能会引发呼吸系统疾病、过敏反应,甚至对心血管健康造成负面影响。因此,环境监测系统的建设和普及显得尤为迫切。为了应对这一挑战,基于STM32微控制器的环境监测系统应运而生,该系统可以实时、精确地监测和评估环境状况,并提供相应的预警机制,有效帮助用户控制空气质量,维护健康。
该系统的核心优势在于它集成了多种传感器,可以同时监测多个环境因素,如温度、湿度、PM2.5浓度以及甲醛(CH2O)浓度等。这些传感器通过高精度的数据采集和实时监测,能够为用户提供全面的环境质量信息。具体而言,DHT11传感器用于测量环境中的温度和湿度,这两项指标对人体舒适度和健康至关重要;GP2Y传感器则专门用于测量空气中的PM2.5浓度,它可以帮助用户了解空气污染的程度;而SGP30传感器用于检测甲醛等有害气体的浓度,这对于室内空气质量的评估尤为重要。所有这些传感器采集到的数据将通过LCD显示屏直观地呈现给用户,使得环境状况一目了然。
在实际应用中,环境数据的实时监测和展示是系统的重要功能之一。通过LCD1602显示屏,用户可以方便地查看当前的环境数据,实时监控各项指标的变化。此外,为了提高用户体验,系统设计了便捷的按键设置功能。通过按键扫描函数scant(),用户可以轻松设定各个环境参数的报警阈值。当系统检测到某一参数超出设定的安全阈值时,便会通过蜂鸣器发出报警信号,提醒用户立即采取措施改善环境质量。用户还可以通过按键操作进入不同的设置模式,并通过加减键调整报警阈值,进一步提升系统的灵活性和可操作性。
WiFi模块的集成是该系统的另一个亮点。通过ESP8266 WiFi模块,系统不仅具备了本地显示和报警功能,还能实现远程监控。采集到的环境数据将被实时上传至云平台或其他远程服务器,用户可以通过智能手机或电脑随时随地查看环境数据,远程控制设备,甚至在发现空气质量异常时,及时做出反应。这一功能使得系统更加智能化,并为用户提供了更加便捷和灵活的操作方式。
在环境监测的过程中,系统的报警功能也起到了关键作用。当采集到的温度、湿度、PM2.5或甲醛浓度超过设定的阈值时,系统不仅会通过蜂鸣器发出报警,还可能通过其他方式进行多重提醒。蜂鸣器的报警信号能够迅速引起用户的注意,从而及时采取措施,防止环境污染进一步加剧对健康造成威胁。
系统的整体设计考虑到了用户友好性和操作便捷性。除了通过LCD屏显示实时数据外,用户还可以通过简单的按键操作进行设置,调整阈值和查看数据。无论是在家中、办公室还是其他任何需要监控空气质量的场所,这种系统都能提供有效的帮助。通过STM32微控制器的强大运算能力和多传感器的协同工作,系统不仅具备实时数据采集、处理、显示、报警和远程传输等多重功能,还能在保证高效稳定运行的前提下,提供灵活的操作方式和高精度的监测结果。
该环境监测系统在设计上充分考虑了实时性、可操作性和远程监控,能够帮助用户随时了解环境的状态,并提供有效的报警机制,确保环境参数始终保持在安全范围内。无论是对于家庭还是办公室,尤其是在空气污染日益严重的当下,这种环境监测系统都能够为提升空气质量、保障人类健康提供便捷和高效的技术手段。在未来,随着智能硬件的不断发展和普及,这种环境监测系统有望成为家庭、公共场所等环境质量保障的重要工具,为建设更加清新、健康的生活空间贡献力量。
1.3 设计意义:
在当前快速发展的城市化进程中,环境污染问题日益严重,空气质量的恶化已成为全球范围内亟待解决的关键问题。尤其是PM2.5、甲醛等有害物质在室内外环境中普遍存在,长期暴露在污染的环境中,容易引发一系列呼吸系统疾病、心血管疾病以及过敏反应等健康问题。因此,环境监测技术的创新与发展显得尤为重要,能够实时监测并控制环境质量,从而为人们提供一个更加健康和舒适的生活空间。
基于STM32微控制器的环境监测系统的设计,不仅有效解决了环境监测的技术难题,还为广大用户提供了更加智能化、便捷化的解决方案,具有重要的现实意义。该系统通过集成多种高精度传感器,能够同时监测环境中的温度、湿度、PM2.5浓度和甲醛浓度等关键指标。通过对这些数据的实时采集和分析,系统能够为用户提供全面的环境质量评估,帮助用户随时掌握身边的空气质量。与此同时,LCD显示屏的应用,使得用户可以直观地查看各项环境数据,便于做出及时的应对措施。
这种实时监测的功能,可以有效防止室内空气质量的突然变化对人体健康造成威胁,尤其是在甲醛等有害气体的浓度较高的情况下,系统的报警功能能够及时发出警报,为用户提供充分的预警。此外,系统通过集成的WiFi模块,将数据上传至云平台或其他远程监控系统,提供了远程监控的功能,用户可以在任何地方、任何时间查看到家中或办公室的环境质量情况,从而实现更全面、更便捷的环境管理。
值得一提的是,系统设计了按键扫描功能,用户可以根据自己的需求,灵活设置各项环境参数的报警阈值,确保系统能够适应不同环境的需求并有效避免误报警。这种高度灵活的设置模式,使得该系统在面对不同使用场景时能够展现出极高的适应性和用户友好性。综合来看,基于STM32的环境监测系统不仅提供了数据采集、处理、显示、报警和远程传输等全方位的功能,还大大提升了用户对环境质量的实时感知与管理能力。
其设计不仅有助于推动空气质量监控技术的发展,还能提高人们对环境保护的意识,助力创建更加健康、安全的生活环境。此类系统的普及,将有效改善日益严峻的空气污染问题,提升人们的生活质量,具有深远的社会和经济意义。
1.4 设计目的
本系统的设计目的是通过基于STM32微控制器的环境监测平台,提供一个集成化的、智能化的解决方案,用于实时监测和评估空气质量及环境变化,旨在提升用户的环境意识和健康保障。随着城市化进程的加速,环境污染尤其是空气质量下降已成为现代社会的严重问题,尤其是PM2.5和甲醛等有害物质的不断增加,已严重影响到人们的身体健康。
传统的环境监测手段多存在数据滞后、不够精确和不便于普通用户操作等问题,而本设计通过高精度的传感器和智能化的微控制器平台,能够实时采集并处理多项环境数据,如温度、湿度、PM2.5浓度和甲醛浓度等,为用户提供直观、实时的环境状态反馈。
通过LCD显示屏展示数据,系统能够确保用户能在任何时间轻松查看到环境质量的最新情况,做到早发现、早预警。此外,系统还通过WiFi模块实现了远程监控功能,用户可通过手机或计算机等设备远程查看环境数据,打破了地域和时间的限制,增强了环境监控的便捷性和实时性。这一设计使得用户不仅可以随时监控家中或办公环境的空气质量,还能根据实时数据做出及时调整和干预,极大地提高了生活环境的安全性和舒适性。
系统还具备报警功能,用户可根据需求自定义设置各项环境参数的报警阈值,当空气质量发生变化并超出预定安全范围时,系统通过蜂鸣器发出报警声,提醒用户采取措施改善空气质量,进一步保障用户的健康。
因此,本系统的设计目的不仅是为用户提供一个实时、精确、智能的环境监控工具,同时也通过便捷的操作和灵活的设置,使得用户能够在复杂的环境中,轻松应对空气质量问题,确保居住和工作环境始终保持在健康、安全的标准范围内。
二、硬件设计:
2.1 整体原理图设计:
设计基于STM32微控制器的环境监测系统中,各个组件之间的连接至关重要。以下是详细的接口连接表格,列出了系统中各个模块的连接方式和功能描述。
图 2-1 整体系统原理图设计
STM32F103C8T6是一款广泛应用的微控制器,属于STMicroelectronics的STM32系列。该系列基于ARM Cortex-M3 32位RISC核心,具有高性能和低功耗的特点。
图2-2 STM32F103C8T6实物图
组件 | 引脚/端口 | 连接到STM32的引脚 | 功能描述 |
---|---|---|---|
蜂鸣器 | B1 | A1 | 发出报警音频信号 |
按键(S1) | S1 | A2 | 用于设置和控制系统功能 |
按键(S2) | S2 | A3 | 用于设置和控制系统功能 |
按键(S3) | S3 | A4 | 用于设置和控制系统功能 |
DHT11温湿度传感器 | VCC (电源) | VCC | 提供电源 |
GND | GND | 地线连接 | |
DATA | A5 | 传输温湿度数据 | |
LCD1602显示屏 | VSS | GND | 地线连接 |
VCC | 5V | 提供电源 | |
RS | A6 | 选择寄存器 | |
RW | GND | 写/读选择 | |
E | A7 | 启动信号 | |
D0-D3 | B0-B3 | 数据传输线 | |
D4-D7 | B4-B7 | 数据传输线 | |
PM2.5传感器 | VCC | VCC | 提供电源 |
GND | GND | 地线连接 | |
OUT | A8 | 输出PM2.5数据 | |
甲醛传感器 | VCC | VCC | 提供电源 |
GND | GND | 地线连接 | |
AOUT | A9 | 输出甲醛数据 | |
ESP8266 WiFi模块 | VCC | VCC | 提供电源 |
GND | GND | 地线连接 | |
RX | A10 | 接收数据 | |
TX | A11 | 发送数据 |
图2-3 STM32F103C8T6原理图
2.2 蜂鸣器
- 引脚/端口: B1
- 连接到STM32的引脚: A1
- 功能描述: 蜂鸣器用于发出声音报警信号。当系统检测到空气质量超出设定的安全范围(如PM2.5或甲醛浓度过高)时,蜂鸣器将发出提示音,提醒用户采取相应措施。
图2-4 蜂鸣器实物图
图2-5 蜂鸣器原理图
2.3 按键
- 引脚/端口: S1, S2, S3
- 连接到STM32的引脚: A2, A3, A4
- 功能描述: 这些按键用于用户与系统的交互,允许用户设置环境监测的参数,如报警阈值、设备重置等。每个按键可以自定义不同的功能,以满足用户需求。
图2-6 按键原理图
2.4 DHT11温湿度传感器
- 引脚/端口: VCC, GND, DATA
- 连接到STM32的引脚: VCC (电源), GND (地线), A5 (数据)
- 功能描述: DHT11传感器用于实时检测环境中的温度和湿度。通过数字信号输出温湿度数据,STM32可以根据这些数据进行环境监测和评估。
图2-7 DHT11温湿度传感器实物图
图2-8 DHT11温湿度传感器原理图
2.5 LCD1602显示屏
- 引脚/端口: VSS, VCC, RS, RW, E, D0-D3, D4-D7
- 连接到STM32的引脚: GND (地线), 5V (电源), A6 (RS), GND (RW), A7 (E), B0-B3 (D0-D3), B4-B7 (D4-D7)
- 功能描述: LCD1602显示屏用于实时显示温度、湿度、PM2.5浓度和甲醛浓度等环境数据。通过RS、RW和E引脚控制显示的内容,D0-D7引脚用于传输数据,使用户能够直观地了解当前环境质量。
图2-9 LCD1602显示屏实物图
图2-10 LCD1602显示屏原理图
2.6 PM2.5传感器
- 引脚/端口: VCC, GND, OUT
- 连接到STM32的引脚: VCC (电源), GND (地线), A8 (数据)
- 功能描述: PM2.5传感器用于监测空气中的PM2.5颗粒物浓度。通过输出引脚传输检测到的PM2.5数据,STM32接收并处理这些数据,以实现环境质量监测和报警功能。
图2-11 PM2.5传感器实物图
图2-12 PM2.5传感器原理图
2.7 甲醛传感器
- 引脚/端口: VCC, GND, AOUT
- 连接到STM32的引脚: VCC (电源), GND (地线), A9 (数据)
- 功能描述: 甲醛传感器用于检测空气中的甲醛浓度。它通过模拟输出引脚传输检测的甲醛数据,STM32能够实时监测室内空气质量,确保用户的健康安全。
图2-13 甲醛传感器实物图
图2-14 甲醛传感器原理图
2.8 ESP8266 WiFi模块
- 引脚/端口: VCC, GND, RX, TX
- 连接到STM32的引脚: VCC (电源), GND (地线), A10 (RX), A11 (TX)
- 功能描述: ESP8266模块用于实现无线数据传输功能。它可以将实时监测的数据上传至云平台或发送到用户的智能手机,实现远程监控,使用户能够随时随地查看环境质量信息。
图2-14 ESP8266 WiFi模块实物图
图2-14 ESP8266 WiFi模块原理图
2.9 供电模块:
供电模块通常能够接受多种电压输入,如直流(DC)输入,常见的有5V、12V等。这使其可以适应不同的电源来源,如电池、USB接口或外部电源适配器。单片机需要特定的工作电压(如3.3V或5V)。供电模块会使用线性稳压器(如7805)或开关稳压器(如DC-DC转换器)将输入电压调整为单片机所需的工作电压。
三、软件设计:
该程序基于 STM32 微控制器 实现一个集成的环境监测系统,利用多种传感器和显示模块实时监测和管理环境参数。同时,通过 ESP8266 WiFi 模块 实现数据的远程上传,方便用户进行远程环境质量监控。
3.1 模块化设计
1. 环境数据采集模块
(1)温湿度采集:
- 传感器:使用DHT11传感器采集环境温度和湿度。
- 数据获取:通过
DHT11_Read_Data
函数获取温度和湿度数据。 - 显示:将采集到的数据通过LCD屏显示出来。
- 阈值设定:
- 默认温度阈值:38°C
- 默认湿度阈值:90%
- 用户可以通过按键调整这些阈值。
#include "dht11.h"
#include "delay.h"
void DHT11_IO_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructer;
GPIO_InitStructer.GPIO_Pin= GPIO_Pin_14;
GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructer);
}
void DHT11_IO_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructer;
GPIO_InitStructer.GPIO_Pin= GPIO_Pin_14;
GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IPU;//ÉÏÀÊäÈë
GPIO_Init(GPIOC, &GPIO_InitStructer);
}
//¸´Î»DHT11
void DHT11_Rst(void)
{
DHT11_IO_OUT(); //SET OUTPUT
DHT11_DQ_OUT=0; //ÀµÍDQ
delay_ms(20); //ÀµÍÖÁÉÙ18ms
DHT11_DQ_OUT=1; //DQ=1
delay_us(30); //Ö÷»úÀ¸ß20~40us
}
//µÈ´ýDHT11µÄ»ØÓ¦
//·µ»Ø1:δ¼ì²âµ½DHT11µÄ´æÔÚ
//·µ»Ø0:´æÔÚ
u8 DHT11_Check(void)
{
u8 retry=0;
DHT11_IO_IN();//SET INPUT
while (DHT11_DQ_IN&&retry<100)//DHT11»áÀµÍ40~80us
{
retry++;
delay_us(1);
};
if(retry>=100)return 1;
else retry=0;
while (!DHT11_DQ_IN&&retry<100)//DHT11ÀµÍºó»áÔÙ´ÎÀ¸ß40~80us
{
retry++;
delay_us(1);
};
if(retry>=100)return 1;
return 0;
}
//´ÓDHT11¶ÁÈ¡Ò»¸öλ
//·µ»ØÖµ£º1/0
u8 DHT11_Read_Bit(void)
{
u8 retry=0;
while(DHT11_DQ_IN&&retry<100)//µÈ´ý±äΪµÍµçƽ
{
retry++;
delay_us(1);
}
retry=0;
while(!DHT11_DQ_IN&&retry<100)//µÈ´ý±ä¸ßµçƽ
{
retry++;
delay_us(1);
}
delay_us(40);//µÈ´ý40us
if(DHT11_DQ_IN)return 1;
else return 0;
}
//´ÓDHT11¶ÁÈ¡Ò»¸ö×Ö½Ú
//·µ»ØÖµ£º¶Áµ½µÄÊý¾Ý
u8 DHT11_Read_Byte(void)
{
u8 i,dat;
dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_Read_Bit();
}
return dat;
}
//´ÓDHT11¶ÁÈ¡Ò»´ÎÊý¾Ý
//temp:ζÈÖµ(·¶Î§:0~50¡ã)
//humi:ʪ¶ÈÖµ(·¶Î§:20%~90%)
//·µ»ØÖµ£º0,Õý³£;1,¶Áȡʧ°Ü
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{
u8 buf[5];
u8 i;
DHT11_Rst();
if(DHT11_Check()==0)
{
for(i=0;i<5;i++)//¶ÁÈ¡40λÊý¾Ý
{
buf[i]=DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi=buf[0];
*temp=buf[2];
}
}else return 1;
return 0;
}
//³õʼ»¯DHT11µÄIO¿Ú DQ ͬʱ¼ì²âDHT11µÄ´æÔÚ
//·µ»Ø1:²»´æÔÚ
//·µ»Ø0:´æÔÚ
u8 DHT11_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //ʹÄÜPC¶Ë¿ÚʱÖÓ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; //P¶Ë¿ÚÅäÖÃ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure); //³õʼ»¯IO¿Ú
GPIO_SetBits(GPIOC,GPIO_Pin_14); //PÊä³ö¸ß
DHT11_Rst(); //¸´Î»DHT11
return DHT11_Check();//µÈ´ýDHT11µÄ»ØÓ¦
}
if (key_mode == 1) { // key_mode 为 1 时,执行设置 set_w_numA_H 的功能
// 处理 key2 按键按下事件
if (!key2) {
delay_ms(100); // 按键去抖延时
if (!key2) { // 确认 key2 按键依然按下
// 设置 set_w_numA_H,最大值为 99,超过 99 后归零
if (set_w_numA_H < 99) {
set_w_numA_H++; // 增加 set_w_numA_H
} else {
set_w_numA_H = 0; // 如果超过 99,重置为 0
}
}
}
// 处理 key3 按键按下事件
if (!key3) {
delay_ms(100); // 按键去抖延时
if (!key3) { // 确认 key3 按键依然按下
// 设置 set_w_numA_H,最小值为 0,低于 0 后设为 99
if (set_w_numA_H > 0) {
set_w_numA_H--; // 减少 set_w_numA_H
} else {
set_w_numA_H = 99; // 如果低于 0,设为 99
}
}
}
// 在 LCD 上显示 set_w_numA_H 的值
Lcd_Display_2Date(1, 2, set_w_numA_H);
}
if (key_mode == 2) { // key_mode 为 2 时,执行设置 set_s_numA_H 的功能
// 处理 key2 按键按下事件
if (!key2) {
delay_ms(100); // 按键去抖延时
if (!key2) { // 确认 key2 按键依然按下
// 设置 set_s_numA_H,最大值为 99,超过 99 后归零
if (set_s_numA_H < 99) {
set_s_numA_H++; // 增加 set_s_numA_H
} else {
set_s_numA_H = 0; // 如果超过 99,重置为 0
}
}
}
// 处理 key3 按键按下事件
if (!key3) {
delay_ms(100); // 按键去抖延时
if (!key3) { // 确认 key3 按键依然按下
// 设置 set_s_numA_H,最小值为 0,低于 0 后设为 99
if (set_s_numA_H > 0) {
set_s_numA_H--; // 减少 set_s_numA_H
} else {
set_s_numA_H = 99; // 如果低于 0,设为 99
}
}
}
// 在 LCD 上显示 set_s_numA_H 的值
Lcd_Display_2Date(1, 7, set_s_numA_H);
}
2. PM2.5与甲醛浓度采集:
- 传感器:使用GP2Y传感器采集PM2.5数据。
- 数据处理:调用
Get_GP2Y_Average(20)
函数,取20次测量结果的平均值以提高数据稳定性。 - 报警阈值:默认PM2.5阈值设定为100,支持用户调整。
- 传感器:使用SGP30传感器检测空气中的甲醛浓度。
- 数据存储:使用外部变量
ch2o
来存储甲醛浓度。 - 报警阈值:默认甲醛浓度阈值为8000,支持用户调整。
#include "adc.h"
#include "delay.h"
// 初始化ADC
// 该初始化配置了PA0为模拟输入端口,PA11为数字输出端口,并且配置了ADC1。
void Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// 开启GPIOA和ADC1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);
// 配置ADC时钟分频为12M(72M / 6 = 12M)
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
// 配置PA0为模拟输入,用于ADC输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 模拟输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置PB11为数字输出,用于控制GP2Y传感器的LED开关
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GP2Y_High; // 点亮GP2Y传感器的LED
// ADC1初始化
ADC_DeInit(ADC1); // 复位ADC1
// 配置ADC初始化参数
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 设置为独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 禁用扫描转换模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 禁用连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 不使用外部触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; // 只使用1个通道(PA0)
ADC_Init(ADC1, &ADC_InitStructure); // 初始化ADC1
// 启动ADC1
ADC_Cmd(ADC1, ENABLE);
// 进行ADC校准
ADC_ResetCalibration(ADC1); // 重置校准
while (ADC_GetResetCalibrationStatus(ADC1)); // 等待校准复位完成
ADC_StartCalibration(ADC1); // 启动校准
while (ADC_GetCalibrationStatus(ADC1)); // 等待校准完成
}
// 获取ADC的值
// ch: 输入通道,0~3 (PA0 ~ PA3)
// 返回值: ADC转换的结果(0~4095)
u16 Get_Adc(u8 ch)
{
// 配置ADC转换通道
ADC_RegularChannelConfig(ADC1, ch, 0, ADC_SampleTime_239Cycles5); // 设置ADC通道和采样时间
// 启动ADC转换
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
// 等待ADC转换结束
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换完成
// 返回ADC转换结果
return ADC_GetConversionValue(ADC1);
}
// 获取GP2Y传感器的PM值
// 通过ADC读取PA0的模拟值,并根据公式转换为PM值
float GetGP2Y(void)
{
u32 AD_PM;
double pm;
GP2Y_Low; // 关闭GP2Y传感器的LED
delay_us(280); // 等待时间
AD_PM = Get_Adc(ADC_Channel_0); // 获取PA0的ADC值(GP2Y传感器的输出)
delay_us(40); // 等待时间
GP2Y_High; // 打开GP2Y传感器的LED
delay_us(9680); // 等待时间
// 根据ADC值转换为PM值
pm = 0.17 * AD_PM - 0.1;
return pm;
}
// 获取GP2Y传感器的平均PM值
// times: 获取的次数,用于计算平均值
u16 Get_GP2Y_Average(u8 times)
{
u32 pm_val = 0;
u8 t;
// 获取多次PM值并求和
for (t = 0; t < times; t++)
{
pm_val += GetGP2Y();
delay_ms(10); // 延时10ms,避免读取过快
}
// 返回平均值
return pm_val / times;
}
if (key_mode == 3) { // key_mode 为 3 时,执行PM2.5的设置功能
// 处理 key2 按键按下事件
if (!key2) {
delay_ms(100); // 按键去抖延时
if (!key2) { // 确认 key2 按键依然按下
// 增加 PM25_H 值,最大值为 500,超过后重置为 0
if (PM25_H < 500) {
PM25_H++;
} else {
PM25_H = 0;
}
}
}
// 处理 key3 按键按下事件
if (!key3) {
delay_ms(100); // 按键去抖延时
if (!key3) { // 确认 key3 按键依然按下
// 减少 PM25_H 值,最小值为 0,低于 0 后设为 500
if (PM25_H > 0) {
PM25_H--;
} else {
PM25_H = 500;
}
}
}
// 在 LCD 上显示 PM25_H 的值
Lcd_Display_3Date(1, 13, PM25_H);
}
/// CH2O 设置
if (key_mode == 4) { // key_mode 为 4 时,执行 CH2O 的设置功能
// 处理 key2 按键按下事件
if (!key2) {
delay_ms(100); // 按键去抖延时
if (!key2) { // 确认 key2 按键依然按下
// 增加 ch2o_H 值,最大值为 50000,超过后重置为 0
if (ch2o_H < 50000) {
ch2o_H++;
} else {
ch2o_H = 0;
}
}
}
// 处理 key3 按键按下事件
if (!key3) {
delay_ms(100); // 按键去抖延时
if (!key3) { // 确认 key3 按键依然按下
// 减少 ch2o_H 值,最小值为 0,低于 0 后设为 50000
if (ch2o_H > 0) {
ch2o_H--;
} else {
ch2o_H = 50000;
}
}
}
// 在 LCD 上显示 ch2o_H 的值
Lcd_Display_5Date(2, 5, ch2o_H);
}
3.2 用户交互模块
用户通过按键与系统进行交互,完成报警阈值设置和模式切换。
1. 按键功能
-
key1:切换操作模式,共有 5 种状态:
- 显示温湿度实时值。
- 设置温度报警阈值。
- 设置湿度报警阈值。
- 设置 PM2.5 报警阈值。
- 设置甲醛浓度报警阈值。
-
key2 和 key3:
- key2 用于增加当前设置值。
- key3 用于减少当前设置值。
- 数据范围:
- 温度阈值:0 ~ 99°C
- 湿度阈值:0 ~ 99%
- PM2.5 阈值:0 ~ 500
- 甲醛浓度阈值:0 ~ 50000(以 0.0001 mg/m³ 为单位)。
2. 显示模式切换
- 通过 LCD1602 显示屏显示不同环境参数和设置界面。
- 使用
Lcd_Display_2Date
、Lcd_Display_3Date
和Lcd_Display_5Date
函数更新数据。
3. 报警功能模块
-
报警逻辑:连续监测环境参数,如果任意参数超过设定阈值,则启动报警:
- LED1 闪烁:作为报警指示灯。
- 若所有数据均低于阈值,则关闭报警指示灯。
-
支持的报警条件:
- 温度 >
set_w_numA_H
- 湿度 >
set_s_numA_H
- PM2.5 >
PM25_H
- 甲醛浓度 >
ch2o_H
- 温度 >
4. 数据无线传输模块
- 使用 ESP8266 模块
- 初始化 WiFi 模块:
- 设置为 AP 模式(
AT+CWMODE=2
),提供一个名为wifi
的热点,密码为12345678
。 - 开启 TCP 服务,监听端口
5000
。
- 设置为 AP 模式(
- 数据传输:
- 构造发送数据字符串
table1
,包含:- 温度:
"T:XX°C"
- 湿度:
"H:XX%"
- PM2.5:
"PM:XXX"
- 甲醛:"Ch2o:XX.XXXXmg/m³"
- 温度:
- 使用
ESP8266_Set
函数发送数据到客户端。
- 构造发送数据字符串
- 初始化 WiFi 模块:
void ESP8266_Set(u8 *puf) // 数组指针*puf指向字符串数组
{
while(*puf != '\0') // 遇到空字符跳出循环
{
USART1_Send_Byte(*puf); // 向WIFI模块发送控制指令
delay_us(5);
puf++;
}
delay_us(5);
USART1_Send_Byte('\r'); // 发送回车
delay_us(5);
USART1_Send_Byte('\n'); // 发送换行
}
void ESP8266_init()
{
ESP8266_Set("AT+CWMODE=2"); // 设置为AP模式(模式1为station,模式3为station+AP混合模式),设置前WiFi波特率为9600
delay_ms(500);
ESP8266_Set("AT+RST"); // 重启WiFi模块
delay_ms(500);
ESP8266_Set("AT+CWSAP=\"wifi\",\"12345678\",11,4"); // 设置模块SSID为"wifi",密码为"12345678",信道11,安全类型为WPA2-PSK
delay_ms(500);
ESP8266_Set("AT+CIPMUX=1"); // 开启多连接模式,允许客户端连接
delay_ms(500);
ESP8266_Set("AT+CIPSERVER=1,5000"); // 开启TCP/IP服务器,监听端口5000
delay_ms(500);
ESP8266_Set("AT+CIPSTO=0"); // 设置为无限不超时
delay_ms(500);
}
3.3 代码结构与功能实现
#include "sys.h"
#include "delay.h"
#include "SGP30.h"
#include "dht11.h"
#include "usart.h"
#include "LCD1602.h"
#include "adc.h"
#include "key.h"
#include "LED.h"
// 全局变量定义
u8 temperature, humidity; // 温度和湿度
u16 pm; // PM2.5浓度
extern unsigned int ch2o; // 甲醛浓度
u8 caiji = 0, key_mode = 0; // 采集标志和按键模式
u8 set_w_numA_H = 38, set_s_numA_H = 90; // 温度和湿度报警阈值
u32 PM25_H = 100, ch2o_H = 8000; // PM2.5和甲醛报警阈值
// 数据发送格式模板
u8 table1[] = "T:00C H:00% PM:000 Ch2o:0.0000mg/m3";
u8 ta[] = "0123456789-"; // 字符映射表,用于数值转换
u8 xm0, xm1, xm2, xm3, xm4; // 临时变量,用于数值处理
// 主程序入口
int main(void) {
// 初始化模块
delay_init(); // 初始化延时
LCD_init(); // 初始化LCD1602
KEY_Init(); // 初始化按键
Init_LEDpin(); // 初始化蜂鸣器和LED
Adc_Init(); // 初始化ADC模块
DHT11_Init(); // 初始化DHT11传感器
uart_init(9600); // 初始化串口通信
delay_ms(1000); // 延时1秒
ESP8266_init(); // 初始化ESP8266 WiFi模块
delay_ms(500);
// LCD初始显示
Lcd_ShowSring(1, 0, "T:");
Lcd_ShowSring(1, 5, "H:");
Lcd_ShowSring(1, 10, "PM:");
Lcd_ShowSring(2, 0, "Ch2o:");
delay_ms(500);
while (1) {
scant(); // 扫描按键状态
if (caiji == 0) { // 采集数据模式
// 读取温湿度数据
DHT11_Read_Data(&temperature, &humidity);
Lcd_Display_2Date(1, 2, temperature); // 显示温度
LCD_write_data('C');
Lcd_Display_2Date(1, 7, humidity); // 显示湿度
LCD_write_data('%');
// 读取PM2.5数据
pm = Get_GP2Y_Average(20); // 获取PM2.5平均值
Lcd_Display_3Date(1, 13, pm); // 显示PM2.5
delay_ms(150);
// 显示甲醛浓度
Lcd_Display_5Date(2, 5, ch2o); // 显示甲醛浓度
delay_ms(150);
// 报警逻辑:如果任一参数超过阈值,则触发报警
if ((temperature > set_w_numA_H) || (humidity > set_s_numA_H) ||
(pm > PM25_H) || (ch2o > ch2o_H)) {
LED1 = ~LED1; // LED指示报警
} else {
LED1 = 1; // 关闭报警
}
// 数据打包并发送
// 将温度转换为字符存储到发送数组
xm0 = temperature / 10;
xm1 = temperature % 10;
table1[2] = ta[xm0];
table1[3] = ta[xm1];
// 将湿度转换为字符存储到发送数组
xm0 = humidity / 10;
xm1 = humidity % 10;
table1[7] = ta[xm0];
table1[8] = ta[xm1];
// 将PM2.5转换为字符存储到发送数组
xm0 = pm / 100;
xm1 = (pm % 100) / 10;
xm2 = pm % 10;
table1[12] = ta[xm0];
table1[13] = ta[xm1];
table1[14] = ta[xm2];
// 将甲醛浓度转换为字符存储到发送数组
xm0 = ch2o / 10000;
xm1 = (ch2o % 10000) / 1000;
xm2 = (ch2o % 1000) / 100;
xm3 = (ch2o % 100) / 10;
xm4 = ch2o % 10;
table1[20] = ta[xm0];
table1[21] = '.';
table1[22] = ta[xm1];
table1[23] = ta[xm2];
table1[24] = ta[xm3];
table1[25] = ta[xm4];
// 通过ESP8266发送数据
ESP8266_Set("AT+CIPSEND=0,42"); // 设置数据长度
delay_ms(200);
ESP8266_Set(table1); // 发送环境数据
delay_ms(200);
}
}
}
四、系统焊接与调试
4.1 系统硬件与焊接
1. 系统硬件
该环境监测系统由以下硬件组成:STM32F103C8T6 是系统的核心控制单元,基于 ARM Cortex-M3 架构,主频 72MHz,用于管理传感器数据采集、逻辑处理以及外设通信;
LCD1602 是一款字符型液晶显示屏,可实时显示温湿度、PM2.5 浓度、甲醛浓度等环境数据;DHT11 是一个温湿度传感器,用于采集环境的温湿度数据;
甲醛ZE08模块 是一款高精度甲醛传感器,用来检测空气中的甲醛浓度,数据通过 UART 传输到 STM32;GP2Y1010AU0F 是光学粉尘传感器,用于监测 PM2.5 浓度,输出模拟电压信号,通过 ADC 转换后进行数据处理;
ESP8266 是一款 WiFi 模块,支持无线数据传输,能够将环境参数通过网络上传至远程服务器或客户端,实现远程监控;按键 有 3 个,分别用于切换模式、调整报警阈值等操作;蜂鸣器 是报警装置,当环境参数超出阈值时通过声音警告用户;
三极管8550 是 PNP 型三极管,用于驱动蜂鸣器工作;滑动电阻103 是 10KΩ 的可调电阻,用于调节信号输入电压或电流;自锁开关 用于控制系统的电源开关;电源头 提供系统所需的电源输入,通常连接 5V 或 3.3V 电源;
万用板 用于连接和固定所有硬件组件,便于搭建和调试;USB线 用于将 STM32 开发板与电脑连接,便于程序下载和调试,同时可以为系统供电;
电阻和电容 包括 10KΩ(2个)、1KΩ(1个)、150Ω(1个)和 220uF(2个),分别用于限流、分压和信号滤波,确保系统稳定工作。以上硬件模块共同组成了一个功能完整的环境监测系统,具备 数据采集、显示、报警以及无线传输 等多种功能。
2. 硬件焊接:
需要按照电路设计图合理连接各个模块并确保运行正常。首先,将 STM32F103C8T6 焊接在 万用板 的中心位置,作为核心控制单元,周围预留与传感器及外围设备连接的接口;接着,将 LCD1602 的引脚通过杜邦线或焊接方式连接到 STM32 的 GPIO 接口,确保显示屏能够正确显示数据;
DHT11 温湿度传感器接入指定的 GPIO 引脚,同时连接电源和地线;ZE08 甲醛传感器 模块通过 UART 串口连接到 STM32,检测到的甲醛浓度数据直接通过串口通信传输;GP2Y1010AU0F 粉尘传感器 的信号输出端接入 STM32 的 ADC 引脚,电源和地通过电容滤波后再接入,保证信号稳定;
将 ESP8266 WiFi 模块 焊接到电路中,并将其串口接口与 STM32 的 UART 通信引脚连接,同时注意为 ESP8266 提供稳定的 3.3V 电源;按键 焊接到 STM32 的 GPIO 引脚,分别用于切换模式和调整参数,注意焊接时在每个按键与地之间接入 10KΩ 电阻作为下拉电阻;
将 蜂鸣器 的正极通过 三极管8550 控制,三极管的基极连接 STM32 的 GPIO 引脚,集电极接蜂鸣器负极,发射极接地;滑动电阻103 焊接到指定电路位置,用于调节信号输入电压,输出端接入 STM32 的 ADC 引脚;将 自锁开关 焊接在电源输入回路中,用于控制系统整体电源的开启与关闭;电源头 焊接到板上,确保能够为整个系统提供稳定的电源,通常为 5V 或 3.3V;
电阻和电容 根据电路设计焊接到相应位置,例如在信号输入端加装限流电阻或滤波电容,常见的 10KΩ、1KΩ 电阻 和 220uF 电容 用于分压和滤波;
最后,使用 USB线 将 STM32 开发板与电脑连接,供电并方便程序烧录。焊接过程中需注意各模块之间的引脚定义和信号连接,确保电源电压匹配、信号线无短路,焊接完成后通过软件调试验证硬件连接的正确性。
图4-1 电路设计
4.2 系统调试
首先检查所有硬件模块的焊接和连接是否正确,确保没有虚焊、短路或接线错误,各模块使用的电源电压也要匹配设计要求;接通电源后,用万用表逐一测量各模块的供电电压是否稳定,确保 STM32 主控芯片、DHT11 温湿度传感器、ZE08 甲醛传感器、GP2Y1010AU0F 粉尘传感器、ESP8266 WiFi 模块和 LCD1602 显示屏都正常供电;
将 STM32 开发板通过 USB 接口连接电脑,使用集成开发环境(如 Keil 或 STM32CubeIDE)编写或导入控制程序,通过 ST-Link 下载程序到 STM32 芯片中,并实时监控运行状态;首先测试显示功能,确保 LCD1602 正常显示环境数据,若出现乱码或无法显示,需检查数据线连接或初始化代码;
测试 DHT11 温湿度传感器采集的数据是否准确,可通过记录多个温湿度值进行对比,若数据异常则检查 GPIO 引脚连接和初始化代码;测试 ZE08 甲醛传感器,利用串口调试工具查看 UART 传输的数据是否正确解析,并确保浓度值合理;对 GP2Y1010AU0F 粉尘传感器进行调试,将其模拟信号输入 STM32 的 ADC 引脚,查看 ADC 转换后的数字信号是否与粉尘浓度成正比,并通过调整程序中的校准参数优化数据精度;
测试 ESP8266 WiFi 模块,通过设置路由器的 SSID 和密码,让设备连接到无线网络,再通过服务器查看上传的环境数据是否完整,若连接失败或数据丢失则需检查模块与 STM32 的串口通信和供电稳定性;通过按键测试切换模式、调整报警阈值功能是否正常,按键是否触发对应的逻辑操作,若不正常则检查按键与 GPIO 的连接以及代码逻辑;测试蜂鸣器报警功能,设置超出阈值的环境参数,观察蜂鸣器是否正确发出警报,若无声音则检查三极管驱动电路和代码触发状态;
滑动电阻调试时,观察其对信号输入电平的影响,确认其工作正常;在整个调试过程中要多次复查代码逻辑,确保各模块运行稳定、数据采集准确无误,同时注意系统的抗干扰能力,若出现信号波动较大或模块间干扰问题,可通过增加滤波电容或屏蔽措施优化电路设计。
图4-2 系统调试运行效果
五、结论与展望
该基于STM32的环境监测系统通过多种传感器成功实现了对温度、湿度、PM2.5和甲醛浓度的实时采集和监测,并通过LCD显示屏和WiFi模块完成数据的显示和远程传输。同时,系统具备按键设置阈值和蜂鸣器报警功能,保证了操作的灵活性和用户的安全性。
传感器数据采集模块稳定高效,DHT11、GP2Y和SGP30传感器能够准确采集环境参数;按键扫描与阈值设置功能简洁实用,通过按键切换模式和调整阈值,便于用户操作;LCD显示模块的实时数据展示直观清晰,设置模式下能够准确显示当前阈值状态;
WiFi模块实现了远程数据传输,具备较强的扩展性和联网能力;蜂鸣器报警功能及时提示环境异常,充分保障了用户的安全。 系统的初始化部分通过对LCD、蜂鸣器、传感器和通信模块等的配置,确保了其稳定运行和高效协作。
展望未来,该系统可以进一步优化和升级功能,例如增加更多种类的传感器以实现对噪音、光照等环境因素的监测;通过改进算法优化数据处理,提高采集数据的精确性和系统反应速度;结合低功耗设计和太阳能供电技术,实现设备的便携化和能源自供给;进一步完善WiFi传输功能,加入云平台和移动端应用支持,实现数据可视化和智能分析;
通过PCB设计提升系统集成度和抗干扰能力,增强设备的可靠性和适应性。 总之,该系统在实现环境监测的基础上展现了良好的可扩展性和实用性,为未来更广泛的环境监测应用打下了坚实基础。
资源下载详情与下载链接:毕业设计&课程设计&项目开发&大创-基于STM32单片机温湿度PM2.5粉尘甲醛环境质量监测系统wifi(完整工程资料).zip资源-CSDN文库
1. C程序:
2.原理图:
3.实物图片
4.设计资料
5.视频+软件下载
6.元件清单
7.参考论文
8.开题报告
9.制作详解
10.STM32视频教程
11.安卓app
13. xmind1