基于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/
七、参考
- MQ-5数据手册(关键参数:Rs-R0曲线、响应时间)
- 代码 用stm32和mq-5传感器测量天然气浓度并可以用串口助手显示出来 www.youwenfan.com/contentcnj/71922.html
- STM32F103参考手册(ADC配置章节)
- 《STM32实战开发指南》第6章(传感器接口设计)
浙公网安备 33010602011771号