【STM32项目】基于STM32单片机温湿度PM2.5粉尘甲醛环境质量监测系统wifi【完整工程资料源码】

演示视频:

基于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的引脚功能描述
蜂鸣器B1A1发出报警音频信号
按键(S1)S1A2用于设置和控制系统功能
按键(S2)S2A3用于设置和控制系统功能
按键(S3)S3A4用于设置和控制系统功能
DHT11温湿度传感器VCC (电源)VCC提供电源
GNDGND地线连接
DATAA5传输温湿度数据
LCD1602显示屏VSSGND地线连接
VCC5V提供电源
RSA6选择寄存器
RWGND写/读选择
EA7启动信号
D0-D3B0-B3数据传输线
D4-D7B4-B7数据传输线
PM2.5传感器VCCVCC提供电源
GNDGND地线连接
OUTA8输出PM2.5数据
甲醛传感器VCCVCC提供电源
GNDGND地线连接
AOUTA9输出甲醛数据
ESP8266 WiFi模块VCCVCC提供电源
GNDGND地线连接
RXA10接收数据
TXA11发送数据

图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 种状态:

    1. 显示温湿度实时值。
    2. 设置温度报警阈值。
    3. 设置湿度报警阈值。
    4. 设置 PM2.5 报警阈值。
    5. 设置甲醛浓度报警阈值。
  • key2 和 key3

    • key2 用于增加当前设置值。
    • key3 用于减少当前设置值。
    • 数据范围:
      • 温度阈值:0 ~ 99°C
      • 湿度阈值:0 ~ 99%
      • PM2.5 阈值:0 ~ 500
      • 甲醛浓度阈值:0 ~ 50000(以 0.0001 mg/m³ 为单位)。

2. 显示模式切换

  • 通过 LCD1602 显示屏显示不同环境参数和设置界面。
  • 使用 Lcd_Display_2DateLcd_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
    • 数据传输:
      • 构造发送数据字符串 table1,包含:
        • 温度:"T:XX°C"
        • 湿度:"H:XX%"
        • PM2.5:"PM:XXX"
        • 甲醛:"Ch2o:XX.XXXXmg/m³"
      • 使用 ESP8266_Set 函数发送数据到客户端。
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 型三极管,用于驱动蜂鸣器工作;滑动电阻10310KΩ 的可调电阻,用于调节信号输入电压或电流;自锁开关 用于控制系统的电源开关;电源头 提供系统所需的电源输入,通常连接 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 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/945166.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

优化站群SEO:使用苹果CMS泛目录插件实现泛目录页面刷新不变

优化站群SEO&#xff1a;使用苹果CMS泛目录插件实现泛目录页面刷新不变 在当今数字营销环境中&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;是提升网站流量和可见性的关键策略。苹果CMS作为一款灵活的内容管理系统&#xff0c;提供了丰富的插件功能&#xff0c;尤其是…

SAP PP bom历史导出 ALV 及XLSX 带ECN号

bom总数 104W PS超过XLSX上限 &#xff0c;那就分文件 *&---------------------------------------------------------------------* *& Report ZRPT_PP_BOM_HIS_ECN *&---------------------------------------------------------------------* *& tcode:zpp0…

HAL 库句柄

一、命名方式&#xff1a;句柄是h为首字母&#xff0c;后面接协议名称 比如&#xff1a;huart、hadc、hi2c等 二、句柄类型&#xff1a; 这里拿huart举例&#xff0c;它的类型是UART_HandleTypeDef 进去stm32f1xx_hal_uart.h之后发现句柄的结构定义有部分是灰色的 灰色的当U…

JVM 性能监控工具之命令行篇

在 Java 开发过程中&#xff0c;性能监控和问题排查是开发者经常面临的任务。JDK 提供了一系列命令行工具&#xff0c;帮助开发者监控 JVM 运行状态、诊断内存泄漏、线程死锁等问题。本文将详细介绍这些工具的使用方法及其应用场景。 1 JDK性能监控工具 1.1 jps&#xff1a;查…

使用IDEA远程debug服务器上的jar包

仅用于测试环境调试&#xff0c;debug会阻塞 如生产jar包叫 test.jar &#xff0c;部署的IP为10.184.136.18&#xff0c;端口为9999&#xff0c;idea的项目为local-network&#xff0c;照如下配置即可&#xff0c;仅红色部分需替换 弄完之后&#xff0c;打开debug&#xff0c;…

【SQL Server】教材数据库(3)

接着教材数据库&#xff08;1&#xff09;的内容&#xff0c;完成下列查询。 1 查询订购高等教育出版社教材的学生姓名 2 查询比所有高等教育出版社的图书都贵的图书信息 3 列出每位学生姓名、订购教材书名、价格。 1、嵌套查询&#xff1a;use jiaocai select student.nam…

你有哪些Deep Learning(RNN、CNN)调参的经验?

在深度学习的实践中&#xff0c;调参是一项既艺术又科学的工作。它不仅需要理论知识的支撑&#xff0c;还需要大量的实践经验。以下是一些在RNN和CNN模型调参中积累的经验&#xff0c;希望对正在这个领域摸索的朋友们有所帮助。 1. 从成熟的开源项目开始 对于初学者来说&…

Unity3D仿星露谷物语开发11之添加Scenary Fader

1、目标 当角色移动到草/树的后面时&#xff0c;因为草/树层级优先级大于等于角色&#xff0c;导致角色无法全部展示。 如下图所示&#xff0c;草遮挡了一半的角色&#xff0c;而树则遮挡了全部的角色。 我们希望当角色走到草/树的后面时&#xff0c;草/树能够改变透明度&…

021-spring-springmvc

比较重要的部分 比较重要的部分 比较重要的部分 关于组件的部分 这里以 RequestMappingHandlerMapping 为例子 默认的3个组件是&#xff1a; org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping org.springframework.web.servlet.mvc.method.annotation.Requ…

关于 PCB线路板细节锣槽问题 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/144783817 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

无人机快速巡检、森林、电力、水利大大节省人力成本,降低风险事故

无人机在快速巡检、森林、电力、水利等领域的应用&#xff0c;确实大大节省了人力成本&#xff0c;并有效降低了风险事故。以下是对这些应用的详细分析&#xff1a; 一、无人机快速巡检 无人机快速巡检技术以其高效性、安全性和精准性&#xff0c;在众多领域展现出了巨大的应…

生态碳汇涡度相关监测与通量数据分析实践技术应用

基于MATLAB语言、以实践案例为主&#xff0c;提供所有代码、原理与操作结合 1、以涡度通量塔的高频观测数据为例&#xff0c;基于MATLAB开展上机操作&#xff1a; 2、涡度通量观测基本概况&#xff1a;观测技术方法、数据获取与预处理等 3、涡度通量数据质量控制&#xff1a…

【Lua之·Lua与C/C++交互·Lua CAPI访问栈操作】

系列文章目录 文章目录 前言一、概述1.1 Lua堆栈 二、栈操作2.1 基本的栈操作2.2 入栈操作函数2.3 出栈操作函数2.4 既入栈又出栈的操作函数2.5 栈检查与类型转换函数2.5 获取表数据 三、实例演示总结 前言 Lua是一种轻量级的、高性能的脚本语言&#xff0c;经常被用于游戏开发…

安装OpenGauss数据库流程

一、安装完欧拉系统将yum上传至本地&#xff1a; 创建文件 mkdir /media/iso 挂载镜像 mount /dev/sr0 /media/iso 未通网情况&#xff0c;删除自带的yum&#xff0c;创建一个新的 cd /etc/yum.repos.d/ rm -r 加yum文件名称 &#xff08;删除自带yum&#xff09; v…

Go语言zero项目服务恢复与迁移文档

## 一. 服务器环境配置 在迁移和配置 项目时&#xff0c;首先需要确保服务器环境正确配置。以下是配置步骤&#xff1a; ### 1. 安装 Go 语言环境 首先&#xff0c;确保 Go 语言环境已经安装&#xff0c;并且配置正确。执行以下步骤&#xff1a; # 下载 Go 语言安装包 wge…

【 Sonarqube】可视化Java项目单元测试覆盖率统计框架搭建

一、项目背景&#xff1a; 一个小公司的朋友反应他们那边Java项目单元测试有&#xff0c;但还没有可视化统计覆盖率数据&#xff0c;没法统计就不能直观的看到单测的覆盖率&#xff0c;Java的覆盖率统计框架还是比较成熟&#xff0c;部署起来也不是很难&#xff0c;下面我们逐…

使用ForceBindIP绑定应用到指定IP

前言 使用ForceBindIP工具&#xff0c;用户可以轻松地将特定应用程序绑定到指定的IP地址&#xff0c;从而确保应用程序的网络连接通过指定的网络适配器进行。通过在命令提示符下运行ForceBindIP并指定IP地址和应用程序的完整路径&#xff0c;用户能够控制应用程序的网络流量&a…

Webpack学习笔记(6)

首先搭建一个基本的webpack环境&#xff1a; 执行npm init -y&#xff0c;创建pack.json&#xff0c;保存安装包的一些信息 执行npm install webpack webpack-cli webpack-dev-server html-webpack-plugin -D&#xff0c;出现node_modules和package-lock.json。 1.source-Ma…

【学生管理系统】element ui级联菜单bug

级联后端 通过父id来进行查询 GetMapping("/{parentId}")public BaseResult findAllByParentId(PathVariable("parentId") String parentId){//1 根据父id查询所有城市QueryWrapper<TbCity> queryWrapper new QueryWrapper<>();queryWrapper.…

关于无线AP信道调整的优化(锐捷)

目录 一、信道优化的基本原则二、2.4G频段信道优化三、5G频段信道优化四、信道优化代码具体示例五、其他优化措施 一、信道优化的基本原则 信道优化旨在减少信道间的干扰&#xff0c;提高网络覆盖范围和信号质量。基本原则包括&#xff1a; 1. 选择合适的信道&#xff1a;根据…