基于STM32和MQ-5传感器实现天然气浓度检测并通过串口显示

一、硬件

1. 电路连接原理图

STM32F103C8T6       MQ-5传感器       USB-TTL模块
-------------------------------
3.3V          →  VCC
GND           →  GND
PA0 (ADC_IN0) →  AOUT
PA9 (USART1_TX) →  RX
PA10 (USART1_RX)→  TX

2. 关键参数配置

参数 值/配置说明
ADC分辨率 12位(0-4095)
采样率 100Hz
串口波特率 115200bps
负载电阻(RL) 2.0kΩ(通过电位器调节)
预热时间 ≥20秒

二、软件

1. ADC配置(HAL库)

// 初始化ADC
void MX_ADC1_Init(void) {
    ADC_HandleTypeDef hadc1;
    
    __HAL_RCC_ADC1_CLK_ENABLE();
    
    hadc1.Instance = ADC1;
    hadc1.Init.ScanConvMode = 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;
    
    ADC_ChannelConfTypeDef sConfig = {0};
    sConfig.Channel = ADC_CHANNEL_0;
    sConfig.Rank = 1;
    sConfig.SMP = ADC_SAMPLETIME_239CYCLES_5;
    
    HAL_ADC_Init(&hadc1);
    HAL_ADC_ConfigChannelAttenuation(&hadc1, ADC_CHANNEL_0, ADC_ATTENUATION_11DB);
}

// 读取ADC值
uint16_t Read_ADC(void) {
    HAL_ADC_Start(&hadc1);
    while(HAL_ADC_PollForConversion(&hadc1, 100) != HAL_OK);
    return HAL_ADC_GetValue(&hadc1);
}

2. 串口通信配置

// 串口初始化
void MX_USART1_UART_Init(void) {
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 115200;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX;
    HAL_UART_Init(&huart1);
}

// 发送数据函数
void Send_Data(uint16_t adc_val) {
    char buffer[32];
    float voltage = adc_val * 3.3f / 4095.0f;
    float concentration = 10.0f * pow(voltage / 0.4f, 3.0f); // 校准公式
    
    sprintf(buffer, "Gas: %.2f ppm\r\n", concentration);
    HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), 100);
}

3. 主程序框架

int main(void) {
    HAL_Init();
    MX_ADC1_Init();
    MX_USART1_UART_Init();
    
    while(1) {
        uint16_t adc_val = Read_ADC();
        Send_Data(adc_val);
        HAL_Delay(1000); // 每秒采集一次
    }
}

三、关键校准公式

MQ-5浓度计算公式(需根据实际传感器校准):

浓度(ppm)=10×(0.4Vout)3
  • V_out:传感器输出电压(0-3.3V)
  • 0.4V:清洁空气中的基准电压

四、串口助手显示示例

Gas: 25.67 ppm
Gas: 30.12 ppm
Gas: 185.44 ppm  ← 超过安全阈值

五、扩展功能实现

1. 报警功能

#define ALARM_THRESHOLD 100.0f

void Check_Alarm(float conc) {
    if(conc > ALARM_THRESHOLD) {
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // 点亮LED
        Send_Data(0xFFFF); // 发送报警标志
    } else {
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
    }
}

2. OLED显示(SSD1306)

void Display_OLED(float conc) {
    OLED_Clear();
    OLED_ShowString(0,0,"Gas Concentration:");
    OLED_ShowNum(0,2,conc,1,16); // 显示整数部分
    OLED_ShowString(0,4,"ppm");
}

六、完整工程结构

├── Core/
│   ├── Inc/
│   │   ├── main.h
│   │   ├── adc.h
│   │   └── usart.h
│   └── Src/
│       ├── main.c
│       ├── adc.c
│       └── usart.c
├── Drivers/
│   ├── CMSIS/
│   └── STM32F1xx_HAL_Driver/
└── Middlewares/
    └── USB_Device/

七、参考

  1. MQ-5数据手册(关键参数:Rs-R0曲线、响应时间)
  2. 代码 用stm32和mq-5传感器测量天然气浓度并可以用串口助手显示出来 www.youwenfan.com/contentcnj/71922.html
  3. STM32F103参考手册(ADC配置章节)
  4. 《STM32实战开发指南》第6章(传感器接口设计)
posted @ 2025-10-21 10:31  yu8yu7  阅读(36)  评论(0)    收藏  举报