MQ系列适用(STM32F103+CubeMX+ADC读取)
下方有完整代码,谁不给谁耍流氓
前情摘要:
MQ7,MQ4,MQ135,MQ2,是我手上有的传感器,他们的硬件电路几乎是相同的,一模一样,而AO相应的功能也都用的LM393这款芯片.所以这里我做一下汇总,对于做毕设或者其他爱好者来说,官方给的相应的使用情景是最重要的,在原理介绍里我也会详细介绍相关的场景以及参数,
需要注意的是,我的代码里也没做校准,软件参数适配啥的,毕竟哪有那么多甲烷,丙烷,室温也控制不好,环境含氧量啥的,所以这个校准我觉得非专业来说挺棘手,我手上有的这些,插上去值初始化也不一样,所以这里大家注意


目录
水:快速实现
硬件环境(接线图)
STM32F103C8T6 + MQ2,其他MQ系列传感器类似

Keil uVision5 +STM32CubeMX(Version 6.8.1)
代码
分别建立相关的.c.h,复制粘贴可用
代码都是基于Cubemx和豆包AI,0基础不会复制的直接看下方视频即可
代码1:adc.c
(CBUE生成)
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file adc.c
* @brief This file provides code for the configuration
* of the ADC instances.
******************************************************************************
* @attention
*
* Copyright (c) 2026 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "adc.h"
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
ADC_HandleTypeDef hadc1;
/* ADC1 init function */
void MX_ADC1_Init(void)
{
/* USER CODE BEGIN ADC1_Init 0 */
/* USER CODE END ADC1_Init 0 */
ADC_ChannelConfTypeDef sConfig = {0};
/* USER CODE BEGIN ADC1_Init 1 */
/* USER CODE END ADC1_Init 1 */
/** Common config
*/
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_8;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN ADC1_Init 2 */
/* USER CODE END ADC1_Init 2 */
}
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(adcHandle->Instance==ADC1)
{
/* USER CODE BEGIN ADC1_MspInit 0 */
/* USER CODE END ADC1_MspInit 0 */
/* ADC1 clock enable */
__HAL_RCC_ADC1_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/**ADC1 GPIO Configuration
PB0 ------> ADC1_IN8
*/
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* USER CODE BEGIN ADC1_MspInit 1 */
/* USER CODE END ADC1_MspInit 1 */
}
}
void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
{
if(adcHandle->Instance==ADC1)
{
/* USER CODE BEGIN ADC1_MspDeInit 0 */
/* USER CODE END ADC1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_ADC1_CLK_DISABLE();
/**ADC1 GPIO Configuration
PB0 ------> ADC1_IN8
*/
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0);
/* USER CODE BEGIN ADC1_MspDeInit 1 */
/* USER CODE END ADC1_MspDeInit 1 */
}
}
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
代码2:MQ2.c
需求明确,AI生成的,视频里呈现过
#include "MQ2.h"
/**
* @brief 初始化MQ2传感器
* @note 复用CubeMX生成的ADC初始化,封装统一接口
* @param 无
* @retval 无
*/
void MQ2_Init(void)
{
// ADC已在MX_ADC1_Init()中初始化,此处可添加额外配置(如校准)
HAL_ADCEx_Calibration_Start(MQ2_ADC_HANDLE); // ADC校准(可选,提升精度)
}
/**
* @brief 读取MQ2传感器的ADC原始值
* @note 单次读取,包含完整的ADC启动、转换、停止流程
* @param 无
* @retval uint16_t: ADC原始数值(0-4095)
*/
uint16_t MQ2_Read_ADC_Value(void)
{
uint16_t adc_value = 0;
ADC_ChannelConfTypeDef sConfig = {0};
// 配置ADC通道(防止通道被修改,重新配置确保正确性)
sConfig.Channel = MQ2_ADC_CHANNEL;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
if (HAL_ADC_ConfigChannel(MQ2_ADC_HANDLE, &sConfig) != HAL_OK)
{
Error_Handler(); // 通道配置失败,触发错误处理
}
// 启动ADC转换并等待完成
HAL_ADC_Start(MQ2_ADC_HANDLE);
if (HAL_ADC_PollForConversion(MQ2_ADC_HANDLE, 100) == HAL_OK) // 超时100ms
{
adc_value = HAL_ADC_GetValue(MQ2_ADC_HANDLE); // 读取ADC值
}
HAL_ADC_Stop(MQ2_ADC_HANDLE); // 停止ADC
return adc_value;
}
/**
* @brief 读取MQ2传感器的电压值(单位:mV)
* @note 计算公式:电压 = ADC值 * 3300 / 4095(3.3V对应4095)
* @param 无
* @retval uint16_t: 电压值(0-3300mV)
*/
uint16_t MQ2_Read_Voltage(void)
{
uint16_t adc_val = MQ2_Read_ADC_Value();
uint32_t voltage = (uint32_t)adc_val * 3300 / 4095; // 转换为mV
return (uint16_t)voltage;
}
/**
* @brief 多次读取MQ2 ADC值并求平均值
* @note 次数建议取奇数(如3、5、7),减少随机波动影响
* @param times: 读取次数(建议1-10次)
* @retval uint16_t: 平均ADC值
*/
uint16_t MQ2_Read_Average_ADC(uint8_t times)
{
uint32_t sum = 0;
uint8_t i;
if (times == 0) times = 1; // 防止次数为0
for (i = 0; i < times; i++)
{
sum += MQ2_Read_ADC_Value();
HAL_Delay(1); // 短暂延时,避免连续读取
}
return (uint16_t)(sum / times);
}
代码3:MQ2.h
需求明确,AI生成
#ifndef __MQ2_H
#define __MQ2_H
#include "stm32f1xx_hal.h"
#include "adc.h"
/* 宏定义:MQ2对应的ADC通道和句柄(与CubeMX配置一致) */
#define MQ2_ADC_HANDLE &hadc1
#define MQ2_ADC_CHANNEL ADC_CHANNEL_8
/* 函数声明 */
/**
* @brief 初始化MQ2传感器(实际为ADC初始化,此处封装统一接口)
* @param 无
* @retval 无
*/
void MQ2_Init(void);
/**
* @brief 读取MQ2传感器的ADC原始值
* @param 无
* @retval uint16_t: ADC原始数值(0-4095,对应0-3.3V)
*/
uint16_t MQ2_Read_ADC_Value(void);
/**
* @brief 读取MQ2传感器的电压值(单位:mV)
* @param 无
* @retval uint16_t: 电压值(0-3300mV)
*/
uint16_t MQ2_Read_Voltage(void);
/**
* @brief 多次读取MQ2 ADC值并求平均值(减少波动)
* @param times: 读取次数
* @retval uint16_t: 平均ADC值
*/
uint16_t MQ2_Read_Average_ADC(uint8_t times);
#endif /* __MQ2_H */
代码4:main.c
为了方便想快速复制粘贴的同志看,这里进行了一定删减
提速的小伙伴只需关心定义的变量和while里的内容即可
#include "main.h"
#include "adc.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "MQ2.h" // 引入MQ2头文件
#include "SEGGER_RTT.h"
uint16_t mq2_adc_val, mq2_voltage, mq2_avg_adc;
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
/* USER CODE BEGIN 2 */
MQ2_Init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
mq2_adc_val = MQ2_Read_ADC_Value(); // 单次ADC值
mq2_voltage = MQ2_Read_Voltage(); // 电压值(mV)
mq2_avg_adc = MQ2_Read_Average_ADC(5); // 5次平均ADC值
// 此处可添加串口打印(如需要),示例:
SEGGER_RTT_printf(0,"MQ2 ADC: %d, Voltage: %d mV, Avg ADC: %d\r\n", mq2_adc_val, mq2_voltage, mq2_avg_adc);
HAL_Delay(500); // 500ms读取一次
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/**
现象:
这里代码我未进行校准以及偏移,仅仅用SEGGER来进行打印而已

水水:介绍+原理
MQ2传感器模块
模块介绍(参数+原理):
MQ 系列气体传感器均为半导体型气敏传感器,核心以二氧化锡(SnO₂) 为基础气敏材料(MQ131 为复合金属氧化物),依托气敏材料与目标气体接触后电导率 / 电阻值发生规律性变化的原理实现气体检测;器件内置镍铬合金加热器,通过加热为气敏材料提供最佳工作温度,部分型号采用高低温循环加热方式提升检测选择性,传感器电阻变化可通过串联负载电阻转换为电压信号输出,实现气体浓度的间接检测。全系列器件均为 6 针状管脚封装,含 4 个信号管脚、2 个加热管脚,以下按型号依次梳理核心参数与应用场景。
MQ-2
- 核心参数:加热电压 5.0V±0.2V,加热功耗≤900mW,使用温度 - 10℃~50℃,预热≥24h;1000ppm 异丁烷下敏感体电阻 3KΩ~30KΩ,浓度斜率≤0.6,检测范围覆盖多种可燃气体及烟雾。
- 应用场景:家庭 / 工厂气体泄漏监测,可探测液化气、丁烷、丙烷、甲烷、酒精、氢气、烟雾等。
MQ-3
- 核心参数:加热电压 5.0V±0.2V,加热功耗≤900mW,使用温度 - 10℃~50℃,预热≥24h;200ppm 乙醇下敏感体电阻 1MΩ~8MΩ,浓度斜率≤0.6,对乙醇具备高选择性。
- 应用场景:机动车酒驾现场检测、严禁酒后作业场所的乙醇蒸汽检测,及各类环境乙醇蒸汽监测。
MQ-4
- 核心参数:加热电压 5.0V±0.2V,加热功耗≤900mW,使用温度 - 10℃~50℃,预热≥24h;5000ppm 甲烷下敏感体电阻 10KΩ~60KΩ,浓度斜率≤0.6,对乙醇、烟雾灵敏度极低。
- 应用场景:家庭 / 工业甲烷、天然气泄漏探测装置。
MQ-5
- 核心参数:加热电压 5.0V±0.2V,加热功耗≤900mW,使用温度 - 10℃~50℃,预热≥24h;1000ppm 甲烷下敏感体电阻 10KΩ~60KΩ,浓度斜率≤0.6,抗乙醇、烟雾干扰能力优异。
- 应用场景:家庭 / 工业液化气、天然气、城市煤气的监测装置。
MQ-6
- 核心参数:加热电压 5.0V±0.2V,加热功耗≤900mW,使用温度 - 10℃~50℃,预热≥24h;1000ppm LPG 下敏感体电阻 10KΩ~60KΩ,浓度斜率≤0.6,几乎不响应乙醇、烟雾。
- 应用场景:家庭 / 工业液化气(LPG)、丁烷、丙烷、液化天然气(LNG)检测装置。
MQ-7
- 核心参数:采用高低温循环加热,高温 5.0V±0.2V、低温 1.5V±0.1V,加热功耗约 350mW,使用温度 - 10℃~50℃,预热≥48h;100ppm CO 下敏感体电阻 2KΩ~20KΩ,浓度斜率≤0.6。
- 应用场景:家庭 / 工业一氧化碳泄漏报警器、便携式一氧化碳气体检测器。
MQ-8
- 核心参数:加热电压 5.0V±0.2V,加热功耗≤900mW,使用温度 - 10℃~50℃,预热≥24h;1000ppm 氢气下敏感体电阻 10KΩ~60KΩ,浓度斜率≤0.6,抗乙醇、LPG、油烟、CO 干扰。
- 应用场景:家庭 / 工业氢气泄漏监测装置,适用于氢气易泄漏的工业场景及民用环境。
MQ-9
- 核心参数:高低温循环加热,高温 5.0V±0.2V、低温 1.5V±0.1V,加热功耗约 350mW,使用温度 - 10℃~50℃,预热≥48h;100ppm CO 下敏感体电阻 2KΩ~20KΩ,浓度斜率≤0.5,对 CO、甲烷、LPG 选择性优异。
- 应用场景:家庭 / 环境一氧化碳、煤气、液化石油气探测装置,可同时监测多种可燃及有毒气体。
MQ131
- 核心参数:回路 / 加热电压均 5V±0.1V,加热功耗<850mW,加热电阻 35Ω±3Ω,使用温度 - 20℃~50℃,预热≥24h;50ppb 臭氧下敏感体电阻 200KΩ~1000KΩ,探测范围 10ppb~2ppm O₃。
- 应用场景:家庭、大气环境中的臭氧浓度探测。
MQ135
- 核心参数:加热电压 5.0V±0.2V,回路电压≤24V,加热功耗≤900mW,使用温度 - 10℃~50℃,预热≥48h;100ppm 氨气下敏感体电阻 2KΩ~20KΩ,浓度斜率≤0.6。
- 应用场景:家庭 / 工业空气污染报警器、便携式空气污染检测器,可检测氨气、硫化物、苯系蒸汽、烟雾等多种有害气体。
MQ138
- 核心参数:回路 / 加热电压均 5V±0.1V,加热功耗≤900mW,使用温度 - 20℃~50℃,预热≥24h;对醇类、酮类、醛类等有机溶剂响应灵敏,浓度斜率≤0.65。
- 应用场景:家庭 / 环境有害气体探测,主打醇类、酮类、醛类、芳族化合物等有机溶剂的检测。
MQ139
- 核心参数:回路 / 加热电压均 5V±0.1V,加热功耗<850mW,加热电阻 33Ω±10%,使用温度 - 20℃~50℃,预热≥24h;100ppm R134a 下敏感体电阻 30KΩ~200KΩ,探测范围 10ppm~1000ppm 氟利昂。
- 应用场景:家庭 / 环境氟利昂气体探测,可检测 R11、R113、R134A、R409A、R410A 等氟利昂型号。
电路介绍(核心):

水水水:视频教学
适合速成,没有相关参数解释,配套上方流程,
MQ
新人博主,大家的点赞和收藏都是我坚持下去的动力
您的意见和看法也很重要,评论区指出,感激不尽!!!
更多推荐

所有评论(0)