06 - MQ 气体传感器应用
本章节介绍 Pico-G1 扩展板上的 MQ2 气体传感器应用示例 —— mq_sensor。该应用演示了如何读取 MQ2 传感器的数字输出(DO)和模拟输出(AO),在 TFT 屏幕上显示气体浓度和报警状态。这是学习气体传感器监测的实用示例。
应用源码位于 SDK 目录 source/app/06_MQ_Sensor/,提供了完整的 GPIO 和 ADC 读取实现。
1 应用概述
1.1 功能特性
- 双模式读取:同时读取数字输出(DO)和模拟输出(AO)
- 浓度显示:在 TFT 屏幕上显示气体浓度百分比
- 报警监测:实时显示气体泄漏报警状态
- ADC 直接读取:通过
/dev/mem直接访问 LSADC 寄存器
1.2 技术参数
| 参数 | 值 |
|---|---|
传感器类型 | MQ2(烟雾/可燃气体/液化气) |
DO 接口 | GPIO0_1(数字输出) |
AO 接口 | GPIO1_0/LSADC_CH0(模拟输出) |
供电电压 | 5V(加热器需要) |
ADC 分辨率 | 12-bit(0~4095) |
刷新频率 | 200ms(可配置) |
1.3 硬件连接说明
| 信号 | 板上 GPIO | 物理 pad | 说明 |
|---|---|---|---|
| DO | GPIO0_1 | iocfg_reg1 @ 0x112C0004 | 数字输出(报警阈值) |
| AO | GPIO1_0 | iocfg_reg20 @ 0x12090000 | 模拟输出(浓度值) |
| VCC | 5V | — | 供电(加热器需要5V) |
| GND | GND | — | 地线 |
2 编译与部署
2.1 编译应用
export PATH=$PATH:<SDK>/tools/linux/toolchains/arm-gcc12.2.0-linux-uclibceabi/bin
cd <SDK>/source/app/06_MQ_Sensor
make2.2 运行应用
scp mq_sensor root@<板端IP>:/usr/bin/
ssh root@<板端IP> '/usr/bin/mq_sensor'3 预期输出
3.1 控制台输出
/mnt # ./gas_sensor
[mq2] pad 复用:LSADC_CH0 pad (GPIO1_0) -> func4
[mq2] pad 0x12090000 -> 0x00001004
[mq2] 初始化 SPI 屏(/dev/spidev2.0)...
[spi] pad 0x100C0028 -> 0x00001004
[spi] pad 0x100C002C -> 0x00001004
[spi] pad 0x100C0030 -> 0x00001000
[spi] pad 0x100C0020 -> 0x00001005
[spi] pad 0x100C001C -> 0x00001005
[spi] opening /dev/spidev2.0 ...
[spi] spidev opened, fd=3
[spi] spidev mode/bits/speed set (MODE3/8b/24MHz)
[spi] chardev request DC @ /dev/gpiochip4 line 5 ...
[spi] chardev request RES @ /dev/gpiochip4 line 4 ...
[spi] chardev request CS @ /dev/gpiochip5 line 1 ...
[spi] chardev-verify: DC=0(expect0) RES=1(expect1) CS=1(expect1) ==> OK(chardev 真驱动了引脚)
[spi] spi_hal_init done
[tft] init: SLPOUT
[tft] init: SLPOUT +120ms ok
[tft] init: config cmds ok
[tft] init: DISPON
[tft] init: DISPON ok
[tft] init: clear-flush start
[tft] flush #1 start
[tft] flush #1 done
[tft] init: clear-flush done
[mq2] 初始化 MQ2(DO=GPIO0_1, AO=GPIO1_0/LSADC_CH0)...
[mq2] LSADC 寄存器已 mmap @ 0x120A0000 (CH0 走 /dev/mem 绕过驱动)
[mq2] @ DO=GPIO0_1(/dev/gpiochip0 line1) + AO=GPIO1_0/LSADC_CH0(/dev/mem 直读)
[mq2] 采集中,每 200ms 刷新,Ctrl+C 退出。
[mq2] DO=0 AO=2909 (71%)3.2 TFT 屏幕显示

4 常见问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 始终显示 ALARM | 阈值电位器设置过低 | 调节模块上的电位器 |
| 浓度值异常 | AO 读取失败 | 检查 LSADC CH0 配置 |
| 传感器不响应 | 供电不足 | 确认 5V 供电 |
