核心内容摘要
暗网91
气体传感器模块介绍
2.
使用方法有DO和AO输出接口提供给单片机使用。
电位器可以设置响应阈值。
未达到阈值时DO输出高电平达到阈值输出低电平。
STM32驱动#include stm32h7xx_hal.h // 引脚定义 #define MQ_DO_PIN GPIO_PIN_0 #define MQ_DO_GPIO_PORT GPIOG #define MQ_AO_PIN GPIO_PIN_10 #define MQ_AO_GPIO_PORT GPIOF // 全局句柄 ADC_HandleTypeDef hadc3; EXTI_HandleTypeDef hexti0; // 函数声明 void MQ_Init(void); uint8_t MQ_Get_DO_State(void); uint16_t MQ_Get_AO_Voltage(void); void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); // 初始化传感器 void MQ_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; // 使能时钟 __HAL_RCC_GPIOG_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_ADC3_CLK_ENABLE(); // 初始化DO引脚外部中断模式 GPIO_InitStruct.Pin MQ_DO_PIN; GPIO_InitStruct.Mode GPIO_MODE_IT_FALLING; // 气体浓度超过阈值时DO由高变低触发中断 GPIO_InitStruct.Pull GPIO_PULLUP; HAL_GPIO_Init(MQ_DO_GPIO_PORT, GPIO_InitStruct); // 初始化AO引脚ADC输入模式 GPIO_InitStruct.Pin MQ_AO_PIN; GPIO_InitStruct.Mode GPIO_MODE_ANALOG; GPIO_InitStruct.Pull GPIO_NOPULL; HAL_GPIO_Init(MQ_AO_GPIO_PORT, GPIO_InitStruct); // 初始化ADC3 hadc
Instance ADC3; hadc
Init.ClockPrescaler ADC_CLOCK_SYNC_PCLK_DIV4; hadc
Init.Resolution ADC_RESOLUTION_12B; hadc
Init.ScanConvMode DISABLE; hadc
Init.ContinuousConvMode ENABLE; hadc
Init.DiscontinuousConvMode DISABLE; hadc
Init.ExternalTrigConvEdge ADC_EXTERNALTRIGCONVEDGE_NONE; hadc
Init.ExternalTrigConv ADC_SOFTWARE_START; hadc
Init.DataAlign ADC_DATAALIGN_RIGHT; hadc
Init.NbrOfConversion 1; hadc
Init.DMAContinuousRequests DISABLE; hadc
Init.EOCSelection ADC_EOC_SINGLE_CONV; HAL_ADC_Init(hadc
; // 配置ADC规则通道 ADC_ChannelConfTypeDef sConfig {0}; sConfig.Channel ADC_CHANNEL_8; // PF10对应ADC3_IN8 sConfig.Rank ADC_REGULAR_RANK_1; sConfig.SamplingTime ADC_SAMPLETIME_3CYCLES; HAL_ADC_ConfigChannel(hadc3, sConfig); // 使能中断 HAL_NVIC_EnableIRQ(EXTI0_IRQn); HAL_NVIC_SetPriority(EXTI0_IRQn, 0,
; // 启动ADC HAL_ADC_Start(hadc
; } // 获取DO引脚状态 uint8_t MQ_Get_DO_State(void) { return HAL_GPIO_ReadPin(MQ_DO_GPIO_PORT, MQ_DO_PIN); } // 获取AO引脚电压值12位ADC
对应0-
3V uint16_t MQ_Get_AO_Voltage(void) { HAL_ADC_PollForConversion(hadc3,
; return HAL_ADC_GetValue(hadc
; } // DO引脚中断回调函数 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin MQ_DO_PIN) { // 检测到气体浓度超过阈值 printf(气体浓度超标\r\n); } } // 主函数示例 int main(void) { HAL_Init(); SystemClock_Config(); MQ_Init(); printf(MQ气体传感器驱动启动...\r\n); while(
{ // 每秒读取一次模拟值 uint16_t ao_value MQ_Get_AO_Voltage(); float voltage ao_value *
3f /
4