智能安全辅助驾驶系统 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
项目代码可关注回复评论领取