一、简介
MQ-2传感器是一种常用的半导体气敏传感器,主要用于检测空气中的可燃气体(如液化石油气、丙烷、氢气等)和烟雾。它具有成本低、灵敏度高、响应快的特点,广泛应用于家庭安防、工业监测和物联网设备中。
需要注意的是MQ-2通电后需要预热1-2分钟。
二、程序设计(HAL库)
我使用的是STM32F103C8T6
接线表:
MQ-2的AO | PA1 |
OLED_SCL | PB8 |
OLED_SDA | PB9 |
开启串口3 | PB10/PB11 |
我采用的是ADC1的通道1采集MQ-2的电压,开启了DMA。
(注意开启DMA后就不要开启外设ADC的中断,这样反而采集不到数据)
mq2.c的代码如下:
#include "mq2.h" // 全局变量定义 static uint32_t mq2_adc_buffer[MQ2_ADC_BUFFER_SIZE]; // ADC采样缓冲区 static float mq2_voltage = 0.0f; // 计算后的电压值 /** * @brief MQ2传感器初始化 * @note 启动ADC的DMA传输,开始连续采集数据 */ void MQ2_Init(void) { // 启动ADC DMA连续采样 HAL_ADC_Start_DMA(&MQ2_ADC_HANDLE, mq2_adc_buffer, MQ2_ADC_BUFFER_SIZE); } /** * @brief ADC转换完成回调函数 * @param hadc: ADC句柄 * @note 每次DMA传输完成时自动调用,计算平均电压 */ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) { if (hadc->Instance == MQ2_ADC_HANDLE.Instance) { uint32_t sum = 0; // 计算缓冲区中所有采样值的总和 for (int i = 0; i < MQ2_ADC_BUFFER_SIZE; i++) { sum += mq2_adc_buffer[i]; } // 计算平均电压值(假设为12位ADC) mq2_voltage = (sum / (float)MQ2_ADC_BUFFER_SIZE) * (MQ2_REF_VOLTAGE / 4096.0f); } } /** * @brief 获取处理后的电压值 * @retval 电压值(单位:伏特) */ float MQ2_GetVoltage(void) { return mq2_voltage; } /** * @brief 获取最新的ADC原始采样值 * @retval 最新的ADC原始值 */ uint32_t MQ2_GetRawValue(void) { return mq2_adc_buffer[0]; // 返回缓冲区中第一个值(最新值) }
换算电压我用的这个公式:
mq2.h:
#ifndef __MQ2_H #define __MQ2_H #include "main.h" #include "adc.h" #include "UART3_PRINTF.h" // ADC配置 #define MQ2_ADC_HANDLE hadc1 // 使用的ADC句柄 #define MQ2_ADC_BUFFER_SIZE 10 // ADC采样缓冲区大小 #define MQ2_REF_VOLTAGE 3300 // ADC参考电压(单位:伏特) // 函数声明 void MQ2_Init(void); // 初始化MQ2传感器 float MQ2_GetVoltage(void); // 获取处理后的电压值 uint32_t MQ2_GetRawValue(void); // 获取最新ADC原始值 #endif
main.c中的代码:
在串口助手上可以正常采集到电压: