Μέτρηση περιβαλλοντικών μεγεθών με τον αισθητήρα BME680

Με τη βοήθεια του αισθητήρα ΒΜΕ680 μπορούμε να έχουμε μια ένδειξη για την ποιότητα αέρα μέσα στο σπίτι, στις αίθουσες σχολείων, στους χώρους εργασίας κ.ά. Επίσης με τον ίδιο αισθητήρα, μπορούμε να μετρήσουμε την θερμοκρασία, την ατμοσφαιρική πίεση, την υγρασία και όλα αυτά με την διασύνδεση του ΒΜΕ680 με την πλατφόρμα Arduino.

Ο ΒΜΕ680 μπορεί να μετρήσει την ποιότητα αέρα χρησιμοποιώντας την ιδιότητα ενός metal-oxide τμήματος που όταν βρίσκεται στην κατάλληλη θερμοκρασία αλλάζει αντίσταση ανάλογα με την συγκέντρωση του οργανικού αερίου γύρω του. Έτσι μπορεί να ανιχνεύσει οργανικά αέρια όπως βενζόλιο, αιθυλενογλυκόλη, φορμαλδεΰδη, μεθυλενοχλωρίδιο, τετραχλωροαιθυλένιο, τολουέλιο, ξυλόλιο, 1,3-βουταδιένιο και μονοξείδιο του άνθρακα, κ.ά.

Όπως στους περισσότερους αισθητήρες αερίων, ο ΒΜΕ680 μπορεί να ανιχνεύσει την ύπαρξη αερίων χωρίς να μπορεί να δείξει ποιο είναι ποιο. Αυτό που δείχνει είναι η αντίσταση μέσα στον αισθητήρα, η οποία είναι ανάλογη με την συγκέντρωση των αερίων που αναφέραμε παραπάνω.

Ο αισθητήρας ΒΜΕ680 μετρά υγρασία με ακρίβεια ±3%, βαρομετρική πίεση με απόλυτη ακρίβεια ±1hPa και θερμοκρασία με ακρίβεια ±1,0 0C. Η μέτρηση της πίεσης είναι τόσο ακριβής ώστε να έχουμε μέτρηση του υψόμετρου με ακρίβεια ±1μέτρα.

Συγκεκριμένα:

  • Θερμοκρασία  -40 0C έως  85 0C
  • Υγρασία 0 έως 100% RH με ±3% ακρίβεια
  • Πίεση 300Pα έως 1100hPα με ±1hPα απόλυτη ακρίβεια
  • Ύψος 0 έως 30,000 πόδια (9,2 Km) με ±1 μέτρα ακρίβεια

Το module με το ΒΜΕ680 που θα χρησιμοποιήσουμε σε αυτή την εργασία μπορείτε να το προμηθευτείτε από το ebay.com αναζητώντας BME680.

Διάταξη ακροδεκτών

Για την επικοινωνία του BME680 με το πρωτόκολλο Ι2C οι ακροδέκτες του αισθητήρα έχουν την ακόλουθη διάταξη:

  • VCC τροφοδοσία του αισθητήρα με τάση 5V
  • GND σύνδεση με την γείωση της τάσης τροφοδοσίας
  • SCL ακροδέκτης παλμών σήματος ρολογιού
  • SDA ακροδέκτης δεδομένων
  • SDO με χωρίς σύνδεση επιλέγεται η διεύθυνση 0x77 και με σύνδεση στο GND επιλέγεται η διεύθυνση 0x76
  • CS με σύνδεση στα VCC ενεργοποιείται ο αισθητήρας.

Διαχείριση τροφοδοσίας

Πάνω στο module υπάρχει το XC6206 που αποτελεί ένα 3,3V σταθεροποιητή τάσης ακριβείας και ένα τσιπ για μετατόπιση επιπέδου τάσης και έτσι μπορούμε να χρησιμοποιήσουμε το module με τάσεις 3,3V και 5V χωρίς να ανησυχούμε για την ορθή τροφοδοσία τάσης.

Το ΒΜΕ680 καταναλώνει λιγότερο από 1mA κατά την διάρκεια των μετρήσεων και μόνο 0,15μΑ κατά την διάρκεια αδράνειας. Αυτή η μειωμένη κατανάλωση ρεύματος το κάνει ιδανικό σε κατασκευές που τροφοδοτούνται με μπαταρία.

Ψηφιακή διεπαφή

Ο αισθητήρας ΒΜΕ680 μπορεί να επικοινωνεί με τις εξωτερικές συσκευές χρησιμοποιώντας ένα από τα πρωτόκολλα I2C και SPI. Σε αυτό το προτζεκτ θα χρησιμοποιήσουμε το προτόκολλο I2C.

Όταν ο αισθητήρας χρησιμοποιεί την διεπαφή I2C για επικοινωνία με το Arduino, μπορούμε να ορίσουμε δυο ξεχωριστές διευθύνσεις τις 0x76 και 0x77. Αυτό επιτρέπει να χρησιμοποιηθούν δυο BME680 στον ίδιο δίαυλο χωρίς σύγκρουση δεδομένων.

Το pin SDO καθορίζει την διεύθυνση του module. Αυτό το pin έχει μια pull-up αντίσταση. Όταν αφήσουμε το SDO ασύνδετο, η διεύθυνση του module είναι 0x77 και αν το συνδέσουμε στο GND, η διεύθυνση του module γίνεται 0x76.

Διασύνδεση του αισθητήρα με την αναπτυξιακή πλακέτα Arduino nano

Σε αυτό το πρότζεκτ διασυνδέουμε το module BME680 με την αναπτυξιακή πλακέτα Arduino Nano που παρουσιάσαμε σε άλλο άρθρο, για να μετρήσουμε τα μεγέθη της θερμοκρασίας, της ατμοσφαιρικής πίεσης, της υγρασίας και την ύπαρξη οργανικών αερίων. Διασυνδέουμε τους ακροδέκτες του αισθητήρα ως εξής:

  • Τον ακροδέκτη Vcc του module με την τάση 5V
  • Τον ακροδέκτη GND του module με τα 0V
  • Τον ακροδέκτη SCL του module με εκείνο της αναπτυξιακής πλακέτας
  • Τον ακροδέκτη SDA του module με εκείνο της αναπτυξιακής πλακέτας
  • Τον SDO ασύνδετο για να έχουμε διεύθυνση 0x77, ενώ όταν είναι συνδεμένο με το GND έχουμε διεύθυνση 0x76
  • Τον ακροδέκτη CS τον συνδέουμε με τάση 5V για ενεργοποίηση του module

Προετοιμασία του BME680 για χρήση

Όταν χρησιμοποιούμε τον αισθητήρα για πρώτη φορά, συνίσταται να δουλέψει για 48 ώρες την πρώτη φορά και μετά για 30 λεπτά κάθε φορά πριν χρησιμοποιήσουμε τον BME680.

Εγκατάσταση βιβλιοθηκών

Για να ξεκινήσουμε να διαβάζουμε δεδομένα από τον αισθητήρα, θα πρέπει πρώτα να έχουμε εγκαταστήσει την βιβλιοθήκη Adafruit_BME680. Για να εγκαταστήσουμε τις βιβλιοθήκες που χρειάζονται στο περιβάλλον Arduino IDE 2.3.3 ακολουθούμε τα ακόλουθα βήματα:

Από το menu του Arduino IDE επιλέγουμε: Sketch>Include Library…>Manage Libraries… ή διαφορετικά κάνουμε κλικ στο εικονίδιο με τα βιβλία στην αριστερή πλευρά του παραθύρου. Αριστερά εμφανίζεται το παράθυρο του LIBRARY MANAGER όπως φαίνεται στο ακόλουθο σχήμα:

Αφού πληκτρολογήσουμε στο πεδίο κειμένου την επιλογή Adafruit bme680 παρουσιάζεται από κάτω η βιβλιοθήκη που θέλουμε να εισάγουμε. Κάνουμε κλικ στο κουμπί INSTALL για να την ενσωματώσουμε. Ταυτόχρονα στο κέντρο εμφανίζεται το ακόλουθο πλαίσιο διαλόγου που μας ζητά να εγκαταστήσουμε βοηθητικές βιβλιοθήκες. Κάνουμε κλικ στο κουμπί INSTALL ALL.

Μετά την διασύνδεση του module BME680 με την αναπτυξιακή πλακέτα και την εγκατάσταση των βιβλιοθηκών, ανεβάζουμε τον ακόλουθο κώδικα:

#include <LiquidCrystal.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
#define SEALEVELPRESSURE_HPA (1013.25)
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
Adafruit_BME680 bme;
void setup() {
  lcd.begin(20, 4); 
  lcd.clear();
  lcd.setCursor(0, 0);
  if (!bme.begin(0x76)) {
    lcd.print("Cannot find a BME680");
    while (1);
  }
  bme.setTemperatureOversampling(BME680_OS_8X);
  bme.setHumidityOversampling(BME680_OS_2X);
  bme.setPressureOversampling(BME680_OS_4X);
  bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
  bme.setGasHeater(320, 150); // 320*C for 150 ms
}

void loop() {
   if (! bme.performReading()) {
    lcd.clear();
    lcd.print("Failed");
    return;
  }
  
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temperat:");
  lcd.print((int8_t)bme.temperature);
  lcd.print(" *C");
  lcd.setCursor(0, 1);
  lcd.print("Pressure:");
  lcd.print(bme.pressure / 100.0);
  lcd.print(" hPa");
  lcd.setCursor(0, 2);
  lcd.print("Humidity:");
  lcd.print((int8_t)bme.humidity);
  lcd.print("%");
  lcd.setCursor(0, 3);
  lcd.print("Gas:     ");
  lcd.print(bme.gas_resistance / 1000.0);
  lcd.print("KOhms");

  delay(2000);
}

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

Αυτό το sketch περιλαμβάνει τις αναγκαίες βιβλιοθήκες τις LiquidCrystal.h (για απεικόνιση δεδομένων στο LCD με παράλληλη διασύνδεση), Wire.h (για το πρωτόκολλο I2C) και τις Adafruit_Sensor.h καθώς και Adafruit_BME680.h

#include <LiquidCrystal.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"

Αυτό το sketch χρησιμοποιεί την διεπαφή επικοινωνίας I2C. Η επόμενη γραμμή δημιουργεί ένα αντικείμενο Adafruit_BME680 με όνομα bme αρχικοποιημένο με τα Arduino I2C pins.

Adafruit_BME680 bme;

Στη συνάρτηση setup αρχικοποιούμε την επικοινωνία του Arduino με το LCD module καθώς και με το BME680 module με τις ακόλουθες γραμμές κώδικα.

lcd.begin(20, 4); 
lcd.clear();
lcd.setCursor(0, 0);
if (!bme.begin(0x76)) {
   lcd.print("Cannot find a BME680");
   while (1);
}

Στην συνέχεια ορίζουμε μερικές παραμέτρους για τον αισθητήρα:

bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
bme.setPressureOversampling(BME680_OS_4X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
bme.setGasHeater(320, 150); // 320*C for 150 ms

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

Οι ακόλουθες τρεις συναρτήσεις ορίζουν την πολλαπλή δειγματοληψία για τη θερμοκρασία, υγρασία και πίεση αντίστοιχα:

setTemperatureOversampling(uint8_t os)
setPressureOversampling(uint8_t os)
setHumidityOversampling(uint8_t os)

Αυτές οι συναρτήσεις δέχονται  μια από τις ακόλουθες παραμέτρους:

  • BME680_OS_NONE
  • BME680_OS_1X
  • BME680_OS_2X
  • BME680_OS_4X
  • BME680_OS_8X
  • BME680_OS_16X

Στο BME680 module υλοποιείται εσωτερικά ένα IIR filter για την μείωση του θορύβου στις τιμές εξόδου του αισθητήρα. Η συνάρτηση

setIIRFilterSize()

υλοποιεί το φίλτρο. Το φίλτρο μπορεί να διαμορφωθεί με διάφορους συντελεστές επιλέγοντας μια από τις ακόλουθες παραμέτρους:

  • BME680_FILTER_SIZE_0
  • BME680_FILTER_SIZE_1
  • BME680_FILTER_SIZE_3
  • BME680_FILTER_SIZE_7
  • BME680_FILTER_SIZE_15
  • BME680_FILTER_SIZE_31
  • BME680_FILTER_SIZE_63
  • BME680_FILTER_SIZE_127

Επιπρόσθετα ο αισθητήρας αερίων μπορεί να αρχικοποιηθεί πριν την χρήση του με την συνάρτηση:

setGasHeater(heaterTemp, heaterTime)

όπου οι παράμετροι ορίζονται ως εξής:

  • heaterTemp – Η θερμοκρασία του θερμαντικού στοιχείου σε βαθμούς Κελσίου
  • heatTime – Ο χρόνος θέρμανσης του στοιχείου σε milliseconds

Για παράδειγμα bme.setGasHeater(320, 150) θα θερμάνει τον αισθητήρα στους 3200C για 150 milliseconds

Μέσα στη συνάρτηση loop καλούμε την συνάρτηση bme.performReading() για το διάβασμα των στοιχείων των μεταβλητών. Μετά την κλίση αυτής της συνάρτησης χρησιμοποιούμε τον τελεστή τελεία “.” Για να πάρουμε τις τιμές των μεγεθών.

bme.temperature δίνει την τιμή της θερμοκρασίας
bme.pressure δίνει την τιμή της βαρομετρικής πίεσης
bme.humidity δίνει την σχετική τιμή της υγρασίας
bme.gas_resistance δίνει την τιμή της αντίστασης του αισθητήρα αερίων

Στο τμήμα του κώδικα, που βρίσκεται μέσα στην συνάρτηση loop(), απεικονίζονται τα μεγέθη στο LCD, αφού πρώτα υπολογιστούν οι τιμές της θερμοκρασίας, της πίεσης, της υγρασίας, και της αντίστασης του αισθητήρα αερίων.