Pentru detectia scurgerilor de gaze inflamabile putem folosi senzorul MQ6. Acest senzor detecteaza scurgerile de gaz GPL, gaz metan, hidrogen si chiar CO2.
Modulul se alimenteaza cu o tensiune de 5V (obligatorie pentru functionarea elementului incalzitor din interiorul senzorului) si ofera 2 tipuri de iesiri: o iesire digitala care are un prag reglabil si o iesire analogica, iesire care ne ofera mult mai detaliat nivelul de gaz detectat in aer.
O poza cu acest modul este mai jos:


Conexiunea senzorului cu Arduino Uno se poate face simplu, folosind iesirea analogica a modulului la pinul A0 al placii de dezvoltare.
Pentru o verificare rapida putem folosi urmatorul sketch, sketch care ne ofera informatii despre nivelul de gaze detectate in terminalul serial:
int mq6=A0; //alocam pinul A0 pentru citirea datelor
int rezultat;
void setup()
{
Serial.begin(9600);
pinMode(mq6,INPUT); //setam pinul A0 ca si pin de intrare
Serial.println("Testare modul MQ-6");
Serial.println("############################");
delay(2000);
}
void loop()
{
rezultat = analogRead(mq6);
Serial.print("Rezultate returnate de catre senzor:");
Serial.println(rezultat);
delay(1000);
}
Rezultatul rularii acestui sketch se poate vedea mai jos:

Dupa cum se observa la pornirea senzorului in aer curat rezultatul returnat este in gama 50-70. La detectia gazului de bricheta (folosit in teste) rezultatul returnat creste peste valoarea de 100, in functie de cat de mult gaz se detecteaza.
Daca dorim sa folosim o varianta mai complexa de cod (cu o detectie mai precisa) putem folosi urmatorul cod.
#define MQ_PIN 0
#define RL_VALUE 20
#define RO_CLEAN_AIR_FACTOR 10
#define CALIBARAION_SAMPLE_TIMES 50
#define CALIBRATION_SAMPLE_INTERVAL 500
#define READ_SAMPLE_INTERVAL 50
#define READ_SAMPLE_TIMES 5
#define GAS_LPG 0
#define GAS_CH4 1
float LPGCurve[3] = {3, 0, -0.4};
float CH4Curve[3] = {3.3, 0, -0.38};
float Ro = 10;
void setup() {
Serial.begin(9600);
Serial.print("Calibrare... Va rugam asteptati\n");
Ro = MQCalibration(MQ_PIN);
Serial.print("Calibrare realizata cu succes...\n");
Serial.print("Ro=");
Serial.print(Ro);
Serial.print("kohm");
Serial.print("\n");
}
void loop()
{
Serial.print("GPL:");
Serial.print(MQGetGasPercentage(MQRead(MQ_PIN)/Ro,GAS_LPG) );
Serial.print( "ppm" );
Serial.print(" ");
Serial.print("Gaz metan:");
Serial.print(MQGetGasPercentage(MQRead(MQ_PIN)/Ro,GAS_CH4) );
Serial.print( "ppm" );
Serial.print("\n");
delay(1000);
}
float MQResistanceCalculation(int raw_adc)
{
return ( ((float)RL_VALUE*(1023-raw_adc)/raw_adc));
}
float MQCalibration(int mq_pin)
{
int i;
float val=0;
for (i=0;i<CALIBARAION_SAMPLE_TIMES;i++) {
val += MQResistanceCalculation(analogRead(mq_pin));
delay(CALIBRATION_SAMPLE_INTERVAL);
}
val = val/CALIBARAION_SAMPLE_TIMES;
val = val/RO_CLEAN_AIR_FACTOR;
return val;
}
float MQRead(int mq_pin)
{
int i;
float rs=0;
for (i=0;i<READ_SAMPLE_TIMES;i++) {
rs += MQResistanceCalculation(analogRead(mq_pin));
delay(READ_SAMPLE_INTERVAL);
}
rs = rs/READ_SAMPLE_TIMES;
return rs;
}
int MQGetGasPercentage(float rs_ro_ratio, int gas_id)
{
if ( gas_id == GAS_LPG ) {
return MQGetPercentage(rs_ro_ratio,LPGCurve);
} else if ( gas_id == GAS_CH4 ) {
return MQGetPercentage(rs_ro_ratio,CH4Curve);
}
return 0;
}
int MQGetPercentage(float rs_ro_ratio, float *pcurve)
{
return (pow(10, (((log(rs_ro_ratio)-pcurve[1])/pcurve[2]) + pcurve[0])));
}
Acest cod l-am gasit pe acest site si l-am modificat foarte putin.
In urma rularii codului rezultatul se va putea observa in terminalul serial:
