STM32项目分享:空气质量检测系统

目录

一、前言

二、项目简介

1.功能详解

2.主要器件

三、原理图设计

四、PCB硬件设计

PCB图 

五、程序设计 

六、实验效果 

七、资料内容

扫描二维码关注公众号,回复: 17583405 查看本文章

项目分享


一、前言

项目成品图片:

哔哩哔哩视频链接:

STM32空气质量检测系统

(资料分享见文末) 

二、项目简介

1.功能详解

基于STM32空气质量检测系统

功能如下:

  1. DHT11温湿度传感器检测空气温湿度信息
  2. MQ-7一氧化碳传感器检测一氧化碳含量
  3. 甲醛传感器检测甲醛浓度
  4. PM2.5传感器检测粉尘含量
  5. OLED显示屏实时显示温湿度、一氧化碳、甲醛和PM2.5信息
  6. 空气质量异常触发声光报警并开启风扇通风
  7. 按键可调节阈值范围
  8. WIFI连接APP可远程查看空气质量信息数据
  9. APP可以调节阈值大小
     

2.主要器件

  • STM32F103C8T6单片机
  • OLED 屏幕
  • DHT11温湿度传感器
  • ESP8266(WIFI)模块
  • 三合一甲醛传感器
  • PM2.5粉尘传感器
  • MQ-7一氧化碳传感器
  • 继电器
  • 风扇模块
  • 有源蜂鸣器
  • LED灯
     

三、原理图设计

四、PCB硬件设计

PCB图 

五、程序设计 

#include "sys.h"
#include "delay.h"
#include "adc.h"
#include "gpio.h"
#include "OLED_I2C.h"
#include "timer.h"
#include "MQ7.h"
#include "dht11.h"
#include "esp8266.h"
#include "usart2.h"
#include "usart3.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>


#define STM32_RX2_BUF       Usart2RecBuf          //串口2接收缓存区
#define STM32_Rx2Counter    Rx2Counter           //串口2接收字节计数
#define STM32_RX2BUFF_SIZE  USART2_RXBUFF_SIZE   //串口2接收缓存大小

#define STM32_RX3_BUF       Usart3RecBuf        //串口3接收缓存区
#define STM32_Rx3Counter    Rx3Counter          //串口3接收字节计数
#define STM32_RX3BUFF_SIZE  USART3_RXBUFF_SIZE  //串口3接收缓存大小

#define  RATIO  1.0		   //校准系数,选择范围0.1~1.0 (传感器一般不需要校准,选择1.0即可)
u16 PM25_Value = 0;     		//PM2.5
u16 PM25_Value_max = 200;  //PM2.5报警值
u8 pmBuf[5];               //pm2.5数据缓存数组
u8 ch2oBuf[8];            //甲醛数据缓存数组

char display[16];
unsigned char setn=0;                //记录设置键按下的次数
unsigned char temperature=0;         //温度变量
unsigned char humidity=0;            //湿度变量
unsigned int  CH2O_mgvalue = 0;      //甲醛变量
unsigned char setTempValue=35;        //温度设置值
unsigned char setHumiValue=75;        //湿度设置值
unsigned int setCH2OValue=10;        //甲醛设置值
unsigned char i=0;

unsigned int  co_ppm = 0;                //co值
unsigned int setCoMaxValue=200;          //CO上限

bool shuaxin  = 1;              //刷新数据标志
bool shanshuo = 0;              //液晶闪烁标志
bool sendFlag = 1;              //串口发送数据标志

int main(void)
{
	  u16 timeCount=200;
	  bool delay_600ms=1;
	
		delay_init();	           //延时函数初始化	 
    NVIC_Configuration();	   //中断优先级配置
		KEY_GPIO_Init();        //按键引脚初始化 
	  delay_ms(300); 
	  I2C_Configuration();     //IIC初始化
	  OLED_Init();             //OLED液晶初始化
	  OLED_CLS(0);              //清屏
	  KEY_GPIO_Init();        //按键引脚初始化    
	  OLED_ShowStr(0, 2, "   loading...   ", 2,0);//显示加载中
		while(DHT11_Init())
			{
					OLED_ShowStr(0, 2, "  DHT11 Init!  ", 2,0);//显示DHT11初始化!
					delay_ms(500);
			}
    ESP8266_Init();       //ESP8266初始化	
	  delay_ms(1000);
	  Adc_Init();          //ADC初始化
	  
		OLED_CLS(0);              //清屏
		USART2_Init(9600);       //串口2初始化
		USART3_Init(9600);       //串口3初始化
		displayOriginalInt();   //显示原始界面
	  TIM3_Init(99,719);   //定时器初始化,定时1ms
		//Tout = ((arr+1)*(psc+1))/Tclk ; 
		//Tclk:定时器输入频率(单位MHZ)
		//Tout:定时器溢出时间(单位us)
		while(1)
		{ 
			   keyscan();  //按键扫描
			   
			   if(setn == 0)     //不在设置状态下
				 {
					   timeCount ++;
					   if(timeCount >= 180)
						 {
								timeCount = 0;
							  DHT11_Read_Data(&temperature,&humidity);   //读取温湿度
						 }
					   
						 if(shuaxin == 1)        //大概300ms刷新一下
						 { 
								 shuaxin = 0;
								 
							   delay_600ms = !delay_600ms;
							   
							   if(temperature>=setTempValue && shanshuo)    //温度超过上限,液晶闪烁显示
							   {
									   OLED_ShowChar(32,0,' ',2,0);
										 OLED_ShowChar(40,0,' ',2,0);
								 } 
								 else
								 {
										 OLED_ShowChar(32,0,temperature/10+'0',2,0);    //显示温度
										 OLED_ShowChar(40,0,temperature%10+'0',2,0);
								 }
							   
							   if(humidity>=setHumiValue && shanshuo)        //湿度超过上限,液晶闪烁显示
							   {
									   OLED_ShowChar(103,0,' ',2,0);
										 OLED_ShowChar(111,0,' ',2,0);
								 } 
								 else
								 {
										 OLED_ShowChar(103,0,humidity/10+'0',2,0);      //显示湿度
										 OLED_ShowChar(111,0,humidity%10+'0',2,0);
								 }
								 
								 Get_MQ7_PPM();   //读取一氧化碳值
								 Get_CH2O();      //读取甲醛
								 
							   if((CH2O_mgvalue/10)>=setCH2OValue && shanshuo)   //甲醛超过上限,液晶闪烁显示
							   {
									   OLED_ShowStr(46, 4, "     mg/m3", 2,0);
								 } 
								 else
								 {
										sprintf(display,"%.3fmg/m3",(float)CH2O_mgvalue/1000); 
									  OLED_ShowStr(46, 4, (u8 *)display, 2,0);       //显示甲醛
								 }
							   if(delay_600ms)
								 {
										 Get_PM2_5();            //读取PM2.5
										 if(PM25_Value>999)PM25_Value=999;
								 }
								 
								 if(PM25_Value>=PM25_Value_max && shanshuo)    //pm2.5超过上限,液晶闪烁显示
							   {
									   OLED_ShowStr(56, 2, "   ug/m3", 2,0);
								 } 
								 else
								 {
										 sprintf(display,"%03dug/m3",PM25_Value);
										 OLED_ShowStr(56, 2, (u8 *)display, 2,0);    //显示PM2.5
								 }
								 
								 if(temperature>=setTempValue || humidity>=setHumiValue || (CH2O_mgvalue/10)>=setCH2OValue || PM25_Value>=PM25_Value_max || co_ppm>=setCoMaxValue)
								 {BEEP = 1; RELAY=1;}   //超出上限,蜂鸣器提醒。开启风扇
								 else
								 {BEEP = 0; RELAY=0;}   //关闭风扇和蜂鸣器
						 }
				 }
				 UsartSendReceiveData();   //串口发送接收数据,用于和手机APP通信
			   delay_ms(10);
		}
}

六、实验效果 

七、资料内容

项目分享