基于STM32单片机的OneNet物联网粉尘烟雾检测系统设计
1 功能介绍
随着工业化和城市化的加速发展,空气质量问题越来越受到人们的重视,尤其是粉尘和烟雾对人体健康和居住环境产生了显著影响。为了实现家庭、工厂、实验室等场所的空气质量智能监测,本设计基于STM32单片机构建了一个粉尘与烟雾检测系统,并接入OneNet物联网云平台,实现远程数据查看与实时控制。
本系统主要实现以下功能:
- 通过STM32单片机实时采集粉尘浓度和烟雾浓度数据,并将检测结果显示和处理;
- 通过WiFi模块将检测到的数据上传至OneNet物联网云平台,用户可通过手机APP或网页实时查看;
- 当烟雾浓度超过预设阈值时,系统会自动驱动舵机模拟窗户开启,以保证空气流通;当烟雾浓度恢复到正常水平时,窗户自动关闭;
- 当粉尘浓度超过设定阈值时,系统通过继电器驱动风扇进行通风,同时蜂鸣器报警,提醒用户采取相应措施;
- 整个系统可以在无人值守的情况下持续运行,适合环境监测与家庭安全防护场景。
通过该系统,用户不仅能够实时掌握周围环境中的粉尘与烟雾情况,还能够借助智能硬件联动措施降低风险,具备较高的实用价值。
2 系统电路设计
系统电路设计以STM32单片机为核心,扩展粉尘传感器、烟雾传感器、舵机、继电器、蜂鸣器及通信模块等外设,构成完整的监测与执行系统。以下分模块详细介绍。
2.1 主控芯片电路(STM32最小系统)
STM32F103C8T6作为系统的主控芯片,具备高速处理能力和丰富的外设接口,适用于多传感器数据采集与外设控制。最小系统电路包括:
- 时钟电路:使用8MHz晶振,保证系统运行稳定;
- 复位电路:上电或手动复位时确保MCU进入初始状态;
- 电源电路:提供稳定的3.3V电源,供MCU及其他低功耗外设使用。
2.2 粉尘浓度检测电路
粉尘浓度检测可选用GP2Y1010AU0F粉尘传感器,该传感器通过红外光散射原理检测空气中的粉尘颗粒浓度。其模拟信号输出接入STM32的ADC通道,经过模数转换后即可得到粉尘浓度值。该模块功耗低,适合连续监测。
2.3 烟雾浓度检测电路
烟雾检测采用MQ-2气体传感器,该传感器对烟雾、可燃气体等敏感,能够输出与浓度成比例的模拟电压信号。信号通过STM32的ADC接口采样,并与设定的阈值比较。该电路在系统中主要负责触发开窗动作。
2.4 舵机控制电路
舵机用于模拟窗户的开合状态,通过PWM波进行驱动。STM32的定时器输出PWM信号,不同的占空比对应不同的转角。烟雾超过阈值时,MCU输出控制信号使舵机旋转到"开窗"位置;恢复正常后舵机回到"关窗"位置。
2.5 风扇控制电路(继电器驱动)
当粉尘浓度过高时,系统通过继电器驱动直流风扇。继电器作为开关器件,能够承受较大电流,从而保证风扇稳定运行。控制信号来自STM32的GPIO口,经三极管放大后驱动继电器线圈,完成开关动作。
2.6 蜂鸣器电路
蜂鸣器作为报警提示装置,与STM32的GPIO口相连。当粉尘浓度超过设定阈值时,系统驱动蜂鸣器发声提醒用户。通过PWM控制可以实现间歇或连续报警。
2.7 OneNet通信电路
本系统选用ESP8266 WiFi模块作为通信媒介,通过UART接口与STM32连接。STM32通过AT指令或透传协议控制ESP8266接入WiFi,并通过MQTT协议将粉尘与烟雾浓度数据上传至OneNet平台,实现云端监测。
2.8 电源电路
整个系统采用5V直流电源输入,经过稳压电路输出3.3V供STM32及传感器使用,5V直接用于继电器和风扇驱动。为保证电源稳定性,设计中加入滤波电容和二极管防反接保护。
3 程序设计
程序设计包括传感器采集、阈值判断、执行机构控制及数据上传至OneNet平台四大部分。系统基于STM32标准外设库开发,采用C语言实现。
3.1 主程序设计
主程序负责调用各模块的初始化与运行逻辑,整体结构包括:系统初始化、传感器采集、阈值判断、执行控制、数据上传。
c
#include "stm32f10x.h"
#include "adc.h"
#include "usart.h"
#include "esp8266.h"
#include "servo.h"
#include "relay.h"
#include "buzzer.h"
#include "delay.h"
float dust_value;
float smoke_value;
float dust_threshold = 200.0;
float smoke_threshold = 300.0;
int main(void)
{
SystemInit();
USART1_Init(115200);
ADC_InitConfig();
ESP8266_Init();
Servo_Init();
Relay_Init();
Buzzer_Init();
while(1)
{
// 采集传感器数据
dust_value = Read_Dust();
smoke_value = Read_Smoke();
// 上传数据至OneNet
ESP8266_SendData(dust_value, smoke_value);
// 烟雾判断
if(smoke_value > smoke_threshold)
{
Servo_Open();
}
else
{
Servo_Close();
}
// 粉尘判断
if(dust_value > dust_threshold)
{
Relay_On(); // 打开风扇
Buzzer_On(); // 蜂鸣器报警
}
else
{
Relay_Off();
Buzzer_Off();
}
Delay_ms(1000); // 每秒采集一次
}
}
3.2 粉尘浓度采集程序
c
float Read_Dust(void)
{
uint16_t adc_val;
float voltage, density;
adc_val = ADC_GetConversionValue(ADC1); // 假设通道接粉尘传感器
voltage = (adc_val / 4096.0) * 3.3; // 转换为电压
density = voltage * 500; // 简化公式:电压与浓度换算
return density;
}
3.3 烟雾浓度采集程序
c
float Read_Smoke(void)
{
uint16_t adc_val;
float voltage, concentration;
adc_val = ADC_GetConversionValue(ADC2); // 假设通道接烟雾传感器
voltage = (adc_val / 4096.0) * 3.3;
concentration = voltage * 600; // 烟雾浓度换算
return concentration;
}
3.4 舵机控制程序
c
void Servo_Open(void)
{
TIM_SetCompare1(TIM3, 200); // 设置PWM占空比对应开窗角度
}
void Servo_Close(void)
{
TIM_SetCompare1(TIM3, 50); // 设置PWM占空比对应关窗角度
}
3.5 继电器与蜂鸣器控制程序
c
void Relay_On(void)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_5);
}
void Relay_Off(void)
{
GPIO_SetBits(GPIOB, GPIO_Pin_5);
}
void Buzzer_On(void)
{
GPIO_SetBits(GPIOB, GPIO_Pin_6);
}
void Buzzer_Off(void)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_6);
}
3.6 ESP8266通信程序
c
void ESP8266_SendData(float dust, float smoke)
{
char buffer[100];
sprintf(buffer,"{\"dust\":%.2f,\"smoke\":%.2f}",dust,smoke);
USART_SendString(USART1, "AT+CIPSEND=0,");
USART_SendString(USART1, buffer);
}
4 总结
本系统基于STM32单片机,结合粉尘传感器、烟雾传感器、继电器、舵机、蜂鸣器及ESP8266 WiFi模块,构建了一个功能完善的空气质量监测与控制平台。系统能够实时检测粉尘和烟雾浓度,并通过OneNet物联网平台实现远程查看,提升了用户对环境状况的感知能力。
在系统运行中,当烟雾超过阈值时,自动开启"窗户"保持空气流通;当粉尘超过阈值时,自动开启风扇并报警,提醒用户注意空气质量。系统具备自动化、实时性与远程监测三大优势,应用场景广泛,如家庭空气净化、实验室安全监控、工厂车间环境监测等。
通过该设计,可以有效提升空气质量管理水平,为人们创造更加安全健康的生活与工作环境。