MQ系列气体传感器是气体检测器中用于检测或测量某些类型的气体的非常常见的传感器类型。这些传感器广泛用于所有与气体有关的设备,例如从简单的烟雾探测器到工业空气质量监测仪。我们已经在Arduino上使用了这些MQ气体传感器来测量一些有害气体,例如氨。在本文中,我们将学习如何将这些气体传感器与PIC单片机配合使用,以测量气体的PPM值并将其显示在16x2 LCD上。
如前所述,市场上有不同种类的MQ系列传感器,每种传感器可以测量不同类型的气体,如下表所示。为了本文的目的,我们将使用带有PIC的MQ6气体传感器,该传感器可用于检测LPG气体的存在和浓度。但是,通过使用相同的硬件和固件,也可以使用其他MQ系列传感器,而无需在代码和硬件部分进行重大修改。
传感器 | 检测 |
MQ-2 | 甲烷,丁烷,液化石油气,烟雾 |
MQ-3 | 酒精,乙醇,烟 |
MQ-4 | 甲烷,天然气 |
MQ-5 | 天然气,液化石油气 |
MQ-6 | 液化石油气,丁烷气 |
MQ-7 | 一氧化碳 |
MQ-8 | 氢气 |
MQ-9 | 一氧化碳,易燃气体。 |
MQ131 | 臭氧 |
MQ135 | 空气质量(苯,酒精,烟) |
MQ136 | 硫化氢气体 |
MQ137 | 氨 |
MQ138 | 苯,甲苯,酒精,丙酮,丙烷,甲醛气体,氢气 |
MQ214 | 甲烷,天然气 |
MQ216 | 天然气,煤气 |
MQ303A | 酒精,乙醇,烟 |
MQ306A | 液化石油气,丁烷气 |
MQ307A | 一氧化碳 |
MQ309A | 一氧化碳,易燃气体 |
MG811 | 二氧化碳(CO2) |
AQ-104 | 空气质量 |
MQ6气体传感器
下图显示了MQ6传感器的引脚图。但是,左图是用于与微控制器单元接口的基于模块的MQ6传感器,该图中还显示了模块的引脚图。
引脚1是VCC,引脚2是GND,引脚3是数字输出(检测到气体时为逻辑低电平),引脚4是模拟输出。电位器用于调节灵敏度。不是RL。RL电阻是DOUT LED的右侧电阻。
每个MQ系列传感器都有一个加热元件和一个感应电阻。根据气体的浓度,检测电阻会发生变化,通过检测变化的电阻,可以测量气体浓度。为了测量PPM中的气体浓度,所有MQ传感器都提供了一个非常重要的对数图。该图提供了具有RS和RO之比的气体浓度概览。
如何使用MQ气体传感器测量PPM?
RS是存在特定气体时的感测电阻,而RO是没有任何特定气体的洁净空气中的感测电阻。以下从数据表中获取的对数图概述了气体浓度以及MQ6传感器的感测电阻。 MQ6传感器用于检测LPG气体浓度。因此,MQ6传感器将在没有LPG气体的清洁空气条件下提供特殊的电阻。而且,只要MQ6传感器检测到LPG气体,电阻就会改变。
因此,我们需要将该图绘制到我们的固件中,就像在Arduino气体检测器项目中所做的一样。该公式将具有3个不同的数据点。前两个数据点是LPG曲线的起点,以X和Y坐标表示。第三个数据是斜率。
因此,如果我们选择深蓝色曲线作为LPG曲线,则该曲线在X和Y坐标处的起点为200和2。因此,对数刻度的第一个数据点为(log200,log2),即( 2.3,0.30)。
让我们将其设为X1和Y1 =(2.3,0.30)。曲线的终点是第二个数据点。通过上述相同的过程,X2和Y2为(log 10000,log0.4)。因此,X2和Y2 =(4,-0.40)。要获得曲线的斜率,公式为
=(Y2-Y1)/(X2-X1)=(-0.40-0.30)/(4-2.3)=(-0.70)/(1.7)= -0.41
我们需要的图形可以表示为
LPG_Curve = {从X开始并从Y开始,斜率} LPG_Curve = {2.3,0.30,-0.41}
对于其他MQ传感器,请从数据表和对数图获得上述数据。该值将根据传感器和所测量的气体而有所不同。对于此特定模块,它具有一个数字引脚,该引脚仅提供有关是否存在气体的信息。对于此项目,也使用它。
所需组件
下面给出了将MQ传感器与PIC微控制器接口所需的组件-
- 5V电源
- 面包板
- 4.7k电阻
- 液晶屏16x2
- 1K电阻
- 20Mhz晶体
- 33pF电容器-2个
- PIC16F877A单片机
- MQ系列传感器
- Berg和其他连接线。
原理图
这种带有PIC项目的气体传感器的原理图非常简单。模拟引脚与RA0连接,数字引脚与RD5连接,以测量气体传感器模块提供的模拟电压。如果您不熟悉PIC,则可能需要查看PIC ADC教程和PIC LCD教程,以更好地理解该项目。
该电路构建在面包板上。连接完成后,我的设置如下所示。
带有PIC编程的MQ传感器
该代码的主要部分是主要功能和其他关联的外围功能。完整程序可在本页底部找到,重要的代码片段解释如下。
以下功能用于获取自由空气中的传感器电阻值。使用模拟通道0时,它正在从模拟通道0获取数据。这用于校准MQ气体传感器。
float SensorCalibration(){ int count; //此功能将在自由空气 浮起中 校准传感器 val = 0; for(count = 0; count <50; count ++){//获取多个样本并计算平均值 val + = calculate_resistance(ADC_Read(0)); __delay_ms(500); } val = val / 50; val = val / RO_VALUE_CLEAN_AIR; //除以RO_CLEAN_AIR_FACTOR会得出Ro 返回值; }
下面的功能用于读取MQ传感器模拟值并将其取平均值以计算Rs值
浮点数read_MQ() { int count; float rs = 0; for(count = 0; count <5; count ++){//获取多个读数并取平均值。 rs + = calculate_resistance(ADC_Read(0)); // rs根据气体浓度而变化。 __delay_ms(50); } rs = rs / 5; 返回rs; }
以下功能用于根据分压电阻和负载电阻计算电阻。
浮点calculate_resistance(int adc_channel) {//传感器和负载电阻形成一个分压器。因此使用模拟值和负载值 返回(((float)RL_VALUE *(1023-adc_channel)/ adc_channel)); //我们将找到传感器电阻。 }
RL_VALUE是在代码的开头定义的,如下所示
#define RL_VALUE(10)//定义板上的负载电阻,以千欧姆为单位
检查车载负载电阻后,更改此值。在其他MQ传感器板上可能有所不同。要将可用数据绘制到对数刻度中,请使用以下功能。
int gas_plot_log_scale(float rs_ro_ratio,float * curve) { return pow(10,((((log(rs_ro_ratio)-curve)/ curve)+ curve)));复制代码 }
该曲线是上面代码中先前定义的LPG曲线。
浮点数MQ6_curve = {2.3,0.30,-0.41}; // Graph Plot,为特定的传感器更改它
最后,我们在其中提供了测量模拟值,计算PPM并将其显示在LCD上的主要功能。
void main(){ system_init(); clear_screen(); lcd_com(FIRST_LINE); lcd_puts(“ Calibrating….”); Ro = SensorCalibration(); // clear_screen(); lcd_com(FIRST_LINE); lcd_puts(“ Done!”); // clear_screen(); lcd_com(FIRST_LINE); lcd_print_number(Ro); lcd_puts(“ K Ohms”); __delay_ms(1500); gas_detect = 0; while(1){ if(gas_detect == 0){ lcd_com(FIRST_LINE); lcd_puts(“存在气体”); lcd_com(SECOND_LINE); lcd_puts(“ Gas ppm =”); float rs = read_MQ(); 浮动比率= rs / Ro; lcd_print_number(gas_plot_log_scale(ratio,MQ6_curve)); __delay_ms(1500); clear_screen(); } else { lcd_com(FIRST_LINE); lcd_puts(“不存在气体”); } } }
首先,在干净的空气中测量传感器的RO。然后读取数字引脚以检查是否存在气体。如果存在气体,则通过提供的LPG曲线测量气体。
我已使用打火机检查检测到气体时PPM值是否正在变化。这些点烟器内部装有LPG气体,当释放到空气中时,它将被我们的传感器读取,并且LCD上的PPM值会发生变化,如下所示。
可以在本页底部的视频中找到完整的工作。如果您有任何疑问,请将其留在评论部分,或将我们的论坛用于其他技术问题。