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

Περιγραφή του αισθητήρα ΒΜΕ680
Ο ΒΜΕ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.
Διαχείριση τροφοδοσίας
Πάνω στο module υπάρχει το XC6206 που αποτελεί ένα 3,3V σταθεροποιητή τάσης ακριβείας και ένα τσιπ για μετατόπιση επιπέδου τάσης και έτσι μπορούμε να χρησιμοποιήσουμε το module με τάσεις 3,3V και 5V χωρίς να ανησυχούμε για την ορθή τροφοδοσία τάσης.

Το ΒΜΕ680 καταναλώνει λιγότερο από 1mA κατά την διάρκεια των μετρήσεων και μόνο 0,15μΑ κατά την διάρκεια αδράνειας. Αυτή η μειωμένη κατανάλωση ρεύματος το κάνει ιδανικό σε κατασκευές που τροφοδοτούνται με μπαταρία.
Ψηφιακές διεπαφές
Ο αισθητήρας ΒΜΕ680 μπορεί να επικοινωνεί με τις εξωτερικές συσκευές χρησιμοποιώντας ένα από τα πρωτόκολλα I2C και SPI. Σε αυτό το προτζεκτ θα χρησιμοποιήσουμε το προτόκολλο I2C.
Διεπαφή I2C
Όταν ο αισθητήρας χρησιμοποιεί την διεπαφή I2C για επικοινωνία με το Arduino. Υποστηρίζει δύο ξεχωριστές διευθύνσεις I2C: 0x77 και 0x76. Αυτό επιτρέπει να χρησιμοποιηθούν δυο BME680 στον ίδιο δίαυλο χωρίς σύγκρουση δεδομένων.

Το pin SDO καθορίζει την διεύθυνση I2C του module. Αυτό το pin έχει μια pull-up αντίσταση. Όταν αφήσουμε το SDO ασύνδετο, η διεύθυνση του module είναι 0x77 και αν το συνδέσουμε στο GND, η διεύθυνση του module γίνεται 0x76.
Διεπαφή SPI
Ο αισθητήρας μπορεί επίσης να επικοινωνεί μέσω της διεπαφής SPI.
Σημείωση: Αν πρέπει να επιλέξεις ανάμεσα στα δύο, το SPI είναι γενικά η καλύτερη επιλογή αν χρειάζεσαι μεγαλύτερες ταχύτητες μεταφοράς (έως 10 MHz). Το I2C, από την άλλη, είναι καλύτερο αν έχεις περιορισμένες διαθέσιμες ακίδες στον μικροελεγκτή σου.
Διάταξη ακροδεκτών του αισθητήρα
Για την επικοινωνία του BME680 με το πρωτόκολλο Ι2C οι ακροδέκτες του αισθητήρα έχουν την ακόλουθη διάταξη:

Ακροδέκτες τροφοδοσίας
Το Vcc είναι ο ακροδέκτης τροφοδοσίας. Μπορείς να τον συνδέσεις στην έξοδο 5V του Arduino σου.
Το GND είναι η κοινή γείωση για τροφοδοσία και λογική.
Ακροδέκτες πρωτοκόλλου SPI:
Το SCL είναι ο ακροδέκτης ρολογιού SPI, είναι είσοδος προς το chip.
Το SDA είναι το Serial Data In (SDI/MOSI), για δεδομένα που στέλνονται από τον μικροελεγκτή σου προς τον BME680.
Το SDO είναι το Serial Data Out (SDO/MISO), για δεδομένα που στέλνονται από τον BME680 προς τον μικροελεγκτή σου.
Το CS είναι ο ακροδέκτης Chip Select, τράβηξέ τον στο LOW για να ενεργοποιήσεις επικοινωνία SPI. Αν θέλεις να συνδέσεις πολλαπλούς BME680 σε έναν μικροελεγκτή, μπορούν να μοιράζονται τα pins SDI, SDO και SCK, ενώ σε κάθε έναν αποδίδεις ένα μοναδικό CS pin.
Ακροδέκτες πρωτοκόλλου I2C:
Το SCL είναι επίσης ο ακροδέκτης ρολογιού I2C, σύνδεσέ τον στη γραμμή ρολογιού I2C του μικροελεγκτή σου.
Το SDA είναι επίσης ο ακροδέκτης δεδομένων I2C, σύνδεσέ τον στη γραμμή δεδομένων I2C του μικροελεγκτή σου.
Προετοιμασία του 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.

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

Ξεκινούμε συνδέοντας το pin Vcc στην τροφοδοσία 3V ή 5V. Χρησιμοποίησε την ίδια τάση με βάση στην οποία λειτουργεί η λογική του μικροελεγκτή σου. Για τα περισσότερα Arduino, αυτό είναι 5V. Για συσκευές με λογική 3.3V, χρησιμοποίησε 3.3V. στη συνέχεια σύνδεσε το GND στη κοινή γείωση 0V.
Σύνδεσε το pin SCL στο pin ρολογιού I2C και το pin SDA στο pin δεδομένων I2C του Arduino σου. Σημείωσε ότι κάθε πλακέτα Arduino έχει διαφορετικά pins I2C, τα οποία πρέπει να συνδεθούν ανάλογα. Στις πλακέτες Arduino Nano, τα SDA (γραμμή δεδομένων) και SCL (γραμμή ρολογιού) βρίσκονται στα pin αναλογικών εισόδων Α4 (SDA) και Α5 (SCL) αντίστοιχα.
Η διασύνδεση με το πρωτόκολλο I2C γίνεται σύμφωνα με τον ακόλουθο πίνακα:
| Αισθητήρας BME680 | Αναπτυξιακή πλακέτα |
| Vcc | 5V |
| GND | 0V |
| SCL | A5 |
| SDA | A4 |
| SDO | Διεύθυνση 0x76 όταν το SDO είναι ασύνδετο Διεύθυνση 0x77 όταν το SDO είναι συνδεμένο στο GND |
| CS | 5V για ενεργοποίηση του module |
Φόρτωση του προγράμματος στο Arduino
Μετά την διασύνδεση του 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); // pins for RS, E, DB4, DB5, DB6, DB7
Adafruit_BME680 bme(&Wire);
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(&Wire);
Επίσης δημιουργείται ένα αντικείμενο lcd για την επικοινωνία με το lcd display με τον ορισμό των ακροδεκτών του διαύλου, το οποίο γίνεται ως ακολούθως:
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // pins for RS, E, DB4, DB5, DB6, DB7
Στη συνάρτηση 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, αφού πρώτα υπολογιστούν οι τιμές της θερμοκρασίας, της πίεσης, της υγρασίας, και της αντίστασης του αισθητήρα αερίων.
Αν θέλουμε, με την ακόλουθη συνάρτηση μπορούμε να εμφανίζουμε προσεγγιστικά το υψόμετρο:
lcd.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Όμως θα πρέπει προηγουμένως να έχουμε ορίσει μια μεταβλητή με όνομα SEALEVELPRESSURE_HPA. Αυτή η μεταβλητή αποθηκεύει την πίεση στο επίπεδο της θάλασσας σε millibar και χρησιμοποιείται για την εκτίμηση του υψομέτρου για μια δεδομένη πίεση, συγκρίνοντας την με την πίεση στο επίπεδο της θάλασσας. Αυτό το sketch χρησιμοποιεί την προεπιλεγμένη τιμή, αλλά για ακριβή αποτελέσματα αντικατέστησέ την με την τρέχουσα πίεση στο επίπεδο της θάλασσας στην περιοχή σου.
Παράδειγμα: χρήση του BME680 με την διεπαφή SPI
Ο αισθητήρας BME680 υποστηρίζει το πρωτόκολλο επικοινωνίας SPI στις περιβαλλοντικές μετρήσεις. Μπορούμε να χρησιμοποιήσουμε hardware ή software SPI, αλλά συνίσταται η χρήση των hardware SPI pins, για το λόγο της μεγαλύτερης ταχύτητας επικοινωνίας.

Και πάλι, κάθε πλακέτα Arduino έχει διαφορετικά pins SPI, τα οποία πρέπει να συνδεθούν ανάλογα. Για πλακέτες όπως το Nano R4, αυτά τα pins είναι τα ψηφιακά 13 (SCK), 12 (MISO), 11 (MOSI) και 10 (SS). Αν χρησιμοποιείς διαφορετική πλακέτα Arduino, καλό είναι να ελέγξεις την επίσημη τεκμηρίωση για τις θέσεις των SPI pins πριν συνεχίσεις.
Η διασύνδεση με το πρωτόκολλο SPI γίνεται σύμφωνα με τον ακόλουθο πίνακα:
| Αισθητήρας BME680 | Αναπτυξιακή πλακέτα |
| Vcc | 5V |
| GND | 0V |
| SCL | 13/SCK |
| SDA | 11/MOSI |
| SDO | 12/MISO |
| CS | 10/SS |
Φόρτωση του προγράμματος στο Arduino
Μετά την διασύνδεση του module BME680 με την αναπτυξιακή πλακέτα και την εγκατάσταση των βιβλιοθηκών, ανεβάζουμε τον ακόλουθο κώδικα:
#include <LiquidCrystal.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
void setup() {
lcd.begin(20, 4);
lcd.clear();
lcd.setCursor(0, 0);
if (!bme.begin()) {
lcd.print("Cannot find a BME680");
while (1);
}
// Set up oversampling and filter initialization
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"
Με τις επόμενες σταθερές ορίζουμε τους ακροδέκτες του Arduino Nano για την επικοινωνία SPI:
#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10
Αυτό το sketch χρησιμοποιεί την διεπαφή επικοινωνίας SPI για την επικοινωνία με τον αισθητήρα. Η επόμενη γραμμή δημιουργεί ένα αντικείμενο Adafruit_BME680 με όνομα bme αρχικοποιημένο με τα Arduino SPI pins.
Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);
Επίσης δημιουργείται ένα αντικείμενο lcd για την επικοινωνία με το lcd display με τον ορισμό των ακροδεκτών του διαύλου, το οποίο γίνεται ως ακολούθως:
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // pins for RS, E, DB4, DB5, DB6, DB7
Στη συνάρτηση setup αρχικοποιούμε την επικοινωνία του Arduino με το LCD module καθώς και με το BME680 module με τις ακόλουθες γραμμές κώδικα.
lcd.begin(20, 4);
lcd.clear();
lcd.setCursor(0, 0);
if (!bme.begin()) {
lcd.print("Cannot find a BME680");
while (1);
}
Μέσα στη συνάρτηση setup( ) ορίζουμε παραμέτρους και συναρτήσεις για να αυξήσουμε την ακρίβεια των μετρήσεων και να μειώσουμε το θόρυβο και γίνεται με πολλαπλή δειγματολειψία και τον ορισμό της μέσης τιμής. Αυτή η μέθοδος είναι η ίδια με αυτή του προηγούμενου παραδείγματος και δεν υπάρχει λόγος να εξηγηθεί ξανά.
Μέσα στη συνάρτηση loop( ) εκκινούμε την μέτρηση των μεγεθών και στη συνέχεια την εμφάνιση τους στο lcd display με τον ίδιο ακριβώς τρόπο όπως περιγράψαμε στο προηγούμενο παράδειγμα που χρησιμοποιήσαμε την διεπαφή I2C για την επικοινωνία με τον αισθητήρα.