Ανίχνευση καπνού/αερίων με τον αισθητήρα MQ2

Σε αυτό το πρότζεκτ θα σας δείξω πως θα χρησιμοποιήσετε τον αισθητήρα MQ2 για να ανιχνεύσετε καπνό ή αέρια. Αυτός ο αισθητήρας μπορεί να χρησιμοποιηθεί με επιτυχία σε συστήματα συναγερμού ανίχνευσης καπνού ή αερίων. Επίσης μπορεί να χρησιμοποιηθεί για την ανάλυση της ποιότητας αέρα στους κλειστούς χώρους.

Ο αισθητήρας MQ2 είναι ευαίσθητος για πολλαπλά αέρια αλλά δεν μπορεί να τα ξεχωρίσει. Αυτός είναι ευαίσθητος και μπορεί να ανιχνεύσει  LPG, Καπνό, Αιθανόλη, Προπάνιο, Υδρογόνο, Μεθάνιο και Μονοξείδιο του άνθρακα.

Το MQ2 είναι ένας τύπος Metal Oxide Semiconductor (MOS) αισθητήρας γνωστός σαν Chemiresistor και η βασική αρχή λειτουργίας στηρίζεται στην μεταβολή της αντίστασης που υπάρχει μέσα στο εξάρτημα του αισθητήρα καθώς το αέριο έρχεται σε επαφή μαζί του.

Η τάση εξόδου του αισθητήρα MQ2 μεταβάλλεται και είναι ανάλογη με την συγκέντρωση των επιπέδων του αερίου στον αέρα. Έτσι έχουμε μεγαλύτερη τάση εξόδου με αυξανόμενη συγκέντρωση αερίων.

Ο αισθητήρας ανίχνευσης αερίων για να δουλέψει τροφοδοτείται με τάση 5V και καταναλώνει ισχύ γύρω στα 800mW και μπορεί να ανιχνεύσει συγκεντρώσεις αερίων μεταξύ 200 εως 10.000ppm.

Το pcb που πάνω είναι κολλημένος ο αισθητήρας MQ2 έχει 4 ακροδέκτες από τις οποίους οι δυο είναι για την τροφοδοσία και οι άλλες δύο είναι έξοδοι δεδομένων. Η μια έξοδος μεταφέρει μια αναλογική τάση εξόδου (Α0) ανάλογη της συγκέντρωσης αερίων και η άλλη μια ψηφιακή έξοδος (D0) που παίρνει τιμή HIGH ή LOW ανάλογα αν η τάση εξόδου του αισθητήρα έχει περάσει μια συγκεκριμένη τάση αναφοράς. Αυτή η τάση αναφοράς ρυθμίζεται από ένα ποτενσιόμετρο πίσω στο pcb του αισθητήρα.

Για να καλιμπράρεις  την ψηφιακή έξοδο, πρέπει να ρυθμίσεις την ευαισθησία του κυκλώματος του αισθητήρα, γυρίζοντας με ένα μικρό κατσαβίδι το ποτενσιόμετρο δεξιόστροφα για αύξηση της ευαισθησίας και αριστερόστροφα για μείωση της ευαισθησίας. Ο συνγριτής IC πάνω στο pcb του  MQ2 ελέγχει αν η αναλογική έξοδος έχει περάσει το όριο και θέτει την ψηφιακή έξοδο HIGH ή LOW.

Διάταξη ακροδεκτών του αισθητήρα MQ2

Το εξάρτημα του αισθητήρα έρχεται στο ebay.com κολιμένο πάνω σε ένα pcb με τέσσερις ακροδέκτες όπως φαίνεται στο σχήμα που ακολουθεί:

VCC : τροφοδοτεί με τάση το module. Μπορείς να τον συνδέσεις στην έξοδο 5V του Arduino ή σε άλλο τροφοδοτικό.
GND : είναι ο ακροδέκτης της γείωσης και συνδέεται στα 0V του Arduino ή σε άλλο τροφοδοτικό.
D0 : παρέχει μια ψηφιακή τάση εξόδου, με δυο διακριτές τιμές, αν υπάρχει ή όχι συγκέντρωση αερίων
Α0 : παρέχει μια αναλογική τάση εξόδου ανάλογη της συγκέντρωσης του καπνού ή αερίων.

Προσοχή! κάποια MQ2 modules ανίχνευσης αερίων έχουν τους ακροδέκτες εξόδου D0 και Α0 τοποθετιμένους ανάστροφα.

Πειραματική διάταξη με αναλογική διασύνδεση του αισθητήρα MQ2 με το Arduino

Μιας που έχουμε καταλάβει την αρχή λειτουργίας του MQ2, ας πειραματιστούμε συνδέοντας τον αισθητήρα MQ2 στην αναπτυξιακή πλακέτα με το Arduino Nano που έχουμε παρουσιάσει σε άλλο μέρος του ιστοτόπου.

Συνδέουμε τον ακροδέκτη VCC με την τάση 5 V της αναπτυξιακής πλακέτας και το GND στα 0V της ίδιας πλακέτας. Συνδέουμε την αναλογική έξοδο A0 του module MQ2 με την αναλογική είσοδο A0 της αναπτυξιακής πλακέτας και αφήνουμε την ψηφιακή έξοδο του αισθητήρα ασύνδετη.

Η διασύνδεση των ακροδεκτών του αισθητήρα MQ2 με την αναπτυξιακή πλακέτα, φαίνονται στον ακόλουθο πίνακα:

Ο κώδικας Arduino για την δοκιμαστική διάταξη είναι ο ακόλουθος:

//Συμπερίληψη βιβλιοθήκης για το LCD
#include <LiquidCrystal.h> 
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Δημιουργία αντικειμένου lcd

#define MQ2pin (0)
#define sensorLimit 300
float sensorValue;  // μεταβλητή για αποθήκευση της τιμής που δίνει ο αισθητήρας

void setup()
{
  lcd.begin(20, 4); // αρχικοποίηση του LCD module
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("SensorWarmingUp!");
  delay(20000); // Χρόνος θέρμανσης του αισθητήρα MQ2
}

void loop()
{
  sensorValue = analogRead(MQ2pin); // Διάβασμα της αναλογικής εισόδου πιν 0

  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("GasValue:");
  lcd.print(sensorValue);
  
  if(sensorValue > sensorLimit)
  {
    lcd.setCursor(0, 2);
    lcd.print("Smoke detected!");
  }
  delay(2000); // wait 2s for next reading
}

Επεξήγηση του κώδικα

Ο κώδικας ξεκινά με την συμπερίληψη της βιβλιοθήκης για το LCD module και έπειτα την δημιουργία ενός αντικειμένου lcd με την συνάρτηση δημιουργίας να δέχεται ως παραμέτρους τα πιν του Arduino στα οποία συνδέεται.

//Συμπερίληψη βιβλιοθήκης για το LCD
#include <LiquidCrystal.h> 
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Δημιουργία αντικειμένου lcd

Στην συνέχεια ορίζεται ο αναλογικός ακροδέκτης εισόδου του Arduino στο οποίο η αναλογική έξοδος του αισθητήρα συνδέεται. Επίσης μια μεταβλητή με όνομα sensorValue ορίζεται για την κράτηση της τιμής του αισθητήρα.

#define MQ2pin (0)
#define sensorLimit 300
float sensorValue;  // μεταβλητή για αποθήκευση της τιμής που δίνει ο αισθητήρας

Στην συνάρτηση ‘setup’ αρχικοποιείται η επικοινωνία με το LCD module και ορίζεται μια περίοδος αναμονής 20 δευτερόλεπτα για την θέρμανση του MQ2

  lcd.begin(20, 4); // αρχικοποίηση του LCD module
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("SensorWarmingUp!");
  delay(20000); // Χρόνος θέρμανσης του αισθητήρα MQ2

Στην συνάρτηση βρόγχου ‘loop” η τιμή του αισθητήρα διαβάζεται από την συνάρτηση του Arduino την analogRead() και την εμφανίζει στην οθόνη LCD.

sensorValue = analogRead(MQ2pin); // Διάβασμα της αναλογικής εισόδου πιν 0

  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("GasValue:");
  lcd.print(sensorValue);

Όταν η συγκέντρωση αερίων / καπνού είναι αρκετά υψηλή, η αναλογική έξοδος του αισθητήρα είναι μεγαλύτερη από 300 την οποία ελέγχουμε χρησιμοποιώντας μια έκφραση if και όταν η τιμή του αισθητήρα περάσει την τιμή 300 (sensorLimit), ένα προειδοποιητικό μήνυμα “Smoke Detected” εμφανίζεται στην οθόνη LCD.

 if(sensorValue > sensorLimit)
  {
    lcd.setCursor(0, 2);
    lcd.print("Smoke detected!");
  }

Πειραματική διάταξη με ψηφιακή διασύνδεση του αισθητήρα MQ2 με το Arduino

Μπορούμε να συνδέσουμε διαφορετικά το MQ2 module χρησιμοποιώντας ψηφιακή διεπαφή. Η λειτουργία του βασίζεται σε ένα μικρό ποτενσιόμετρο που υπάρχει πίσω από το pcb του αισθητήρα και δουλεύει ως εξής: πάνω στο pcb υπάρχει ένας συγκριτής και με τη βοήθεια του ποτενσιόμετρου ορίζουμε την τάση κατωφλίου.

Ο συγκριτής δίνει έξοδο LOW αν υπάρχει συγκέντρωση καπνού μεγαλύτερη από την αντίστοιχη που ορίσαμε με το ποτενσιόμετρο, αλλιώς η ψηφιακή έξοδος τίθεται σε HIGH. Θα πρέπει να έχουμε ρυθμίσει το ποτενσιόμετρο κατάλληλα ώστε η ψηφιακή έξοδος να δείχνει την σωστή ψηφιακή τιμή για την συγκέντρωση του καπνού που θέλουμε.

Στο πειραματικό κύκλωμα συνδέουμε τον ακροδέκτη της ψηφιακής εξόδου D0 του module MQ2 με ένα ψηφιακό πιν του Arduino. Η ψηφιακή διασύνδεση του αισθητήρα MQ2 με την αναπτυξιακή πλακέτα, ορίζεται με τον ακόλουθο πίνακα:

 Ακολουθεί ο αντίστοιχος κώδικας:

//Συμπερίληψη βιβλιοθήκης για το LCD
#include <LiquidCrystal.h> 
 
#define MQ2_digital_pin 8

LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Δημιουργία αντικειμένου lcd
bool sensorValue;

void setup()
{ 
  pinMode(MQ2_digital_pin, INPUT);
  lcd.begin(20, 4); // αρχικοποίηση του LCD module
  lcd.clear();
  lcd.print("SensorWarmingUp!");
  delay(20000); // Χρόνος θέρμανσης του αισθητήρα MQ2
  lcd.clear();
}

void loop()
{
  sensorValue = digitalRead(MQ2_digital_pin); // Διάβασμα της ψηφιακής εισόδου πιν 0
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("Digital Output: ");
  lcd.print(sensorValue);
  if(sensorValue)
  {
    lcd.print(" | Smoke -");
  }
  else
  { 
    lcd.print(" | Smoke detected!");
  }
  delay(2000); // wait 2s for next reading
}

Επεξήγηση του κώδικα

Στις πρώτες γραμμές εισάγουμε την βιβλιοθήκη για το lcd display και δημιουργούμε το αντικείμενο lcd ορίζοντας τους ακροδέκτες με τους οποίους διασυνδέεται με το Arduino της αναπτυξιακής πλακέτας. Επίσης ορίζουμε με την define το pin του Arduino το οποίο συνδέεται με τον αισθητήρα MQ2.

Στην συνάρτηση setup() αρχικοποιούμε το LCD module και περιμένουμε 20 δευτερόλεπτα μέχρι να ζεσταθεί ο αισθητήρας. Μέσα στη συνάρτηση loop() διαβάζουμε την ψηφιακή κατάσταση του ψηφιακού ακροδέκτη του αισθητήρα MQ2 και αφού πρώτα καθαρίσουμε το LCD display εκτυπώνουμε εάν ανιχνεύτηκε καπνός ή όχι. Αυτή η διαδικασία μέσα στη συνάρτηση loop() επαναλαμβάνεται συνεχόμενα με μια παύση 2 δευτερολέπτων.