一、项目背景
随着现代工业的发展和城市化进程的加速,空气质量问题日益受到关注。人们逐渐意识到空气中有害物质对健康的潜在威胁。为了满足公众对室内外空气质量检测的需求,我们开展了基于STM32F103C8T6的空气质量检测系统的开发项目。此项目旨在通过高效传感器与物联网技术的结合,实现对甲醛、二氧化碳、PM2.5、PM10、TVOC等空气中常见污染物的实时检测和监控。
二、系统概述
本空气质量检测系统的核心是STM32F103C8T6微控制器,该控制器具有高性能和低功耗的特点,为多任务环境下的实时数据处理提供了支持。配合M702传感器模块,该系统能够准确采集空气中的甲醛、二氧化碳、PM2.5、PM10、TVOC浓度及温湿度参数。同时,通过1.8寸TFT彩屏,该系统能够直观地显示检测到的各项数据,便于用户实时了解周围环境的空气质量。
系统的另一个重要组成部分是WiFi模块,通过它,数据能够定期上传至机智云物联网平台及其配套APP。这种设计不仅实现了数据的实时更新与远程监控,还为后续数据挖掘与分析提供了基础。
调试环境:
开发环境:windows10;
IDE:MDK5.38a;
调试器:PWLINK2;
设计中用到来自指定厂商元器件:
(1)STM32F103C8T6,来自ST公司,它基于ARM Cortex-M3内核,具有足够的计算能力和丰富的I/O接口,可以满足传感器数据采集、处理和传输的需求。
(2)ESR03EZPF1001:来自Rohm Semiconductor,1K0603电阻用来给3.3V电源指示灯限流。
系统设计及实现
1、硬件设计
- 核心处理器:STM32F103C8T6被选为系统的主要控制器。它基于ARM Cortex-M3内核,具有足够的计算能力和丰富的I/O接口,可以满足传感器数据采集、处理和传输的需求。
- 传感器模块:M702传感器用于实时监测多种空气质量指标(甲醛、CO2、PM2.5、PM10和TVOC)。选择M702因为其集成度高,能同时提供多种测量,减少了系统的复杂性和开发工作量。
- 显示单元:使用了1.8寸TFT彩屏以显示实时的空气质量数据。TFT屏幕能够以多彩的方式呈现数据,用户界面友好。
- 通信模块:WiFi模块负责将采集到的数据上传到机智云物联网平台。我们选用了具有稳定传输性能和良好兼容性的ESP01S模块。它的使用保证了数据能够可靠地传输到云端,实现远程监控。
2、软件设计
- 数据采集与处理:在STM32F103C8T6上编写了驱动程序实现对M702传感器的控制,通过UART接口读取传感器数据。数据采集程序能够周期性地采集传感器的输出,并进行基本的滤波处理,以减少测量噪声。
- 通信协议:通过MQTT协议与机智云平台进行数据交换,确保数据传输的安全性和稳定性。
- 用户界面(TFT显示):设计了简单易懂的用户界面,使用不同颜色指示空气质量的优劣。
3、云平台集成
- 数据上传频率设置为每1分钟一次,用户可以通过机智云APP随时查看实时数据。
- 支持历史数据的存储和图表分析功能,便于用户对空气质量趋势的长期观察。
三、系统分析
3.1 硬件分析
空气质量检测系统以STM32F103C8T6主控芯片组为核心,由M702七合一空气质量检测模块、TFT显示模块、ESP01SWIFI构成。
本项目的主要框图如下:
3.2 模块介绍
3.2.1 STM32F103C8T6
1. 详细解释:
- STM32F103C8T6是意法半导体(STMicroelectronics)公司推出的一款微控制器芯片,采用了ARM Cortex-M3内核架构。
- - 它具有丰富的外设资源,包括多个通用目的I/O引脚、串口通信接口、定时器、模数转换器(ADC)、SPI、I2C等,可满足各种应用需求。
- 芯片内部还集成了闪存存储器和RAM,用于存储程序代码和数据。
- 它支持多种通信协议和总线,如CAN、USB、Ethernet等,可方便地与其他设备进行通信。
2. 参数规格:
- 32位ARM Cortex-M3内核,主频可达到72MHz。
- 闪存存储器容量为64KB或128KB。
- RAM容量为20KB。
- 支持多种外设接口,如GPIO、USART、SPI、I2C、ADC等。
- 支持多种通信协议和总线,如CAN、USB、Ethernet等。
- 工作电压范围为2.0V至3.6V。
3. 应用领域:
- STM32F103C8T6广泛应用于各种嵌入式系统和物联网(IoT)设备。
- 它可以用于工业自动化控制、家用电器控制、智能家居系统、电动工具、医疗设备、安防系统等领域。
- 由于其丰富的外设资源和通信接口,它也常用于各种传感器节点、无线通信模块、机器人控制等应用场景。
3.2.2 M702七合一传感器
M702七合一传感器模块是一款高性价比的数字串口输出传感器模块,采用UART串口电平输出模式,集CO2,甲醛,TVOC,激光粉尘PM2.5,PM10颗粒物,温度,湿度于一体。它可对所处环境进行实时全面的检测,具有良好的稳定性非常方便客户使用。
应用领域:
● 酒店房间空气质量监控
● 农业大棚,户外养殖场所环境监控
● 新风换气系统
● 空气净化器,空调
● 空气质量监测设备
● 厨卫换气控制系统
● 智能家居设备
特点:
● 同时输出二氧化碳.甲醛.TVOC.PM2.5. PM10.温度.湿度共七组数据
● 灵敏度高,数据稳定
● UART 输出模式
● 温度精确到0.1℃,湿度精确到0.1%
● 每2秒自动通过UART信号输出七组传感器监测数据
规格参数:
类 别
| 测 量 分 辨 率 | 测 量 范 围 | 测 量 精 度 |
CO2 | 1ppm | 400ppm~5000ppm | ±25% |
CH2O | 1ug/m3 | 0ug~1000ug/m³ | ±25% |
TVOC | 1ug/m3 | 0ug~2000ug/m³ | ±25% |
PM2.5 | 1ug/m3 | 0ug/m3~999ug/m³ | ±10% |
PM10 | 1ug/m3 | 0ug/m3~1000ug/m³ | ±10% |
Temperature | 0.01℃ | -40℃~100℃ | ±0.3℃ |
Humidity | 0.04% | 0~100% | ±3%RH |
物理接口 | XH2.54母座 | ||
输出数据 | UART | ||
工作电压 | 5.0±0.2VDC | ||
工作电流 | ≤80mA | ||
预热时间 | 2分钟(只有CO2,CH2O和TVOC需要预热,其它参数上电即显示) | ||
工作温度 | 0℃~50℃ | ||
工作湿度 | ≤95%RH | ||
外形尺寸 | 62*49*15mm(L×W×H) | ||
使用寿命 | 5年(空气中) |
注意:模块输出的CO2值和CH2O值均为TVOC的等效值,客户购买和使用时请注意。
UART 接口定义:
接口
| 名称 | 功能 |
1 | 5V | 接电源 5V |
2 | GND | 电源地 |
3 | N/A | 悬空 |
4 | TXD | UART 数据输出脚 |
串口数据流格式:
波特率
| 9600bps |
数据位 | 8 位 |
校验位 | 无 |
停止位 | 无 |
通信协议:
字 节
| 名称 | 说明 |
B1 | 帧头1 | 固定值 3Ch |
B2 | 帧头2 | 固定值 02h |
B3 | 数据 | eCO2 高字节 |
B4 | 数据 | eCO2 低字节 |
B5 | 数据 | eCH2O 高字节 |
B6 | 数据 | eCH2O 低字节 |
B7 | 数据 | TVOC 高字节 |
B8 | 数据 | TVOC 低字节 |
B9 | 数据 | PM2.5 高字节 |
B10 | 数据 | PM2.5 低字节 |
B11 | 数据 | PM10 高字节 |
B12 | 数据 | PM10 低字节 |
B13 | 数据 | Temperature 整数部分 |
B14 | 数据 | Temperature 小数部分 |
B15 | 数据 | Humidity 整数部分 |
B16 | 数据 | Humidity 小数部分 |
B17 | 校验和 | 校验和 |
说明:校验和B17等于:B1+B2+······B16的值,取低8位。
当温度的数据 B13 的bit7=1 时, 代表是负温度,B13 的bit7=0 时,是正温度。例如,当 B13=9Bh 时,此时 bit7=1, 表示是负温度,此时实际温度就是-27℃;如果 B13=1Bh,此时bit7=0,代表是正温度,此时实际温度就是 27℃。
3.2.3 1.8寸TFT彩屏
SPI通讯,采用中景园电子代码。
3.2.4 WIFI

采用ESP01S烧录机智云透传AT固件。
3.3 具体功能介绍
3.3.1 M702模块的数据读取
M702连接示意图
串口通道采用:UART3 RX:PB11,具体代码如下:
采用通用串口接收数据的方式。
代码实现:
读取M702发送的数据保存到数组中,在读取出来。
void USART3_SendData(u8 data)
{
while((USART3->SR&0X40)==0);
USART3->DR = data;
}
#if EN_USART3_RX
void uart3_init(u32 bound)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOB时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //串口3时钟使能
USART_DeInit(USART3); //复位串口3
//USART3_TX PB10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10
//USART3_RX PB11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB11
USART_InitStructure.USART_BaudRate = bound;//波特率一般设置为9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART3, &USART_InitStructure); //初始化串口 3
USART_Cmd(USART3, ENABLE); //使能串口
//使能接收中断
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断
//设置中断优先级
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
}
void USART3_IRQHandler(void) //串口3中断服务程序
{
static uint8_t RxState = 0; //数据状态标志位
static uint8_t pRxPacket = 0; //数据存储位置
if (USART_GetITStatus(USART3, USART_IT_RXNE) == SET)
{
uint8_t RxData = USART_ReceiveData(USART3);
if (RxState == 0) //状态为0,即接收包头1
{
if (RxData == 0x3C)
{
RxState = 1;
// pRxPacket = 1;
}
}
else if (RxState == 1) //状态为1,即接收包头2
{
if (RxData == 0x02)
{
RxState = 2;
pRxPacket = 2;
}
}
else if (RxState == 2) //状态为2,即接收数据
{
Serial_RxPacket[pRxPacket] = RxData;
pRxPacket ++;
if (pRxPacket >= 15)
{
RxState = 3;
}
}
else if (RxState == 3) //状态为3,即接收包尾
{
RxState = 0;
Serial_RxFlag = 1;
}
USART_ClearITPendingBit(USART3, USART_IT_RXNE); //手动清除标志位
}
}
uint8_t Serial_GetRxFlag(void) //获取数据接收标志位
{
if (Serial_RxFlag == 1)
{
Serial_RxFlag = 0;
return 1;
}
return 0;
}
3.3.2 1.8寸TFT显示
引脚名称 | 描述 |
GND | 电源地 |
VCC | 电源正3.3~5V |
SCL | SPI时钟线 |
SDA | SPI数据线 |
RES | 复位接口 |
DC | SPI数据/命令选择线 |
CS | SPI片选 |
BLK | 背光控制 |
采用中景园子的代码利用GPIO模拟SPI通信
使用STM32F103C8T6将中英文字符、数字和图片显示在LCD显示屏上。
LCD_SCL | PB0 |
LCD_SDA | PA7 |
LCD_RES | PA6 |
LCD_DC | PA5 |
LCD_CS | PA4 |
LCD_BLK | PA1 |
//-----------------LCD端口定义----------------
#define LCD_SCLK_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_0)//SCL=SCLK
#define LCD_SCLK_Set() GPIO_SetBits(GPIOB,GPIO_Pin_0 )
#define LCD_MOSI_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_7)//SDA=MOSI
#define LCD_MOSI_Set() GPIO_SetBits(GPIOA,GPIO_Pin_7)
#define LCD_RES_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_6)//RES
#define LCD_RES_Set() GPIO_SetBits(GPIOA,GPIO_Pin_6)
#define LCD_DC_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_5)//DC
#define LCD_DC_Set() GPIO_SetBits(GPIOA,GPIO_Pin_5)
#define LCD_CS_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_4)//CS
#define LCD_CS_Set() GPIO_SetBits(GPIOA,GPIO_Pin_4)
#define LCD_BLK_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_1)//BLK
#define LCD_BLK_Set() GPIO_SetBits(GPIOA,GPIO_Pin_1)
void LCD_GPIO_Init(void);//初始化GPIO
void LCD_Writ_Bus(u8 dat);//模拟SPI时序
void LCD_WR_DATA8(u8 dat);//写入一个字节
void LCD_WR_DATA(u16 dat);//写入两个字节
void LCD_WR_REG(u8 dat);//写入一个指令
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2);//设置坐标函数
void LCD_Init(void);//LCD初始化
3.3.3 ESP01S与机智云通信
具体的配置可以参考:机智云配置移植教程
这里说明一下,基础工程需要具备什么条件呢?答案是:必须得有两个串口功能和实现1ms定时的定时器功能。这一点可以看下图,机智云官网上有提出。所以,如果不想用资料提供的基础工程做移植操作,而是想用你自己的工程来做移植操作的,只要你的项目还空出两个串口可以用,以及有个定时器,就可以继续按下文进行操作。
四、PCB设计
采用立创EDA设计
原理图如下:
PCB图如下:
五、项目成果与验证
通过实际环境测试,系统能够稳定运行48小时以上,数据准确率达到预期目标。用户可通过APP实时查看监控数据,并根据提示采取适当措施改善空气质量。整个系统在运行过程中的功耗控制和数据传输稳定性方面也表现突出。
实物:
经验总结
在项目开发过程中,我们收获颇丰:
- 模块化开发:发展出一套模块化开发方法,为系统升级和维护提供了便利。
- 抗干扰设计:增进了系统在复杂电磁环境中的抗干扰能力,通过硬件滤波与信号校准,保证了数据的可靠性。
六、未来展望
未来,我们计划引入AI分析技术,对历史空气质量数据进行更深入的分析,预测环境变化趋势。同时,将进一步降低设备的制造成本,使空气质量检测系统能被更多家庭、学校、公共建筑等广泛采用,从而为公众提供更健康的生活环境。最后感谢电子森林的支持,在开发过程,遇到了很多问题,大多在网上搜索答案,从而提高自己的解决问题的能力。