详解MQ3酒精传感器的工作原理以及与Arduino的连接方式

通过使用MQ3酒精传感器模块,可以让您接下来 Arduino项目感测酒精。该传感器检测空气中酒精的存在及其浓度。 如果您自制一台呼气式酒精测试仪来确定某人呼吸中的酒精含量,MQ3酒精传感器模块是一个绝佳的选择。

MQ3酒精传感器

MQ3传感器是MQ传感器系列中使用最广泛的传感器之一。它是一种MOS(金属氧化物半导体)传感器。 金属氧化物传感器也称为化学电阻器,因为传感是基于传感材料暴露于酒精时的电阻变化。

MQ3酒精传感器工作在5V下,功耗约为800mW。 它可以检测范围为25至500ppm的酒精浓度。

MQ3酒精传感器内部结构

MQ3是一种加热器驱动的传感器。 因此,它覆盖着两层被称为“防爆网”的精细不锈钢网。 它确保传感器内部的加热元件不会因为我们感应的是易燃气体(酒精)而引起爆炸。

它还可以保护传感器并过滤掉悬浮颗粒,只允许气态元素通过腔室。


移除外网后,传感器看起来像这样。传感元件和六个延伸到胶木底座之外的连接腿形成星形结构。六个引线中的两个 (H) 负责加热传感元件,并通过镍铬线圈(一种众所周知的导电合金)连接在一起。

其余四根信号导线(A 和 B)用铂丝连接。 这些电线连接到传感元件的主体,并传递流过传感元件的电流的微小变化。

管状传感元件由氧化铝 (AL2O3) 基陶瓷和二氧化锡涂层 (SnO2) 制成。 二氧化锡是最重要的材料,因为它对酒精敏感。 另一方面,陶瓷基板提高了加热效率,确保传感器区域持续加热到工作温度。

总而言之,加热系统由镍铬线圈和氧化铝基陶瓷组成,而传感系统由铂丝和二氧化锡涂层组成。

MQ3酒精传感器如何工作?

当二氧化锡层被加热到高温时,氧被吸附在表面上。 当空气干净时,二氧化锡导带中的电子会被氧分子吸引。这会在SnO2颗粒表面下方形成电子耗尽层,形成势垒。 结果,SnO2膜变得高电阻并阻止电流流动。

然而,在酒精存在的情况下,吸附氧的表面密度会随着酒精与酒精反应而降低,从而降低势垒。 这样,电子被释放到二氧化锡中,允许电流自由流过传感器。

MQ3酒精传感器模块硬件概述

MQ3酒精传感器使用简单,具有两种不同的输出。 它不仅提供了酒精存在的二进制指示,而且还提供了其在空气中浓度的模拟表示。

传感器的模拟输出电压与酒精浓度成比例变化。 空气中酒精浓度越高,输出电压越高; 浓度越低,输出电压越低。 下面的动画显示了酒精浓度和输出电压之间的关系。

该模拟信号由LM393高精度比较器数字化,并在数字输出 (D0) 引脚提供。

该模块包括一个电位计,用于调节数字输出 (D0) 的灵敏度。 您可以使用它来设置一个阈值,以便当酒精浓度超过阈值时,模块输出低电平,否则输出高电平。

此外,该模块还有两个LED灯。 当模块开启时电源LED亮起,当酒精浓度超过阈值时状态LED亮起。

MQ3酒精传感器模块的引脚排列

现在让我们看一下引脚排列。

VCC 为模块供电。 将它连接到 Arduino的5V输出。

GND 是接地引脚。

D0 表示存在酒精。 当酒精浓度超过阈值时,D0变为低电平,否则变为高电平。

A0 产生与酒精浓度成正比的模拟输出电压,因此浓度越高,电压越高,浓度越低,电压越低。

校准MQ3酒精传感器

由于MQ3是一个加热器驱动的传感器,如果长时间存放,传感器的校准可能会漂移。

长时间存放(一个月或更长时间)后首次使用时,传感器必须充分预热24-48小时以确保最大精度。

如果最近使用过传感器,则只需5-10分钟即可完全预热。 在预热期间,传感器读数通常很高,然后逐渐降低直到稳定。

实验1 – 使用模拟输出 (A0) 测量酒精浓度

在第一个实验中,我们将读取模拟输出以测量酒精浓度。

硬件接线

让我们将MQ3酒精传感器连接到 Arduino

首先将VCC引脚连接到 Arduino的5V引脚,将GND引脚连接到Arduino的接地引脚。最后,将模块的A0输出引脚连接到Arduino上的模拟引脚#0。

下图显示了接线。

寻找阈值

要估计酒精中毒程度,您需要记录在饮酒前后吹气时传感器输出的值。

只需运行下面的草图并获取读数。

#define MQ3pin 0

float sensorValue;  //variable to store sensor value

void setup() {
        Serial.begin(9600); // sets the serial port to 9600
        Serial.println("MQ3 warming up!");
        delay(20000); // allow the MQ3 to warm up
}

void loop() {
        sensorValue = analogRead(MQ3pin); // read analog input pin 0

        Serial.print("Sensor Value: ");
        Serial.println(sensorValue);
        
        delay(2000); // wait 2s for next reading
}

运行草图代码后,您应该会看到类似于以下内容的读数:

●    在没有酒精的情况下(大约 120)

●    在有酒精的情况下(约 500)

此测试可能需要反复试验。 获得读数后,您可以将它们用作触发动作的阈值。

 Arduino代码

下面的草图使用以下阈值估计酒精中毒的程度:

●    < 120 是清醒的

●    120-400 正在饮酒

●    > 400 喝醉了

/* Replace these values with your own readings */
#define Sober 120   // Define max value that we consider sober
#define Drunk 400   // Define min value that we consider drunk

#define MQ3pin 0

float sensorValue;  //variable to store sensor value

void setup() {
        Serial.begin(9600); // sets the serial port to 9600
        Serial.println("MQ3 warming up!");
        delay(20000); // allow the MQ3 to warm up
}

void loop() {
        sensorValue = analogRead(MQ3pin); // read analog input pin 0

        Serial.print("Sensor Value: ");
        Serial.print(sensorValue);
        
        // Determine the status
        if (sensorValue < Sober) {
                Serial.println("  |  Status: Stone Cold Sober");
        } else if (sensorValue >= Sober && sensorValue < Drunk) {
                Serial.println("  |  Status: Drinking but within legal limits");
        } else {
                Serial.println("  |  Status: DRUNK");
        }
        
        delay(2000); // wait 2s for next reading
}

如果一切正常,您应该会在串口监视器上看到类似的内容。

实验2 – 使用数字输出 (D0) 检测是否存在酒精

在第二个实验中,我们将使用数字输出来检测酒精的存在。

硬件接线

我们将重复使用之前实验的电路。只需断开与ADC引脚的连接,并将模块上的D0引脚连接到 Arduino的数字引脚#8。

下图显示了接线。

设置阈值

该模块有一个内置电位器,用于设置酒精浓度阈值,高于该阈值模块输出低电平,状态 LED 亮起。

现在,要设置阈值,让酒精蒸汽进入传感器并顺时针转动电位器,直到状态LED亮起。 然后,逆时针转动电位器直到LED熄灭。

 Arduino代码

现在,将下面的草图上传到您的  Arduino

#define MQ3pin 8

int sensorValue;  //variable to store sensor value

void setup() {
        Serial.begin(9600); // sets the serial port to 9600
        Serial.println("MQ3 warming up!");
        delay(20000); // allow the MQ3 to warm up
}

void loop() {
        sensorValue = digitalRead(MQ3pin); // read digital output pin
        Serial.print("Digital Output: ");
        Serial.print(sensorValue);
        
        // Determine the status
        if (sensorValue) {
                Serial.println("  |  Alcohol: -");
        } else {
                Serial.println("  |  Alcohol: Detected!");
        }
        
        delay(2000); // wait 2s for next reading

您可以在串口监视器上看到类似的输出。

类似文章

发表回复