智能安全辅助驾驶系统 STM32——MQ3酒精传感器的应用(HAL库)

本博客介绍了如何使用STM32(F103RCT6)通过ADC和DMA采集MQ3酒精传感器的模拟信号,并利用外部中断EXTI检测酒精浓度变化。当检测到酒精时,系统会触发中断并点亮LED灯作为警示。项目中,MQ3传感器的AO口连接到STM32的ADC通道,DO口连接到外部中断口PA4。通过转换ADC采集的电压数据,计算酒精浓度,并通过串口输出数据。中断回调函数负责在检测到酒精时点亮LED灯,同时提供了一个按键中断以熄灭LED。硬件连接包括MQ3的AO、DO口与STM32的对应引脚,以及PB9引脚连接LED灯。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

智能安全辅助驾驶系统 STM32——MQ3酒精传感器的应用(HAL库)

准备:
MQ3酒精传感器一个、STM32开发板(本实验采用F103RCT6,其他型号可参考本文同理设置)

一、MQ3酒精传感器的介绍
MQ3酒精传感器主要用于酒精检测,其原理是 使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在酒精蒸汽时,传感器的电导率随空气中酒精气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。

MQ-3气体传感器对酒精的灵敏度高,可以抵抗汽油、烟雾、水蒸气的干扰。这种传感器可检测多种浓度酒精气氛,是一款适合多种应用的低成本传感器。
该模块主要特点如下:

具有信号输出指示。
输出的双通道信号(模拟量输出与 TTL 输出)。
TTL 输出有效信号为低电平。
模拟输出电压为 0~5V, 浓度高则电压高。
对乙醇蒸汽拥有很高的灵敏度和不错的选择性。
它具有较长的使用寿命和可靠的稳定性。
快速的响应恢复特性。
MQ3模块实物图:
在这里插入图片描述
在这里插入图片描述

二、STM32
本文主要利用ADC采集MQ3酒精传感器的AO口的模拟数据,利用的是ADC中DMA采集形式获取电压数据。
同时利用外部中断EXTI来判断DO口是否酒精浓度达到一定的值,当检测到酒精时,DO口会由输出高电平变为输出低电平,因此将STM32的PA4口设置为下降沿模式的外部中断模式检测是否有酒精(也可以通过设置输入模式一直循环检测DO口是否为低电平来判断是否有酒精,但此方法占用CPU时间,没有硬件中断合适)。为判断存在酒精,在中断回调函数里设置点亮LED灯(即PB9)。

CubeMX图文设置:
基本的时钟选择等省略,可参考蓝桥杯物联网基础图文教程——GPIO输出控制LD5亮灭
设置ADC DMA模式,选择的ADC1通道1
在这里插入图片描述
设置PA4为外部中断模式,用于监测DO口的电平跳变
在这里插入图片描述
ADC 的DMA模式设置,其他都为默认即可
在这里插入图片描述
在这里插入图片描述
选择串口用于输出数据到串口助手显示数据
在这里插入图片描述
生成项目

补充代码:

main.c


/* USER CODE BEGIN PV */

uint32_t adc_value=0;
uint32_t Alcohol=0;
uint8_t a=1;
/* USER CODE END PV */



/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  
  

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_ADC_Start_DMA(&hadc1,&adc_value,1);	
		Alcohol=((float)adc_value*3.3/4096*0.36-1.08)*10000;//电压数据转换(此处由于还未找到相关公式,暂时这样代替,如有了解的大佬可以在评论区补充一下)
		printf("Alcohol=%d\r\n",Alcohol);		
		HAL_Delay(1000);
  }
  /* USER CODE END 3 */
}

//中断回调函数,当有酒精时,DO口电平由高电平边低电平,PA4触发外部中断,进入中断函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
	if(GPIO_Pin==Alcohol_DO_Pin){
	 HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,1);
	}
	//设置一个按键中断,为了把酒精触发的LED点亮之后熄灭(实际项目中可改为关闭蜂鸣器等)
	if(GPIO_Pin==KEY1_Pin){
	 HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,0);
	}
}
	
/* USER CODE END 4 */

重定向代码:


int fputc(int ch, FILE *f)
{  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

int fgetc(FILE * f)
{  uint8_t ch = 0;
  HAL_UART_Receive(&huart1,&ch, 1, 0xffff);
  return ch;}

在这里插入图片描述

硬件连接

  MQ-3 							STM32
  
  AO口 			接  			PA1  (ADC_IN1)
  DO口				接			PA4	(外部中断)
  GND  			接  			GND
  VCC  			接  			VCC5V	
  										PB9 连接LED灯
  										PA9/10   UART TX/RX

项目代码可关注回复评论领取

### 使用HALSTM32编写MQ135气体传感器驱动 为了使用HALSTM32编写MQ135气体传感器驱动程序,需了解基本的初始化过程以及读取传感器数据的方式。以下是详细的说明和示例代码。 #### 初始化GPIO引脚配置 首先,在`main.c`文件中定义用于连接MQ135传感器的GPIO引脚,并完成必要的初始化设置: ```c // 定义用于模拟电压信号输入的ADC通道对应的GPIO引脚 #define MQ135_PIN GPIO_PIN_0 #define MQ135_GPIO_PORT GPIOA #define ADC_CHANNEL ADC_CHANNEL_0 ``` 接着调用标准外设中的API函数来配置上述指定的GPIO端口模式为模拟输入类型[^1]。 #### 配置并启动ADC转换器 由于MQ135输出的是模拟量,因此需要借助于片上集成的模数转换器(ADC)将其转化为数字形式以便后续处理。下面展示了一段简化版的ADC初始化流程: ```c static void MX_ADC_Init(void) { /* USER CODE BEGIN ADC_Init 0 */ /* USER CODE END ADC_Init 0 */ /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) */ hadc.Instance = ADC1; 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.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.NbrOfConversion = 1; hadc.Init.DMAContinuousRequests = DISABLE; hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV; if (HAL_ADC_Init(&hadc) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */ sConfig.Channel = ADC_CHANNEL; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Handler(); } } ``` 这段代码完成了对ADC模块的基本参数设定工作,比如时钟分频系数、分辨率位宽等;同时也指定了具体要测量哪个通道的数据及其采样周期长度[^2]。 #### 实现获取当前空气质量指数AQI的功能 最后一步就是创建一个专门用来计算空气中污染物浓度值即AQI的应用层接口了。这里给出一种可能的设计思路——通过查询预先建立好的映射表得到对应关系后再做适当变换即可得出最终结果: ```c float Get_AQI_Value(float raw_value){ float rs_ratio = ((raw_value / VRL) * RL_VALUE); // 计算Rs/Ro比率 // 假定已知某种特定条件下测得的标准Ro值... return calculate_ppm(rs_ratio); } void read_MQ135(){ uint32_t adc_raw_data; static float voltage_mV; static float concentration; HAL_ADC_Start(&hadc); HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY); adc_raw_data = HAL_ADC_GetValue(&hadc); voltage_mV = (((adc_raw_data * 3.3f)/4096)*1000); concentration = Get_AQI_Value(voltage_mV); printf("Current Air Quality Index(AQI): %.2f ppm\n",concentration); } ``` 此部分实现了从原始AD数值到物理意义下的质量浓度单位(ppm)之间的相互转化逻辑。
评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值