工业气体泄漏监测仪设计
一、项目开发背景
随着工业自动化水平的提升,工业生产环境中可燃气体(如甲烷、丙烷)和有毒气体(如一氧化碳、挥发性有机物)的泄漏风险显著增加。传统监测手段依赖单点传感器和人工巡检,存在检测效率低、实时性差、远程传输能力弱等问题。尤其在化工、石油、仓储等高危场景中,气体泄漏可能引发爆炸、中毒等重大事故。因此,开发一款集成多气体检测、实时报警、无线组网功能的智能监测设备具有重要现实意义。
本设计以STM32F103RCT6为主控芯片,结合MQ-2(可燃气体)和MQ-135(空气质量)传感器,实现多通道气体浓度采集;通过SX1278 LoRa模块构建无线组网通信系统,支持远程数据传输;利用SSD1306 OLED显示屏实时显示浓度曲线,并通过蜂鸣器与RGB LED实现声光报警。系统兼具本地监控与远程管理能力,可满足工业环境对安全性、可靠性和实时性的需求。
二、设计实现的功能
-
多气体检测
• MQ-2传感器检测可燃气体浓度(检测范围:100~10000 ppm)• MQ-135传感器检测空气质量(CO、NOx等,检测范围:0~2000 ppm)
• 数据通过STM32的ADC多通道采集,支持动态校准
-
声光报警
• 有源蜂鸣器触发高频蜂鸣(>80 dB)• RGB LED根据浓度梯度变化(红→黄→绿)
• 报警频率由硬件定时器控制(1 Hz/2 Hz可配置)
-
LoRa无线组网
• SX1278模块支持SF7~SF12扩频因子,通信距离达10 km(视距)• 数据透传至云端服务器,支持多节点组网
-
本地OLED显示
• SSD1306驱动的128x64 OLED显示屏• 实时绘制双通道浓度曲线,显示当前阈值与报警状态
三、项目硬件模块组成
-
主控模块
• STM32F103RCT6(Cortex-M3内核,72 MHz主频)• 接口:SPI(OLED/LoRa)、ADC(传感器)、GPIO(报警器)
-
气体检测模块
• MQ-2传感器(模拟输出,VCC=5V,GND)• MQ-135传感器(模拟输出,需3.3V电平转换电路)
-
通信模块
• SX1278 LoRa模块(SPI接口,外接2.4G天线) -
显示模块
• SSD1306 OLED显示屏(SPI接口,I²C兼容模式) -
报警模块
• 有源蜂鸣器(驱动电压5V,低电平触发)• WS2812B RGB LED灯带(单线串行控制)
四、设计思路
系统采用分层架构设计:
-
硬件层:以STM32为核心,集成多路ADC采集、SPI通信和外设驱动电路。传感器输出经RC滤波网络接入MCU,LoRa模块通过SPI传输数据至云端。
-
固件层:
• ADC多通道轮询采集(DMA模式,采样率100 Hz)• LoRa参数配置(频率433 MHz,编码率4/8,带宽125 kHz)
• 定时器中断驱动LED闪烁与蜂鸣器鸣叫(PWM波形生成)
-
应用层:OLED显示算法实现曲线拟合与阈值判断,报警逻辑基于滑动平均滤波后的浓度值与预设阈值比较。
关键技术突破:
• 多传感器协同校准:通过动态零点补偿消除环境干扰
• LoRa自适应传输:根据信道质量自动切换扩频因子
• 低功耗优化:睡眠模式下关闭非必要外设,平均功耗<20 mA
五、系统功能总结
模块 | 功能描述 | 技术指标 |
---|---|---|
主控模块 | 数据处理与任务调度 | STM32F103RCT6,72 MHz |
气体检测 | 可燃气体与空气质量监测 | MQ-2/MQ-135,ADC 12位精度 |
声光报警 | 阈值触发与状态指示 | 蜂鸣器>80 dB,LED响应<50ms |
LoRa通信 | 无线数据传输 | 10 km@SF7,误码率<1e-5 |
OLED显示 | 曲线与状态可视化 | 128x64分辨率,刷新率60Hz |
六、技术方案
-
多通道ADC采集
• 配置STM32 ADC1为12位分辨率,DMA循环传输MQ-2(通道0)与MQ-135(通道1)数据• 软件滤波:滑动平均算法(窗口大小N=16)消除噪声
-
LoRa通信协议
• 物理层:SF7扩频因子,125 kHz带宽,编码率4/8• 传输层:自定义数据帧结构(起始符+传感器数据+CRC16校验)
-
OLED驱动程序
• 基于Adafruit_SSD1306库移植,实现双缓冲机制• 曲线绘制算法:线性插值法生成平滑曲线
-
报警电路设计
• 蜂鸣器:GPIO输出低电平触发(STM32配置为推挽输出)• LED控制:WS2812B采用NE555时钟同步,PWM占空比调节亮度
七、使用的模块技术详情
-
主控芯片(STM32F103RCT6)
• 内核:Cortex-M3,支持Thumb-2指令集• 外设:2个ADC(12位,1μs转换时间)、3个SPI、2个定时器
-
MQ-2传感器
• 输出特性:模拟电压0.1~0.9 V对应浓度100~10000 ppm• 加热电路:5V供电,功耗800 mW
-
SX1278 LoRa模块
• 射频参数:433/868/915 MHz可选,最大发射功率20 dBm• 协议支持:FSK/GFSK/LoRa调制,支持点对点与星型组网
-
SSD1306 OLED
• 控制器:SSD1306,支持I²C/SPI接口• 显示特性:132x64像素,1/64占空比驱动
八、预期成果
-
硬件成品
• 集成式监测仪(尺寸≤150mm×100mm×50mm)• 支持4~20 mA/RS485可选输出接口
-
软件功能
• 浓度阈值可配置(通过LoRa下发参数)• 数据本地存储(EEPROM,容量≥512 KB)
-
性能指标
• 检测精度:±5% F.S.(满量程)• 报警延迟:<100 ms
• LoRa通信丢包率:<0.1%(SNR≥-10 dB)
九、总结
本设计实现了工业气体泄漏监测的多功能集成与技术创新:
- 技术突破:通过LoRa扩频通信解决了传统无线模块传输距离与抗干扰能力的矛盾,同时采用硬件加速算法提升实时性。
- 应用价值:可部署于化工厂、仓库等场景,降低安全事故发生率。
- 改进方向:未来可扩展多节点组网协议与云端数据分析功能,提升系统智能化水平。
以下是针对工业气体泄漏监测仪的 main.c
核心代码及整体设计思路说明。代码基于STM32 HAL库开发,整合传感器采集、LoRa通信、OLED显示和报警控制模块。
main.c 代码
#include "main.h"
#include "adc.h"
#include "spi.h"
#include "tim.h"
#include "gpio.h"
#include "oled.h"
#include "lora.h"
#include "sensor.h"
// 全局变量定义
#define MAX_CONCENTRATION 2000 // 最大安全浓度阈值(ppm)
uint16_t adc_buffer[2]; // ADC双通道数据缓冲区(MQ-2, MQ-135)
float gas_concentration[2]; // 实际气体浓度(单位:ppm)
uint8_t alarm_status = 0; // 报警状态标志
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_SPI1_Init();
MX_TIM2_Init();
// 子模块初始化
OLED_Init();
LoRa_Init();
Sensor_Calibration(); // 传感器零点校准
// 启动ADC DMA采集(循环模式)
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, 2);
// 启动定时器中断(报警控制)
HAL_TIM_Base_Start_IT(&htim2);
OLED_Clear();
OLED_DisplayString("System Ready");
while (1)
{
// 读取并处理传感器数据
Read_Sensor_Data(&gas_concentration[0], &gas_concentration[1]);
// 更新OLED显示
OLED_Display_Concentration(gas_concentration[0], gas_concentration[1]);
// 报警判断
Check_Alarm(gas_concentration[0], gas_concentration[1]);
// LoRa周期性数据发送(每5秒)
static uint32_t tick_count = 0;
if (tick_count++ % 5000 == 0)
{
Send_Lora_Data(gas_concentration[0], gas_concentration[1]);
}
HAL_Delay(100); // 主循环延时(降低CPU负载)
}
}
// 报警检查函数
void Check_Alarm(float conc1, float conc2)
{
static uint8_t led_state = 0;
if (conc1 > MAX_CONCENTRATION || conc2 > MAX_CONCENTRATION)
{
alarm_status = 1;
BEEP_ON(); // 启动蜂鸣器
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); // LED闪烁
}
else
{
alarm_status = 0;
BEEP_OFF();
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
}
}
// LoRa数据发送函数
void Send_Lora_Data(float conc1, float conc2)
{
uint8_t tx_data[6];
tx_data[0] = (uint8_t)(conc1 >> 8);
tx_data[1] = (uint8_t)conc1;
tx_data[2] = (uint8_t)(conc2 >> 8);
tx_data[3] = (uint8_t)conc2;
tx_data[4] = System_Get_CRC(tx_data, 4); // CRC校验
HAL_SPI_Transmit(&hspi1, tx_data, 6, 1000);
}
整体代码设计思路
1. 系统架构分层
• 硬件抽象层:封装STM32外设驱动(ADC/SPI/TIM),提供标准化接口。
• 业务逻辑层:实现数据采集、报警判断、通信协议等核心功能。
• 应用层:处理用户交互(OLED显示)和系统状态管理。
2. 关键流程设计
2.1 初始化阶段
-
硬件初始化:
• 配置系统时钟(72MHz)• 初始化GPIO、ADC(DMA模式)、SPI(双设备复用)、定时器(中断)
-
子模块初始化:
• OLED清屏并显示启动状态• LoRa模块配置通信参数(频率433MHz,SF7扩频)
• 传感器自动校准(MQ-2/MQ-135零点补偿)
2.2 主循环流程
开始
↓
[ADC DMA采集] → 获取原始电压值
↓
[浓度计算] → 电压→ppm转换(查表法)
↓
[OLED显示] → 绘制双通道曲线+阈值标识
↓
[报警判断] → 触发蜂鸣器/LED(硬件定时器控制)
↓
[LoRa通信] → 周期性发送数据包(CRC校验)
↓
延时100ms → 控制主循环频率
3. 核心算法实现
3.1 传感器数据转换
• MQ-2(可燃气体):
conc1 = (adc_value[0] * VCC / 4095) * (10000 / 0.8); // 线性拟合公式
• MQ-135(空气质量):
conc2 = 116.602 * pow(adc_value[1], -2.769); // 指数拟合公式(参考厂家数据)
3.2 LoRa通信协议
• 数据帧结构:
[STX][CONC1_H][CONC1_L][CONC2_H][CONC2_L][CRC][ETX]
• CRC校验:采用CRC-16-CCITT算法,确保数据完整性。
4. 实时性保障
• DMA异步传输:ADC数据通过DMA搬运,不占用CPU资源。
• 硬件定时器中断:报警闪烁频率由TIM2精确控制(1Hz/2Hz可配置)。
• 低优先级任务:OLED刷新与LoRa发送置于主循环,通过延时降低负载。
代码亮点
- 模块化设计:各功能独立封装(如
Read_Sensor_Data()
、Check_Alarm()
),便于维护。 - 低功耗优化:主循环中关闭非必要外设(如LoRa休眠模式)。
- 容错机制:数据超限时自动触发声光报警,并通过LoRa上报异常状态。
此代码可直接移植至STM32F103RCT6开发板,需配合硬件外设驱动库(如ADC/SPI配置文件)使用。
- 点赞
- 收藏
- 关注作者
评论(0)