Ανίχνευση ατμών αλκόολ με τον αισθητήρα MQ3

Ο αισθητήρας MQ3 είναι μια δημοφιλής και οικονομική λύση για δημιουργία projects με το Arduino που τους δίνει την δυνατότητα να «μυρίζουν» αλκοόλ στον αέρα. Όμως χρειάζεται σωστή προθέρμανση και βαθμονόμηση για να δώσει αξιοποιήσιμες μετρήσεις. Έτσι με αυτό τον αισθητήρα μπορούμε να έχουμε τόσο την ένδειξη παρουσίας αλκόολ στο χώρο όσο και μια εκτίμηση της συγκέντρωσης τους.​

Ο MQ3 είναι ένας αισθητήρας τύπου MOS (Metal Oxide Semiconductor), όπου η ανίχνευση γίνεται μέσω μεταβολής της ηλεκτρικής αντίστασης του υλικού όταν εκτεθεί σε αλκοόλη, με αποτέλεσμα να μεταβάλλεται η τάση στην αναλογική έξοδο Α0 της μονάδας MQ3.

Στην πράξη, τα περισσότερα “MQ-3 modules” που θα βρεις για Arduino δίνουν τόσο αναλογική έξοδο (AO) όσο και ψηφιακή έξοδο (DO) μέσω συγκριτή (συνήθως με ποτενσιόμετρο κατωφλίου πάνω στο module).

Λειτουργεί με τροφοδοσία 5V και αναφέρεται κατανάλωση ηλεκτρικής ισχύς σε μορφή θερμότητας με τιμή περίπου <800 mW και έχει εύρος ανίχνευσης αλκόολ περίπου 25–500 ppm.​

Το ppm (parts-per-million) εκφράζει πόσα «μέρη» του υπό μέτρηση αερίου αντιστοιχούν σε ένα εκατομμύριο μέρη του μίγματος.​

Στο πλαίσιο του MQ3, το εύρος ppm χρησιμοποιείται για να περιγράψει συγκεντρώσεις ατμών αλκοόλ που μπορεί να ανιχνεύσει ή αποκρίνεται ο αισθητήρας.​

Ο MQ3 είναι heater-driven (βασίζεται σε θερμαντικό στοιχείο), και η κατασκευή του περιλαμβάνει προστατευτική μεταλλική σήτα/πλέγμα για ασφάλεια και φιλτράρισμα σωματιδίων.​

Το ενεργό υλικό ανίχνευσης είναι στρώμα SnO2: σε καθαρό αέρα η αντίσταση είναι υψηλότερη, ενώ παρουσία αλκοόλ η αγωγιμότητα αυξάνεται (άρα η αντίσταση μειώνεται), μεταβάλλοντας την τάση στον αναλογικό ακροδέκτη εξόδου.​

  • Τάση λειτουργίας: 5V
  • Αντίσταση φορτίου: 200kΩ
  • Αντίσταση θερμαντήρα: 33Ω±5%
  • Κατανάλωση θέρμανσης: <800mW
  • Αντίσταση ανίχνευσης: 1MΩ – 8MΩ
  • Εύρος συγκέντρωσης: 25 – 500 ppm
  • Χρόνος προθέρμανσης: πάνω από 24 ώρες

Ας δούμε τώρα το pinout.

  • VCC: τροφοδοσία του module. Σύνδεσέ το στην έξοδο 5V του Arduino.
  • GND: γείωση.
  • D0: δείχνει την παρουσία αλκοόλης. Γίνεται LOW όταν η συγκέντρωση αλκοόλης ξεπεράσει την τιμή κατωφλίου (όπως ρυθμίζεται από το ποτενσιόμετρο) και HIGH διαφορετικά.
  • A0: παράγει αναλογική τάση εξόδου ανάλογη της συγκέντρωσης αλκοόλης, άρα υψηλότερη συγκέντρωση δίνει υψηλότερη τάση και χαμηλότερη συγκέντρωση δίνει χαμηλότερη τάση.

Η μονάδα δίνει αναλογική έξοδο (A0) που μεταβάλλεται με τη συγκέντρωση αλκόολ και ψηφιακή έξοδο (D0) μέσω συγκριτή LM393.​

Η ψηφιακή έξοδος D0 έχει ρυθμιζόμενο κατώφλι μέσω ποτενσιόμετρου (threshold/sensitivity), ενώ συνήθως υπάρχουν LED τροφοδοσίας και κατάστασης για οπτική ένδειξη.​

Επειδή ο αισθητήρας θερμαίνεται, απαιτείται χρόνος προθέρμανσης/«στρωσίματος» ώστε οι μετρήσεις να σταθεροποιηθούν.​

Μετά από μακρά αποθήκευση προτείνεται να μείνει αναμμένος 24–48 ώρες, ενώ σε επόμενες χρήσεις συνήθως αρκούν λίγα λεπτά (π.χ. 5–10) μέχρι να σταθεροποιηθούν οι ενδείξεις.

Παρακάτω θα διασυνδέσουμε τον αισθητήρα αλκόολης MQ3 με την αναπτυξιακή πλακέτα που έχουμε παρουσιάσει σε άλλο μέρος και ακολουθούμε τις ακόλουθες πειραματικές διαδικασίες.

Στο πρώτο μας πείραμα, θα διαβάσουμε την αναλογική έξοδο για να μετρήσουμε τη συγκέντρωση αλκοόλης και να εκτιμήσουμε το επίπεδο μέθης.

Ας συνδέσουμε τον αισθητήρα αλκοόλης MQ3 στο αναπτυξιακό σύστημα Arduino. Ξεκινάμε συνδέοντας το pin VCC του αισθητήρα στο pin 5V του Arduino και το pin GND του αισθητήρα στη γείωση (Ground) του Arduino. Τέλος, σύνδεσε το pin εξόδου A0 του αισθητήρα MQ3 στο αναλογικό pin (A0) του Arduino.

Ο παρακάτω πίνακας δείχνει τη συνδεσμολογία.

Εύρεση τιμών κατωφλίου (threshold values). Για να εκτιμήσεις το επίπεδο μέθης, χρειάζεται να καταγράψεις τις τιμές που δίνει ο αισθητήρας όταν φυσάς πάνω του πριν και μετά την κατανάλωση αλκοόλ.

Απλώς τρέξε το παρακάτω sketch και πάρε τις μετρήσεις σου.

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

#define MQ3pin A0

float sensorValue;  // μεταβλητή για την αποθήκευση της τιμής του αισθητήρα

void setup() {
  lcd.begin(20, 4); // αρχικοποιεί την μολάδα απεικόνισης lcd
  lcd.setCursor(0,0);  // τοποθετεί τον κέρσορα στην πάνω αριστερή γωνία
  lcd.print("MQ3 warming up!");
  delay(20000); // επιτρέπει στον αισθητήρα MQ3 να προθερμανθεί
  lcd.clear();
}

void loop() {
  sensorValue = analogRead(MQ3pin); // διαβάζει την αναλογική είσοδο Α0

  lcd.clear(); // καθαρίζει την μονάδα απεικόνισης
  lcd.setCursor(0, 0);  // τοποθετεί τον κέρσορα στην πάνω αριστερή γωνία
  lcd.print("Sensor Value: ");
  lcd.print(sensorValue); // εμφανίζει την τιμή της αναλογικής εισόδου
	
  delay(2000); // παύση 2s για την επόμενη μέτρηση
}

Σημείωση: Αν δεν επιτρέπεται νομικά να καταναλώσεις αλκοολούχα ποτά, χρησιμοποίησε ένα μπουκάλι ισοπροπυλικής αλκοόλης ή ένα μπουκάλι αντισηπτικού χεριών για τις δοκιμές. Μην βάλεις αλκοόλ πάνω στον αισθητήρα. Απλώς πίεσε το μπουκάλι ώστε οι ατμοί αλκοόλης να εισέλθουν στον αισθητήρα και πάρε τις μετρήσεις.

Όταν τρέξεις το sketch, θα πρέπει να δεις μετρήσεις παρόμοιες με τις παρακάτω:

  • Απουσία αλκοόλ (περίπου 120)
  • Παρουσία αλκοόλ (περίπου 500)

Αυτή η δοκιμή μπορεί να απαιτήσει λίγη δοκιμή-και-λάθος. Μόλις έχεις τις μετρήσεις, μπορείς να τις χρησιμοποιήσεις ως “κατώφλι” για να ενεργοποιήσεις κάποια ενέργεια.

Κώδικας Arduino

Το παρακάτω sketch εκτιμά το επίπεδο μέθης με βάση τα εξής κατώφλια:

  • <120: νηφάλιος
  • 120–400: έχει πιει — αλλά εντός νομικών ορίων
  • >400: μεθυσμένος
#include <LiquidCrystal.h> //Συμπερίληψη βιβλιοθήκης για το LCD
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // δημιουργία αντικειμένου lcd

/* Αντικατέστησε τις ακόλουθες τιμές με τα δικά σου δεδομένα */
#define Sober 120   // ορισμός της μέγιστης τιμής που θεωρείται νηφάλιος
#define Drunk 400   // ορισμός της ελάχιστης τιμής που θεωρείται μεθυσμένος

#define MQ3pin A0

float sensorValue;  //μεταβλητή για αποθήκευση της τιμής του αισθητήρα

void setup() {
  lcd.begin(20,4); // αρχικοποιεί την μονάδα απεικόνισης
  lcd.print("MQ3 warming up!");
  delay(20000); // επιτρέπει στον αισθητήρα MQ3 να προθερμανθεί
}

void loop() {
  sensorValue = analogRead(MQ3pin); // διαβάζει την αναλογική είσοδο Α0

  lcd.clear(); // καθαρίζει την μονάδα απεικόνισης
  lcd.setCursor(0, 0);

  lcd.print("Sensor Value: ");
  lcd.print(sensorValue); // εμφανίζει την τιμή της μεταβλητής sensorValue
  lcd.setCursor(0, 1);  // τοποθετεί τον κέρσορα στη θέση (0,1)
	
  // Απεινονίζει την κατάσταση ενός ατόμου σε συγκέντροη αλκόολ
  if (sensorValue < Sober) {
     lcd.print("Stone Cold Sober");
  } else if (sensorValue >= Sober && sensorValue < Drunk) {
     lcd.print("Drinking but");
     lcd.setCursor(0, 2);
     lcd.print("within legal limits");
  } else {
    lcd.print("DRUNK");
  }
	
delay(2000); // παύση 2s για την επόμενη μετρηση
}

Αν όλα είναι σωστά, θα πρέπει να δεις κάτι παρόμοιο στη μονάδα απεικόνισης.

Στο δεύτερο πείραμα, θα χρησιμοποιήσουμε την ψηφιακή έξοδο για να ανιχνεύσουμε την παρουσία αλκοόλης.

Θα επαναχρησιμοποιήσουμε το κύκλωμα του προηγούμενου πειράματος. Απλώς αποσύνδεσε τη σύνδεση προς το pin του ADC (A0) και σύνδεσε το pin D0 της μονάδας στο ψηφιακό pin #8 του Arduino.

Ο παρακάτω πίνακας δείχνει τη συνδεσμολογία.

Ρύθμιση κατωφλίου: Η μονάδα έχει ενσωματωμένο ποτενσιόμετρο για να ορίσεις ένα κατώφλι συγκέντρωσης αλκοόλ, πάνω από το οποίο η μονάδα δίνει έξοδο LOW και ανάβει το Status LED.

Για να ρυθμίσεις το κατώφλι, άφησε τους ατμούς αλκοόλης να μπουν στον αισθητήρα και γύρισε το ποτενσιόμετρο δεξιόστροφα μέχρι να ανάψει το Status LED. Έπειτα, γύρισέ το λίγο πίσω αριστερόστροφα μέχρι μόλις να σβήσει το LED. Αυτό ήταν· η μονάδα σου είναι πλέον έτοιμη για χρήση.

Κώδικας Arduino

Τώρα, ανέβασε (upload) το παρακάτω sketch στο Arduino σου.

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

#define MQ3pin 8

int sensorValue;  //μεταβλητή για την αποθήκευση της τιμής του αισθητήρα

void setup() {
  pinMode(MQ3pin, INPUT);
  lcd.begin(20,4); // αρχικοποιεί την μονάδα απεικόνισης
  lcd.print("MQ3 warming up!");
  delay(20000); // επιτρέπει στον αισθητήρα MQ3 να προθερμανθεί
}

void loop() {
  sensorValue = digitalRead(MQ3pin); // διαβάζει την ψηφιακή εξοδο του MQ3pin
	
  lcd.clear(); // καθαρίζει την μονάδα απεικόνισης
  lcd.setCursor(0,0); // τοποθετεί τον κερσορα στην πάνω αριστερή γωνία
  
  lcd.print("Digital Output: ");
  lcd.print(sensorValue); // εμφανίζει την ψηφια κή τιμή του MQ3pin
  lcd.setCursor(0,1);
	
  // καθορίζει την κατάσταση
  if (sensorValue) {
     lcd.print("Alcohol: -");
     } else {
	lcd.print("Alcohol: Detected!");
     }
	
     delay(2000); // περιμένει 2s για το επόμενο διάβασμα
}

Αν όλα είναι σωστά, θα πρέπει να δεις κάτι παρόμοιο στη μονάδα απεικόνισης.

Η προηγούμενη εικόνα δείχνει την μονάδα απεικόνισης όταν έχουμε απουσία αλκόολ, ενώ η επόμενη εικόνα είναι όταν έχουμε παρουσία αλόολ.