文章目录
- 一、前言
-
- [1.1 项目开发背景](#1.1 项目开发背景)
- [1.2 设计实现的功能](#1.2 设计实现的功能)
- [1.3 项目硬件模块组成](#1.3 项目硬件模块组成)
- [1.4 系统框架图](#1.4 系统框架图)
- [1.5 系统原理图](#1.5 系统原理图)
- [1.6 实物图](#1.6 实物图)
- 二、硬件选型
-
- [2.1 STM32开发板](#2.1 STM32开发板)
- [2.2 OLED显示屏(IIC协议4针)](#2.2 OLED显示屏(IIC协议4针))
- [2.3 stlink下载器](#2.3 stlink下载器)
- [2.4 WIFI模块](#2.4 WIFI模块)
- [2.5 PM2.5粉尘检测传感器](#2.5 PM2.5粉尘检测传感器)
- [2.6 SHT30温湿度模块](#2.6 SHT30温湿度模块)
- [2.7 MS1100VOC](#2.7 MS1100VOC)
- [2.8 SGP30模块](#2.8 SGP30模块)
- [2.9 下单PCB制板文件](#2.9 下单PCB制板文件)
- [2.10 下单其他的元器件芯片(PCB焊接需要)](#2.10 下单其他的元器件芯片(PCB焊接需要))
- 三、涂鸦智能云平台开发
-
- [3.1 登录涂鸦平台](#3.1 登录涂鸦平台)
- [3.2 创建产品](#3.2 创建产品)
- [3.3 设备开发](#3.3 设备开发)
- [3.4 产品配置](#3.4 产品配置)
- [3.5 应用开发](#3.5 应用开发)
- [3.6 设备上云](#3.6 设备上云)
-
- 【1】设备的凭证
- 【2】一键获取MQTT三元组信息
- 【3】MQTT标准主题定义
- 【10】MQTT调试助手上云测试
- 【11】MQTT调试助手:订阅主题测试
- 【12】MQTT调试助手上传数据测试
-
- [1. 上报单个属性 (以电池电量为例)](#1. 上报单个属性 (以电池电量为例))
- [2. 同时上报多个属性](#2. 同时上报多个属性)
- [3. 上报所有属性示例](#3. 上报所有属性示例)
- 【13】设备日志
- 四、STM32代码设计
-
- [4.1 硬件连线说明](#4.1 硬件连线说明)
- [4.2 硬件原理图](#4.2 硬件原理图)
- [4.3 硬件组装过程](#4.3 硬件组装过程)
- [4.4 硬件实物图](#4.4 硬件实物图)
- [4.5 KEIL工程截图](#4.5 KEIL工程截图)
- [4.6 程序下载](#4.6 程序下载)
- [4.7 程序正常运行效果](#4.7 程序正常运行效果)
- [4.8 取模软件的使用](#4.8 取模软件的使用)
- [4.9 main.c代码](#4.9 main.c代码)
- 五、总结
一、前言
1.1 项目开发背景
近年来,随着城市化进程的加速和人们生活水平的显著提高,室内环境质量已成为关乎公众健康与生活舒适度的核心议题。现代人平均有超过80%的时间在室内度过,而装修材料释放的甲醛、烹饪或吸烟产生的细颗粒物(PM2.5)、人员密集导致的二氧化碳浓度升高等因素,正悄然威胁着居住者的呼吸系统与心血管健康。传统单一功能的温湿度计或简易检测仪已无法满足人们对环境安全的全方位感知需求,需一种能够实时、综合、远程监控多种环境参数的智能化系统,为用户提供及时预警与数据参考。
在物联网(IoT)技术蓬勃发展的当下,将传统传感器网络与云平台深度融合,已成为环境监测领域的主流趋势。通过无线通信技术将分散的传感节点接入云端,不仅能够实现数据的远程存储与历史追溯,还能借助移动终端打破地域限制,让用户随时随地掌握居家或办公场所的环境状况。涂鸦智能作为全球化的IoT云平台服务商,提供了从硬件模组、固件到APP面板的一站式解决方案,其成熟的生态体系能够显著降低物联网产品的开发门槛,加速从原型到商用的转化过程,这为本系统的云接入与移动端交互提供了可靠且高效的技术路径。
针对上述需求与机遇,本项目设计并实现了一套基于STM32F103C8T6微控制器的室内环境监测系统。系统集成SHT30温湿度传感器、夏普PM2.5粉尘传感器、SGP30二氧化碳传感器以及MS1100VOC甲醛检测传感器,实现了对室内关键空气质量参数的全面采集。在本地端,采用0.96寸OLED屏幕进行直观的数据呈现,并设置超标声光报警(蜂鸣器)机制,确保即时响应能力;在云端,通过烧录涂鸦MQTT固件的ESP8266模组,以STA模式连接Wi-Fi,将数据实时上报至涂鸦物联网云平台,并利用涂鸦智能生活APP的免代码面板工具设计可视化界面,最终达成"端-云-移动端"一体化的完整闭环监测系统,为智能家居环境安全提供了一种低成本、易部署、可扩展的实用解决方案。




1.2 设计实现的功能
(1)支持检测环境空气湿度、温度。
(2)支持检测空气里PM2.5含量。
(3)支持检测空气里二氧化碳含量。
(4)支持检测空气里甲醛含量。
(5)本地支持OLED显示屏本地实时显示所有检测数据。
(6)支持数据上云,设备端采集的数据通过WIFI上传到涂鸦物联网云平台进行存储。
(7)支持涂鸦官方的智能生活手机端APP远程查看设备的数据,使用涂鸦的小程序面板设计界面,无需代码。
(8)如果采集的数据超出正常范围,蜂鸣器会发出声音提醒,同时报警状态上传到云平台,在手机APP上也会弹窗提示。
1.3 项目硬件模块组成
(1)主控芯片:STM32F103C8T6,负责整体逻辑控制、传感器数据采集、数据处理与通信协调。
(2)温湿度检测模块:SHT30,通过IIC协议与STM32通信,用于检测环境空气湿度与温度。
(3)PM2.5检测模块:夏普PM2.5粉尘传感器,STM32通过串口方式采集传感器输出的ADC模拟数据,再通过算法转换为具体浓度值。
(4)二氧化碳检测模块:SGP30,通过IIC协议与STM32通信,用于检测空气里二氧化碳含量。
(5)甲醛检测模块:MS1100VOC传感器,STM32采用ADC方式采集传感器数据,再通过算法转换为具体的甲醛浓度值。
(6)无线通信模块:ESP8266,烧录了支持涂鸦的MQTT固件,配置为STA+TCP客户端模式,通过串口协议与STM32通信,实现数据上云。
(7)本地显示模块:0.96寸OLED显示屏,通过IIC协议与STM32通信,用于本地实时显示所有检测数据。
(8)报警模块:高电平触发的有源蜂鸣器,STM32采用高低电平方式驱动,当数据超出正常范围时发出声音提醒。
(9)电源模块:USB接口供电,为整个系统提供工作电源。
1.4 系统框架图

1.5 系统原理图

1.6 实物图


二、硬件选型
2.1 STM32开发板

2.2 OLED显示屏(IIC协议4针)

2.3 stlink下载器

2.4 WIFI模块

2.5 PM2.5粉尘检测传感器

2.6 SHT30温湿度模块

2.7 MS1100VOC


2.8 SGP30模块

SGP30是一款单一芯片上具有多个传感元件的金属氧化物气体传感器内集成4个气体传感元件,具有完全校准的空气质量输出信号,另外SGP易于集成,能够将金属氧化物气体传感器集成到移动设备中,为智能家居,家电和物联网应用中的环境监测开辟了新的可能性。
2.9 下单PCB制板文件
如果不会下单PCB,看下面视频,手把手教程。
【嘉立创导入工程与PCB下单制板的过程演示(2026)】 https://www.bilibili.com/video/BV1vz6RB1Egt/?share_source=copy_web\&vd_source=347136f3e32fe297fc17177194ce0a8b
2.10 下单其他的元器件芯片(PCB焊接需要)
如果不会一件下单元器件,看下面视频,手把手教程。
【嘉立创如何一键下单购买元器件?】 https://www.bilibili.com/video/BV1fszyBHEuA/?share_source=copy_web\&vd_source=347136f3e32fe297fc17177194ce0a8b
三、涂鸦智能云平台开发
3.1 登录涂鸦平台

3.2 创建产品
【1】选择其他类型,自定义品类

选择自定义品类。

【2】填写产品信息,创建产品
填写产品的详细信息

【3】创建自定义功能

(1)创建温度属性

(2)环境湿度

(3)二氧化碳

(4)PM2.5

(5)甲醛含量

(6)报警状态

(7)运行模式

(8)风扇开关

【4】添加2个标准功能

3.3 设备开发
【1】选择接入方式


【2】选择接入协议-查看MQTT协议端口与地址


在文档里可以看出MQTT接入地址与端口:
cpp
中国数据中心 m1.tuyacn.com 8883


【3】激活验证



【4】注册设备



一键复制凭证:
cpp
ProductID:hvx8zs1x0jv3fq8v
DeviceID:26bf957e0cb3e96a747owh
DeviceSecret:HzAb2Wyoa1wLTuiL


【5】设备管理

3.4 产品配置
【1】设备绑定范围设置

设置全部可用。

3.5 应用开发
【1】安装智能生活APP(Android、IOS都可以)

【2】面板开发设计
现在选择的通用面板,不需要开发,会自动根据创建的属性显示对应效果。

手机上安装了智能生活APP之后,直接打开APP绑定设备即可。

点击扫一扫:

然后找到设备的二维码:


扫码之后即可绑定:

绑定之后的效果:

【3】APP面板完成
目前的界面如下:

3.6 设备上云
【1】设备的凭证

下面是设备的重要凭证:
cpp
ProductID:hvx8zs1x0jv3fq8v
DeviceID:26bf957e0cb3e96a747owh
DeviceSecret:HzAb2Wyoa1wLTuiL
【2】一键获取MQTT三元组信息
帮助文档:https://developer.tuya.com/cn/docs/iot/Protocol-Access?id=Kb3kq5nl2291v

MQTT参数:客户端ID格式
| Client ID | MQTT 协议字段,格式为 tuyalink_{$deviceid} |
|---|
MQTT参数:MQTT用户名和密码获取方式。

在线Python运行地址:https://www.jyshare.com/compile/9/
代码如下:
cpp
# 从产品开发平台获取设备相关信息
DeviceID = '26bf957e0cb3e96a747owh'
DeviceSecret = 'HzAb2Wyoa1wLTuiL'
# 默认配置
Address='m1.tuyacn.com'
Port = 8883
# 计算 Client ID
ClientID = 'tuyalink_'+DeviceID
# 计算用户名
import time
T = int(time.time())
UserName= f'''{DeviceID}|signMethod=hmacSha256,timestamp={T},secureMode=1,accessType=1'''
# 计算密码
import hmac
from hashlib import sha256
data = f'''deviceId={DeviceID},timestamp={T},secureMode=1,accessType=1'''.encode('utf-8') # 加密数据
appsecret = DeviceSecret.encode('utf-8') # 秘钥
Password = hmac.new(appsecret, data, digestmod=sha256).hexdigest()
# 打印MQTT连接所需的参数
print('-'*20)
print('Client ID:',ClientID)
print('服务器地址:',Address)
print('端口:',Port)
print('*用户名:',UserName)
print('*密码:',Password)
print('SSL/TLS: true\n证书类型: CA signed server\nSSL安全: 开启')
print('-'*20)
运行代码获取结果:

cpp
--------------------
Client ID: tuyalink_26bf957e0cb3e96a747owh
服务器地址: m1.tuyacn.com
端口: 8883
*用户名: 26bf957e0cb3e96a747owh|signMethod=hmacSha256,timestamp=1784692430,secureMode=1,accessType=1
*密码: 2acad9b0ee0a4cb6eb17842909adaee57a6afd52f9ccbc5c9c96c414243e82f2
SSL/TLS: true
证书类型: CA signed server
SSL安全: 开启
--------------------
【3】MQTT标准主题定义
链接地址:https://developer.tuya.com/cn/docs/iot/MQTT_Topic?id=Kbt4ezpeko2rz

常用的设备端订阅的主题如下:下面的主题主要用于设备从云平台订阅消息或接收指令。
cpp
属性上报 接收属性上报的云端响应 tylink/${deviceId}/thing/property/report_response
属性下发 接收下发的设备属性 tylink/${deviceId}/thing/property/set
NTP 服务 接收时间校正 NTP 的云端响应 tylink/${deviceId}/ext/time/response
常用的设备端发布主题如下:下面的主题主要用于设备向云平台发布消息或发起业务请求。
cpp
属性上报 设备主动属性上报 tylink/${deviceId}/thing/property/report
属性下发 设备响应属性设置 tylink/${deviceId}/thing/property/set_response
【10】MQTT调试助手上云测试
调试助手下载地址:https://www.softblade.de/download/


帮助文档:https://developer.tuya.com/cn/docs/iot/Protocol-Access?id=Kb3kq5nl2291v

填写MQTT参数:

继续填写MQTT用户名和密码。 这些参数都是上面的【2】章节Python代码输出的数据。

设置TLS/SSL协议版本。

设置完成点击OK。

选择刚才配置的项目进行连接:

连接成功如下:

这个时候登录涂鸦的界面,可以看到设备已经在线了。

【11】MQTT调试助手:订阅主题测试
订阅下面3个主题:
cpp
属性上报 接收属性上报的云端响应 tylink/26bf957e0cb3e96a747owh/thing/property/report_response
属性下发 接收下发的设备属性 tylink/26bf957e0cb3e96a747owh/thing/property/set
NTP 服务 接收时间校正 NTP 的云端响应 tylink/26bf957e0cb3e96a747owh/ext/time/response

依次订阅3个主题:

这时候打开智能生活APP,打开设备,点击控制按钮,就可以收到APP下发的控制消息了。
下面是打开手机APP之后的界面截图:

下面是收到消息的效果截图:

【12】MQTT调试助手上传数据测试
下面Python代码是获取当前的时间戳: 方便测试。
cpp
import time
# 获取当前时间戳(秒级,浮点数)
timestamp_sec = time.time()
# 秒级时间戳(整数,10位)
sec_int = int(timestamp_sec)
# 毫秒级时间戳(整数,13位)
ms_int = int(timestamp_sec * 1000)
print(f"秒级时间戳(10位):{sec_int}")
print(f"毫秒级时间戳(13位):{ms_int}")
上报主题 (Topic)
属性上报的主题格式如下:
tylink/${deviceId}/thing/property/report
将 ${deviceId} 替换为实际设备ID。
当前设备上报主题为:
tylink/26bf957e0cb3e96a747owh/thing/property/report
消息负载 (Payload)
消息负载是一个JSON对象,其基本结构如下:
{
"msgId": "45lkj3551234", // 消息ID,必填,不超过32位字符,用于请求与响应的关联
"time": 1626197189638, // 消息时间戳,必填,Unix时间戳,秒(10位)或毫秒(13位)
"data": { // 上报的属性集合,必填
"标识符": { // 属性标识符,如 battery_percentage
"value": 数值, // 属性值
"time": 1626197189638 // 属性变更时间戳,必填
}
}
}
1. 上报单个属性 (以电池电量为例)
{
"msgId": "report001",
"time": 1721721475000,
"data": {
"battery_percentage": {
"value": 85,
"time": 1721721475000
}
}
}
2. 同时上报多个属性
{
"msgId": "report002",
"time": 1721721475000,
"data": {
"SHT30_T": {
"value": 25.5,
"time": 1721721475000
},
"SHT30_H": {
"value": 60.0,
"time": 1721721475000
},
"PM25": {
"value": 35,
"time": 1721721475000
}
}
}
3. 上报所有属性示例
{
"msgId": "report003",
"time": 1721721475000,
"data": {
"battery_percentage": { "value": 85, "time": 1721721475000 },
"device_status": { "value": "online", "time": 1721721475000 },
"SHT30_T": { "value": 25.5, "time": 1721721475000 },
"SHT30_H": { "value": 60.0, "time": 1721721475000 },
"SGP30": { "value": 450, "time": 1721721475000 },
"PM25": { "value": 35, "time": 1721721475000 },
"MS1100VOC": { "value": 120, "time": 1721721475000 },
"Alarm": { "value": false, "time": 1721721475000 },
"mode": { "value": true, "time": 1721721475000 },
"motor_sw": { "value": false, "time": 1721721475000 }
}
}

【13】设备日志
设备日志查看:

填入设备是ID点击查询,可以看到设备的通讯记录。

四、STM32代码设计
4.1 硬件连线说明
cpp
【1】 ESP8266-WIFI模块接线
PA2-->RXD 模块接收脚
PA3-->TXD 模块发送脚
GND---GND 地
VCC--- +3.3V
【2】0.96寸IIC 接口的OLED显示屏:
VCC----------3.3V
GND----------GND
SCL-------PB0
SDA-------PB1
【3】温湿度传感器: SHT30
VCC---3.3V
GND---GND
SDA---PA6
SCL---PA7
【4】蜂鸣器
GND----GND
VCC---3.3V
OUT---PA15
【5】PM2.5传感器-粉尘检测模块
GND----GND
VCC---5V
PM2.5_TX--->PB11
【6】MS1100VOC 甲醛检测传感器
AO---PA1
GND---GND 地
VCC---VCC 电源(5.0V)
【7】SGP30 二氧化碳检测
VCC---5V
GND---GND
SDA---PB6
SCL---PB7
【10】LED灯接线
程序运行指示灯----->PC13
上传指示灯----->PC14
报警指示灯----->PC15
【11】板载按键接线
K1----->PB12 翻页
K2----->PB13 模式切换
4.2 硬件原理图

4.3 硬件组装过程
【项目复刻_PCB焊接过程演示】 https://www.bilibili.com/video/BV1FmPVzYEVx/?share_source=copy_web\&vd_source=347136f3e32fe297fc17177194ce0a8b
4.4 硬件实物图



4.5 KEIL工程截图

4.6 程序下载
下载程序采用stlink进行下载。
【STM32采用ST-LINK下载程序的过程】 https://www.bilibili.com/video/BV1ehCvBcEX2/?share_source=copy_web\&vd_source=347136f3e32fe297fc17177194ce0a8b
4.7 程序正常运行效果
设备运行过程中会通过串口打印调试信息,我们可以通过串口打印了解程序是否正常。
程序下载之后,可以打开串口调试助手查看程序运行的状态信息。软件就在资料包里的软件工具目录下

4.8 取模软件的使用
显示屏上会显示中文,字母,数字等数据,可以使用下面的取模软件进行取模设置。
软件就在资料包里的软件工具目录下

打开软件之后:

4.9 main.c代码
c
/*****************************************************************************
* 文件名:main.c
* 功能描述:基于STM32F103C8T6的室内环境监测系统主程序
* (接入涂鸦物联网云平台)
* 硬件平台:STM32F103C8T6
* 开发环境:Keil MDK5
* 编写方式:寄存器操作
*****************************************************************************/
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "iic.h"
#include "oled.h"
#include "sht30.h"
#include "sgp30.h"
#include "ms1100.h"
#include "pm25.h"
#include "esp8266.h"
#include "buzzer.h"
#include <string.h>
#include <stdio.h>
/*============================ 报警阈值宏定义 ============================*/
#define TEMP_HIGH_THRESHOLD 30.0f // 温度上限 30℃
#define TEMP_LOW_THRESHOLD 5.0f // 温度下限 5℃
#define HUMI_HIGH_THRESHOLD 80.0f // 湿度上限 80%
#define HUMI_LOW_THRESHOLD 20.0f // 湿度下限 20%
#define PM25_HIGH_THRESHOLD 75.0f // PM2.5上限 75ug/m³
#define CO2_HIGH_THRESHOLD 1000.0f // CO2上限 1000ppm
#define HCHO_HIGH_THRESHOLD 0.08f // 甲醛上限 0.08mg/m³
/*============================ 全局变量定义 ============================*/
float temperature = 0.0f; // 温度值
float humidity = 0.0f; // 湿度值
float pm25 = 0.0f; // PM2.5浓度
float co2 = 0.0f; // CO2浓度
float hcho = 0.0f; // 甲醛浓度
uint8_t alarm_status = 0; // 报警状态位(bit0:温度报警 bit1:湿度报警 bit2:PM2.5报警 bit3:CO2报警 bit4:甲醛报警)
uint8_t data_ready = 0; // 数据采集完成标志
char json_buf[256]; // JSON数据缓存区(用于上传涂鸦云)
/*============================ 函数声明 ============================*/
void System_Init(void);
void Sensor_Data_Collect(void);
void Alarm_Check(void);
void Data_Upload_To_Cloud(void);
void OLED_Display_Update(void);
/*============================ 主函数 ============================*/
int main(void)
{
uint32_t last_collect_time = 0;
uint32_t last_upload_time = 0;
uint32_t last_display_time = 0;
// 系统初始化
System_Init();
// 显示开机界面
OLED_ShowString(0, 0, "Env Monitor", 16);
OLED_ShowString(0, 2, "Initializing...", 12);
delay_ms(1000);
OLED_Clear();
// ESP8266初始化(连接WiFi和涂鸦MQTT)
ESP8266_Init();
ESP8266_Connect_WiFi("Your_SSID", "Your_Password"); // 替换为实际WiFi账号密码
delay_ms(1000);
ESP8266_Connect_MQTT();
delay_ms(500);
OLED_ShowString(0, 0, "WiFi Connected", 12);
OLED_ShowString(0, 2, "MQTT Connected", 12);
delay_ms(1000);
OLED_Clear();
while(1)
{
// 每2秒采集一次传感器数据
if((millis() - last_collect_time) >= 2000)
{
last_collect_time = millis();
Sensor_Data_Collect();
Alarm_Check();
data_ready = 1;
}
// 每2秒更新一次OLED显示(与采集同步)
if((millis() - last_display_time) >= 2000 && data_ready)
{
last_display_time = millis();
OLED_Display_Update();
}
// 每5秒上传一次数据到涂鸦云平台
if((millis() - last_upload_time) >= 5000 && data_ready)
{
last_upload_time = millis();
Data_Upload_To_Cloud();
}
// 处理ESP8266接收到的MQTT消息(保持心跳)
ESP8266_Process_Message();
}
}
/*============================ 系统初始化函数 ============================*/
void System_Init(void)
{
// 系统时钟初始化(使用外部晶振,72MHz)
RCC->CR |= RCC_CR_HSEON; // 开启HSE
while(!(RCC->CR & RCC_CR_HSERDY)); // 等待HSE稳定
RCC->CFGR = RCC_CFGR_PLLMULL9; // PLL倍频系数9 (8MHz*9=72MHz)
RCC->CFGR |= RCC_CFGR_PLLSRC; // HSE作为PLL输入
RCC->CR |= RCC_CR_PLLON; // 开启PLL
while(!(RCC->CR & RCC_CR_PLLRDY)); // 等待PLL稳定
RCC->CFGR &= ~RCC_CFGR_SW; // 清空SW位
RCC->CFGR |= RCC_CFGR_SW_PLL; // PLL作为系统时钟
while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL); // 等待切换完成
// 外设时钟使能
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // GPIOA时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // GPIOB时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // GPIOC时钟
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; // 复用功能时钟
// 延时初始化
delay_init();
// 串口初始化(调试用)
USART1_Init(115200);
// IIC总线初始化(用于SHT30、SGP30、OLED)
IIC_Init();
// OLED显示屏初始化
OLED_Init();
OLED_Clear();
OLED_ShowString(0, 0, "System Start", 16);
// 传感器初始化
SHT30_Init(); // SHT30温湿度传感器
SGP30_Init(); // SGP30二氧化碳传感器
MS1100_Init(); // MS1100甲醛传感器
PM25_Init(); // 夏普PM2.5传感器
// 蜂鸣器初始化(GPIOB_Pin12)
BUZZER_Init();
BUZZER_Off();
// 串口2初始化(用于ESP8266通信)
USART2_Init(115200);
// 显示初始化完成
OLED_Clear();
OLED_ShowString(0, 0, "Init OK!", 16);
delay_ms(500);
OLED_Clear();
}
/*============================ 传感器数据采集函数 ============================*/
void Sensor_Data_Collect(void)
{
// 采集温湿度(SHT30)
SHT30_Read_Temp_Humi(&temperature, &humidity);
// 采集CO2浓度(SGP30)
SGP30_Read_CO2(&co2);
// 采集甲醛浓度(MS1100)
MS1100_Read_HCHO(&hcho);
// 采集PM2.5浓度(夏普传感器)
PM25_Read(&pm25);
// 调试输出
printf("Temp:%.1fC Humi:%.1f%% PM25:%.1f CO2:%.1f HCHO:%.3f\r\n",
temperature, humidity, pm25, co2, hcho);
}
/*============================ 报警检测函数 ============================*/
void Alarm_Check(void)
{
alarm_status = 0; // 清空报警状态
// 温度报警检测
if(temperature > TEMP_HIGH_THRESHOLD || temperature < TEMP_LOW_THRESHOLD)
{
alarm_status |= 0x01;
}
// 湿度报警检测
if(humidity > HUMI_HIGH_THRESHOLD || humidity < HUMI_LOW_THRESHOLD)
{
alarm_status |= 0x02;
}
// PM2.5报警检测
if(pm25 > PM25_HIGH_THRESHOLD)
{
alarm_status |= 0x04;
}
// CO2报警检测
if(co2 > CO2_HIGH_THRESHOLD)
{
alarm_status |= 0x08;
}
// 甲醛报警检测
if(hcho > HCHO_HIGH_THRESHOLD)
{
alarm_status |= 0x10;
}
// 控制蜂鸣器
if(alarm_status != 0)
{
BUZZER_On(); // 有报警,蜂鸣器响
}
else
{
BUZZER_Off(); // 无报警,蜂鸣器关闭
}
}
/*============================ OLED显示更新函数 ============================*/
void OLED_Display_Update(void)
{
char display_buf[20];
// 清屏
OLED_Clear();
// 第0行:显示温度
sprintf(display_buf, "Temp:%.1fC", temperature);
OLED_ShowString(0, 0, display_buf, 12);
// 第1行:显示湿度
sprintf(display_buf, "Humi:%.1f%%", humidity);
OLED_ShowString(0, 1, display_buf, 12);
// 第2行:显示PM2.5
sprintf(display_buf, "PM2.5:%.1f", pm25);
OLED_ShowString(0, 2, display_buf, 12);
// 第3行:显示CO2
sprintf(display_buf, "CO2:%.1f", co2);
OLED_ShowString(0, 3, display_buf, 12);
// 第4行:显示甲醛
sprintf(display_buf, "HCHO:%.3f", hcho);
OLED_ShowString(0, 4, display_buf, 12);
// 第5行:显示报警状态
if(alarm_status != 0)
{
OLED_ShowString(0, 5, "ALARM!", 12);
}
else
{
OLED_ShowString(0, 5, "Normal", 12);
}
}
/*============================ 数据上传云平台函数 ============================*/
void Data_Upload_To_Cloud(void)
{
// 构造JSON数据(涂鸦云MQTT标准格式)
sprintf(json_buf,
"{\"temperature\":%.1f,\"humidity\":%.1f,\"pm25\":%.1f,\"co2\":%.1f,\"hcho\":%.3f,\"alarm\":%d}",
temperature, humidity, pm25, co2, hcho, alarm_status);
// 通过ESP8266发送MQTT消息
ESP8266_MQTT_Publish("device/data", json_buf);
}
/*============================ 调试输出重定向 ============================*/
int fputc(int ch, FILE *f)
{
USART1_SendByte(ch);
return ch;
}
五、总结
本项目围绕室内环境监测的实际需求,设计并实现了一套基于STM32F103C8T6主控芯片的多参数空气质量监测系统。系统集成了SHT30温湿度传感器、夏普PM2.5粉尘传感器、SGP30二氧化碳传感器以及MS1100VOC甲醛传感器,能够全面感知室内环境中关键空气质量指标的变化。通过IIC、串口、ADC等多种硬件接口的配合使用,充分发挥了STM32F103C8T6的外设资源,实现了多传感器数据的高效采集与融合处理。
在本地交互方面,系统配备0.96寸OLED显示屏,能够实时呈现所有环境数据,方便用户在不依赖手机的情况下直观了解当前空气质量状况。同时,系统设置了基于蜂鸣器的超标报警机制,当任一检测参数超出正常阈值范围时,能够及时发出声光提示,确保用户在第一时间获知环境异常并采取相应措施。
在物联网接入方面,系统通过ESP8266模组以STA模式连接Wi-Fi热点,采用MQTT协议将设备端采集的所有环境数据实时上传至涂鸦物联网云平台。依托涂鸦智能生活APP的免代码面板设计工具,用户可以在手机端远程查看设备数据、接收报警弹窗提示,实现了真正意义上的远程监控与智能管理。整个"端-云-移动端"数据链路畅通,体现了物联网技术在环境监测领域的有效落地。
在开发实现上,项目采用Keil5作为开发工具,以C语言和寄存器操作方式完成STM32底层硬件驱动与应用程序编写,充分锻炼了对嵌入式底层开发的理解与实践能力。通过对多种通信协议(IIC、串口、ADC、MQTT等)的综合运用,进一步加深了对嵌入式系统软硬件协同设计的认识。