Ανίχνευση καπνού/αερίων με τον αισθητήρα 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, ας πειραματιστούμε συνδέοντας τον αισθητήρα στην αναπτυξιακή πλακέτα με το Arduino Nano που έχουμε παρουσιάσει σε άλλο μέρος του ιστοτόπου. Συνδέουμε τον ακροδέκτη VCC με την τάση 5 V της αναπτυξιακής πλακέτας και το GND στα 0V της ίδιας πλακέτας. Συνδέουμε την ψηφιακή έξοδο D0 του module MQ2 με το ψηφιακό πιν Ι/Ο  8 της αναπτυξιακής πλακέτας και την αναλογική έξοδο A0 του module MQ2 με την αναλογική είσοδο A0 της αναπτυξιακής πλακέτας. Επίσης συνδέουμε ένα βομβητή στο ψηφιακό πιν 9 που ηχεί όταν έχουμε ανεπιθύμητα αέρια.

Το κύκλωμα της πειραματικής διάταξης είναι το ακόλουθο:

Ο κώδικας 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(16, 2); // αρχικοποίηση του LCD module
  lcd.clear();
  lcd.print("SensorWarmingUp!");
  delay(20000); // Χρόνος θέρμανσης του αισθητήρα MQ2
}

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

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

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

Ο κώδικας ξεκινά με την συμπερίληψη της βιβλιοθήκης για το 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(16, 2); // αρχικοποίηση του LCD module
  lcd.clear();
  lcd.print("SensorWarmingUp!");
  delay(20000); // Χρόνος θέρμανσης του αισθητήρα MQ2

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

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

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

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

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

Παράδειγμα συναγερμού αερίων χρησιμοποιώντας την ψηφιακή έξοδο του MQ2

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

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

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

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

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

void loop()
{
  sensorValue = digitalRead(MQ2_digital_pin); // Διάβασμα της ψηφιακής εισόδου πιν 0
  if(sensorValue)
  {
    lcd.setCursor(0, 1);
    lcd.print("Smoke detected!");
    alarm(500, 1000);
  }
  else
  { 
    noAlarm();
  }
  delay(2000); // wait 2s for next reading
  lcd.setCursor(0, 1);
  lcd.print("                ");
}
// Συνάρτηση για την δημιουργία ήχου με παραμέτρους την διάρκεια και την συχνότητα:
void alarm(int duration, int freq) {
  tone(buzzerPin, freq);
  delay(duration);
  noTone(buzzerPin);
}
void noAlarm()
{
  noTone(buzzerPin);
}