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

一、前言
项目成品图片:
哔哩哔哩视频链接:
STM32空气质量检测系统
(资料分享见文末)
二、项目简介
1.功能详解
基于STM32空气质量检测系统
功能如下:
- DHT11温湿度传感器检测空气温湿度信息
- MQ-7一氧化碳传感器检测一氧化碳含量
- 甲醛传感器检测甲醛浓度
- PM2.5传感器检测粉尘含量
- OLED显示屏实时显示温湿度、一氧化碳、甲醛和PM2.5信息
- 空气质量异常触发声光报警并开启风扇通风
- 按键可调节阈值范围
- WIFI连接APP可远程查看空气质量信息数据
- 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);
}
}
六、实验效果
七、资料内容