下方有完整代码,谁不给谁耍流氓

前情摘要:

MQ7,MQ4,MQ135,MQ2,是我手上有的传感器,他们的硬件电路几乎是相同的,一模一样,而AO相应的功能也都用的LM393这款芯片.所以这里我做一下汇总,对于做毕设或者其他爱好者来说,官方给的相应的使用情景是最重要的,在原理介绍里我也会详细介绍相关的场景以及参数,

需要注意的是,我的代码里也没做校准,软件参数适配啥的,毕竟哪有那么多甲烷,丙烷,室温也控制不好,环境含氧量啥的,所以这个校准我觉得非专业来说挺棘手,我手上有的这些,插上去值初始化也不一样,所以这里大家注意

目录

水:快速实现

硬件环境(接线图)

代码

代码1:adc.c

代码2:MQ2.c

代码3:MQ2.h

代码4:main.c

现象:

水水:介绍+原理

模块介绍(参数+原理):

MQ-2

MQ-3

MQ-4

MQ-5

MQ-6

MQ-7

MQ-8

MQ-9

MQ131

MQ135

MQ138

MQ139

电路介绍(核心):

​编辑

水水水:视频教学

水:快速实现

硬件环境(接线图)

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

新人博主,大家的点赞和收藏都是我坚持下去的动力

您的意见和看法也很重要,评论区指出,感激不尽!!!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐