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

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

Ο 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 χρησιμοποιείται για να περιγράψει συγκεντρώσεις ατμών αλκοόλ που μπορεί να ανιχνεύσει ή αποκρίνεται ο αισθητήρας.​ Για παράδειγμα, 500 ppm αλκοόλης σημαίνει ότι, αν μπορούσες να μετρήσεις ένα εκατομμύριο μόρια αερίου, τα 500 θα ήταν αλκοόλη και τα υπόλοιπα 999500 θα ήταν άλλα αέρια.

Ο αισθητήρας MQ-3 είναι ένας ημιαγωγικός αισθητήρας αλκοόλης τύπου metal oxide semiconductor (MOS), δηλαδή λειτουργεί ως χημειο-αντίσταση: η αγωγιμότητα του ευαίσθητου υλικού μεταβάλλεται όταν έρθει σε επαφή με ατμούς αλκοόλης.

Η εσωτερική του δομή αποτελείται από έναν μικρο-κεραμικό σωλήνα αλουμίνας (AL2O3), μια ευαίσθητη επίστρωση διοξειδίου του κασσιτέρου (SnO2), ηλεκτρόδια μέτρησης και έναν θερμαντήρα, ενώ συνήθως υπάρχει και μεταλλικό πλέγμα προστασίας γύρω από το στοιχείο για ασφάλεια και μηχανική προστασία. Ο θερμαντήρας είναι κρίσιμος γιατί ανεβάζει το στοιχείο στη σωστή θερμοκρασία λειτουργίας, ώστε η επιφάνεια του SnO2 να αλληλεπιδρά σωστά με τα αέρια.

Σε καθαρό αέρα, τα μόρια οξυγόνου προσροφώνται στην επιφάνεια του SnO2 και “δεσμεύουν” ηλεκτρόνια, δημιουργώντας ζώνη απογύμνωσης και αυξάνοντας την αντίσταση του αισθητήρα. Όταν όμως εμφανιστεί αλκοόλη, αυτή αντιδρά με το προσροφημένο οξυγόνο, απελευθερώνονται ηλεκτρόνια πίσω στο υλικό και η αντίσταση μειώνεται, άρα αλλάζει το σήμα εξόδου.

Έτσι, ο MQ-3 δίνει αναλογική έξοδο που μεταβάλλεται ανάλογα με τη συγκέντρωση αλκοόλης, και στην πράξη χρειάζεται βαθμονόμηση επειδή η ακριβής μέτρηση επηρεάζεται από τη θερμοκρασία, την υγρασία και το φορτίο αντίστασης του κυκλώματος. Στην πράξη ο MQ-3 δεν είναι απόλυτα επιλεκτικός μόνο στην αιθανόλη, γιατί επηρεάζεται και από άλλες πτητικές ουσίες, γι’ αυτό χρειάζεται προθέρμανση, σωστή βαθμονόμηση και λήψη υπόψη παραμέτρων όπως η θερμοκρασία και η υγρασία για πιο αξιόπιστες μετρήσεις.

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

Η τάση αναλογικής εξόδου του αισθητήρα (στο pin A0) μεταβάλλεται ανάλογα με τη συγκέντρωση αλκοόλης. Όσο μεγαλύτερη η συγκέντρωση αλκοόλης στον αέρα, τόσο μεγαλύτερη η τάση εξόδου· όσο μικρότερη η συγκέντρωση, τόσο μικρότερη η τάση εξόδου.

Το μοναδα MQ3 περιλαμβάνει ποτενσιόμετρο για ρύθμιση της ευαισθησίας της ψηφιακής εξόδου (D0). Μπορείς να το χρησιμοποιήσεις για να ορίσεις ένα κατώφλι (threshold), ώστε όταν η συγκέντρωση αλκοόλης ξεπεράσει την τιμή κατωφλίου, το module να δίνει έξοδο LOW, αλλιώς HIGH. Περιστρέφοντας το κουμπί δεξιόστροφα αυξάνεις την ευαισθησία και αριστερόστροφα τη μειώνεις.

  • Τάση λειτουργίας: 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 τροφοδοσίας και κατάστασης για οπτική ένδειξη.​

Επειδή ο MQ3 είναι αισθητήρας με θερμαντικό στοιχείο, η βαθμονόμησή του μπορεί να «ξεφύγει» (drift) αν παραμείνει αποθηκευμένος για μεγάλο χρονικό διάστημα.

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

Μετά από μακρά αποθήκευση προτείνεται να μείνει αναμμένος 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 για το επόμενο διάβασμα
}

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

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