Μετάβαση στο κύριο περιεχόμενο

Αισθητήρας Ατμομετρικής Πίεσης και Θερμοκρασίας BMP180 με Arduino

 Αισθητήρας Ατμομετρικής Πίεσης και Θερμοκρασίας BMP180 με Arduino

Οδηγός για τη διασύνδεση της μονάδας BMP180 με το Arduino

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

Καθώς μετακινείστε από το επίπεδο της θάλασσας σε μια κορυφή βουνού, η ατμοσφαιρική πίεση μειώνεται. Μετρώντας αυτήν την αλλαγή, το BMP180 μπορεί να εκτιμήσει το υψόμετρο, καθιστώντας το ιδανικό υψόμετρο για drones, μετεωρολογικά αερόστατα και έργα πλοήγησης σε εξωτερικούς χώρους. Δεδομένου ότι η ατμοσφαιρική πίεση επηρεάζεται επίσης από τις καιρικές συνθήκες, αυτός ο αισθητήρας μπορεί να βοηθήσει στην ανίχνευση τάσεων στην ατμοσφαιρική πίεση, καθιστώντας τον χρήσιμο για την παρακολούθηση και την πρόγνωση του καιρού.

Επισκόπηση υλικού

Στην καρδιά της μονάδας βρίσκεται ο BMP180, ένας ψηφιακός αισθητήρας βαρομετρικής πίεσης και θερμοκρασίας επόμενης γενιάς που δημιουργήθηκε από την Bosch Sensortec.



Τσιπ BMP180

Εσωτερικά, ο αισθητήρας BMP180 περιέχει τρία κύρια εξαρτήματα:

Ένας αισθητήρας πίεσης MEMS

Ένας αναλογικός-ψηφιακός μετατροπέας (ADC) που μετατρέπει τις μετρήσεις πίεσης σε ψηφιακές τιμές.

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

Το BMP180 μετρά την ατμοσφαιρική πίεση μεταξύ 300 hPa και 1100 hPa (καλύπτοντας υψόμετρα από 9000 μέτρα πάνω από την επιφάνεια της θάλασσας έως 500 μέτρα κάτω από την επιφάνεια της θάλασσας). Έχει ανάλυση 0,01 hPa και τυπική απόλυτη ακρίβεια ±1 hPa.

Ο αισθητήρας μπορεί να μετρήσει θερμοκρασίες που κυμαίνονται από -40°C έως 85°C με ανάλυση 0,1°C και ακρίβεια περίπου ±1,0°C.

Απαιτήσεις ισχύος

Η μονάδα περιλαμβάνει έναν ενσωματωμένο ρυθμιστή τάσης LM6206, ο οποίος της επιτρέπει να λειτουργεί με μικροελεγκτές λογικής 3.3V και 5V. Αυτό σημαίνει ότι μπορείτε να τη χρησιμοποιήσετε με ασφάλεια με κοινούς μικροελεγκτές όπως το Arduino ή το Raspberry Pi χωρίς να χρειάζεστε πρόσθετους μετατροπείς τάσης.

Ρυθμιστής Μονάδας 3V3 BMP180

Ο BMP180 είναι ένας αισθητήρας χαμηλής ισχύος, που καταναλώνει περίπου 3 έως 5 µA κατά την κανονική λειτουργία. Λόγω αυτής της χαμηλής κατανάλωσης ενέργειας, είναι ιδανικός για έργα που τροφοδοτούνται από μπαταρία και φορητές συσκευές.

Διεπαφή I2C

Το BMP180 επικοινωνεί με μικροελεγκτές χρησιμοποιώντας το πρωτόκολλο I2C. Λάβετε υπόψη ότι η διεύθυνση I2C του BMP180 έχει οριστεί σε 0x77 , κάτι που είναι σημαντικό κατά τη σύνταξη κώδικα για επικοινωνία με τον αισθητήρα.

Τεχνικές προδιαγραφές

Ακολουθούν οι πλήρεις προδιαγραφές:

Τροφοδοτικό 3,3V έως 5,5V

Τρέχουσα ~3 έως 5µA

Εύρος μέτρησης πίεσης 300 έως 1100 hPa

Απόλυτη ακρίβεια πίεσης ±1 hPa

Εύρος θερμοκρασίας -40˚C έως +85˚C

Ακρίβεια θερμοκρασίας ±1˚C

Για πιο λεπτομερείς πληροφορίες, μπορείτε να ανατρέξετε στο φύλλο δεδομένων του αισθητήρα.

Φύλλο δεδομένων BMP180

Σύνδεση μονάδας BMP180

Η μονάδα BMP180 έχει μόνο τέσσερις ακίδες:

Σύνδεση μονάδας BMP180

VCC χρησιμοποιείται για την παροχή ρεύματος στη μονάδα. Μπορεί να λειτουργήσει με τάση μεταξύ 3,3V και 5V.

GND είναι ο πείρος (υποδοχή) γείωσης.

SCL είναι ένας σειριακός ακροδέκτης ρολογιού για τη διεπαφή I2C.

SDA  είναι ένας σειριακός ακροδέκτης δεδομένων για τη διεπαφή I2C.

Καλωδίωση μονάδας BMP180 σε Arduino

Ας συνδέσουμε τη μονάδα BMP180 σε ένα Arduino! Η διαδικασία καλωδίωσης είναι απλή και απαιτεί μόνο λίγα βήματα.


Αρχικά, συνδέστε τον ακροδέκτη VIN στην έξοδο 5V του Arduino και τον ακροδέκτη GND στη γείωση του Arduino.

Στη συνέχεια, πρέπει να συνδέσουμε τις ακίδες που χρησιμοποιούνται για την επικοινωνία I2C. Είναι σημαντικό να γνωρίζουμε ότι διαφορετικές πλακέτες Arduino έχουν διαφορετικές ακίδες I2C και αυτές πρέπει να συνδεθούν σωστά. Στις πλακέτες Arduino με διάταξη R3, οι ακίδες SDA και SCL βρίσκονται επίσης στις κεφαλίδες των ακίδων κοντά στην ακίδα AREF. Ωστόσο, εσωτερικά, είναι ίδιες με τις ακίδες A4 (SDA) και A5 (SCL).

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

Μονάδα BMP180 Arduino

VCC 5V

GND Γείωση

SCL        SCL ή A5

SDA      SDA ή A4

Ανατρέξτε στην παρακάτω εικόνα για να δείτε τη σωστή ρύθμιση καλωδίωσης.




Καλωδίωση μονάδας BMP180 με Arduino

Εγκατάσταση απαραίτητων βιβλιοθηκών

Πριν ξεκινήσετε την ανάγνωση δεδομένων από τον αισθητήρα BMP180, πρέπει να εγκαταστήσετε τη βιβλιοθήκη Adafruit BMP180. Είναι διαθέσιμη στον διαχειριστή βιβλιοθηκών Arduino.

Για να εγκαταστήσετε τη βιβλιοθήκη,

Αρχικά, ανοίξτε το πρόγραμμα Arduino IDE. Στη συνέχεια, κάντε κλικ στο εικονίδιο Library Manager στην αριστερή πλαϊνή μπάρα.

Πληκτρολογήστε " bmp180 " στο πλαίσιο αναζήτησης για να φιλτράρετε τα αποτελέσματά σας.

Αναζητήστε τη Βιβλιοθήκη Adafruit BMP085 από την Adafruit .

Κάντε κλικ στο κουμπί Εγκατάσταση για να το προσθέσετε στο Arduino IDE σας.

Εγκατάσταση βιβλιοθήκης arduino bmp180

Δεδομένου ότι η βιβλιοθήκη Adafruit BMP085 βασίζεται σε άλλες βιβλιοθήκες για να λειτουργήσει, θα σας ζητηθεί να εγκαταστήσετε τις εξαρτήσεις της, οι οποίες περιλαμβάνουν το Adafruit Unified Sensor Driver και τη βιβλιοθήκη Adafruit Bus IO .



Όταν εμφανιστεί αυτό το μήνυμα, απλώς κάντε κλικ στην επιλογή ΕΓΚΑΤΑΣΤΑΣΗ ΟΛΩΝ για να βεβαιωθείτε ότι όλα έχουν ρυθμιστεί σωστά.


Εγκατάσταση εξαρτήσεων adafruit busio unifiedsensor

Κώδικας Arduino – Ανάγνωση Θερμοκρασίας και Βαρομετρικής Πίεσης

Αυτό το βασικό πρόγραμμα δείχνει πώς να διαβάσετε τον αισθητήρα BMP180. Με αυτό το πρόγραμμα, μπορείτε να κατασκευάσετε τον δικό σας μετεωρολογικό σταθμό που όχι μόνο σας ενημερώνει για τη θερμοκρασία και την ατμοσφαιρική πίεση, αλλά μπορεί επίσης να εκτιμήσει το υψόμετρο σας πάνω από την επιφάνεια της θάλασσας!


#include <Wire.h>

#include <Adafruit_BMP085.h>

#define seaLevelPressure_hPa 1013.25


Adafruit_BMP085 bmp;


void setup() {

  Serial.begin(9600);

  if (!bmp.begin()) {

    Serial.println("Could not find a valid BMP085 sensor, check wiring!");

    while (1) {}

  }

}


void loop() {

  Serial.print("Temperature = ");

  Serial.print(bmp.readTemperature());

  Serial.println(" *C");


  Serial.print("Pressure = ");

  Serial.print(bmp.readPressure());

  Serial.println(" Pa");


  Serial.print("Altitude = ");

  Serial.print(bmp.readAltitude());

  Serial.println(" meters");


  Serial.print("Pressure at sealevel (calculated) = ");

  Serial.print(bmp.readSealevelPressure());

  Serial.println(" Pa");


  Serial.print("Real altitude = ");

  Serial.print(bmp.readAltitude(seaLevelPressure_hPa * 100));

  Serial.println(" meters");


  Serial.println();

  delay(500);

}


Αφού ανεβάσετε αυτό το πρόγραμμα στο Arduino σας, μπορείτε να ανοίξετε την Σειριακή Οθόνη. Θα βλέπετε μετρήσεις θερμοκρασίας, πίεσης και υψομέτρου να εμφανίζονται κάθε λίγα δευτερόλεπτα.

έξοδος θερμοκρασίας/πίεσης/υψομέτρου bmp180

Σημείωση: Για πιο ακριβείς μετρήσεις υψομέτρου, φροντίστε να ενημερώσετε τη seaLevelPressure_hPaμεταβλητή με τη σωστή τιμή για την τοποθεσία σας εκείνη την ημέρα.

Επεξήγηση Κώδικα:

Το πρόγραμμα ξεκινά συμπεριλαμβάνοντας δύο σημαντικές βιβλιοθήκες: την Wire.h, η οποία βοηθά το Arduino να επικοινωνεί με τη μονάδα BMP180 χρησιμοποιώντας το πρωτόκολλο I2C, και την Adafruit_BMP085.h, η οποία περιέχει συναρτήσεις για τον έλεγχο της μονάδας BMP180.


#include <Wire.h>

#include <Adafruit_BMP085.h>


Στη συνέχεια, ορίζουμε μια μεταβλητή που ονομάζεται seaLevelPressure_hPaκαι την ορίζουμε σε 1013,25 hPa. Αυτή αντιπροσωπεύει την τυπική ατμοσφαιρική πίεση στο επίπεδο της θάλασσας. Χρειαζόμαστε αυτόν τον αριθμό για να υπολογίσουμε το υψόμετρο με βάση την ατμοσφαιρική πίεση. Να κάτι σημαντικό που πρέπει να γνωρίζετε: Εάν αυτός ο αριθμός είναι απόκλισης μόνο κατά 1 hPa, ο υπολογισμός του υψομέτρου σας μπορεί να είναι λανθασμένος κατά περίπου 8,5 μέτρα! Για καλύτερα αποτελέσματα, θα πρέπει να μάθετε την τρέχουσα πίεση στο επίπεδο της θάλασσας στην περιοχή σας και να ενημερώσετε αυτόν τον αριθμό.


#define seaLevelPressure_hPa 1013.25


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


Adafruit_BMP085 bmp;

Μέσα στη συνάρτηση setup(), αρχικοποιούμε τη σειριακή επικοινωνία με τον υπολογιστή, ώστε να μπορούμε να δούμε τις μετρήσεις του αισθητήρα στην Σειριακή Οθόνη. Στη συνέχεια, καλούμε τη begin()συνάρτηση για να αρχικοποιήσουμε τον αισθητήρα BMP180. Αυτή η συνάρτηση ρυθμίζει την επικοινωνία I2C, επαληθεύει το αναγνωριστικό τσιπ του αισθητήρα, εκτελεί μια μαλακή επαναφορά και περιμένει τη βαθμονόμηση πριν ο αισθητήρας αρχίσει να παρέχει ακριβείς μετρήσεις. Εάν ο αισθητήρας δεν εντοπιστεί, εμφανίζεται ένα μήνυμα σφάλματος στην Σειριακή Οθόνη και το πρόγραμμα σταματά.


Serial.begin(9600);

if (!bmp.begin()) {

    Serial.println("Could not find a valid BMP085 sensor, check wiring!");

    while (1) {}

}

Στη συνάρτηση loop(), χρησιμοποιούμε τις ακόλουθες συναρτήσεις για να διαβάσουμε τον αισθητήρα BMP180.

readTemperature() Η συνάρτηση επιστρέφει τη θερμοκρασία σε βαθμούς Κελσίου.

readPressure() Η συνάρτηση επιστρέφει την ατμοσφαιρική πίεση σε Pascal.

readAltitude(seaLevelPressure_hPa * 100)  Η συνάρτηση υπολογίζει το υψόμετρο σας (σε μέτρα) με βάση την δεδομένη πίεση στην επιφάνεια της θάλασσας (σε hPa).

readSealevelPressure() Η συνάρτηση υπολογίζει την πίεση (σε hPa) στο επίπεδο της θάλασσας από την τρέχουσα τοποθεσία σας.

Serial.print("Temperature = ");

Serial.print(bmp.readTemperature());

Serial.println(" *C");

Serial.print("Pressure = ");

Serial.print(bmp.readPressure());

Serial.println(" Pa");


Serial.print("Altitude = ");

Serial.print(bmp.readAltitude());

Serial.println(" meters");


Serial.print("Pressure at sealevel (calculated) = ");

Serial.print(bmp.readSealevelPressure());

Serial.println(" Pa");


Serial.print("Real altitude = ");

Serial.print(bmp.readAltitude(seaLevelPressure_hPa * 100));

Serial.println(" meters");

Σχόλια

Δημοφιλείς αναρτήσεις από αυτό το ιστολόγιο

Σερβοκινητήρας

  Βασικός έλεγχος σερβομηχανισμού Θα μάθουμε πώς να ελέγχετε έναν τυπικό σερβοκινητήρα, να πηγαίνει εμπρός και πίσω κατά 180 μοίρες, χρησιμοποιώντας ένα «βρόχο for()». Αυτό γίνεται με τη βοήθεια της βιβλιοθήκης Servo, η οποία είναι προεγκατεστημένη βιβλιοθήκη στο Arduino IDE (τόσο εκτός σύνδεσης όσο και σε ηλεκτρονική έκδοση). . Αυτό γίνεται με τη βοήθεια της βιβλιοθήκης  Servo     , η οποία είναι προεγκατεστημένη βιβλιοθήκη στο Arduino IDE (τόσο εκτός σύνδεσης όσο και σε ηλεκτρονική έκδοση).      Χρειαζόμαστε τα παρακάτω:     Arduino IDE Arduino UNO  Σερβοκινητήρας 4,8V - 6V  Καλώδια βραχυκυκλωτήρα. Τυπικοί σερβοκινητήρες Οι τυπικοί σερβοκινητήρες είναι ενεργοποιητές που επιτρέπουν τον ακριβή έλεγχο της θέσης (γωνία). Χαρακτηριστικό  είναι ότι η γωνία του κινητήρα είναι 0 - 180 μοίρες. Με άλλα λόγια, μπορεί να κάνει το μισό μιας περιστροφής. Ένας τυπικός σερβοκινητήρας, όπως και άλλοι κινητήρες, είναι ουσιαστικά απλώς ένας...

Αντιστάσεις pull up, pull down

  Αντιστάσεις pull up (Pull up resistors) Οι αντιστάσεις pull up  είναι πολύ συνηθισμένες όταν χρησιμοποιούνται μικροελεγκτές (MCU) ή οποιαδήποτε συσκευή ψηφιακής λογικής. Θα εξηγήσουμε πότε και πού να χρησιμοποιήσετε αντιστάσεις pull up και, στη συνέχεια, θα κάνουμε έναν απλό υπολογισμό για να δείξουμε γιατί είναι σημαντικά τα pull-ups. Τι είναι μια αντίσταση  Pull up Ας υποθέσουμε ότι έχετε ένα MCU με ένα pin διαμορφωμένο ως είσοδο. Εάν δεν υπάρχει τίποτα συνδεδεμένο με τον ακροδέκτη και το πρόγραμμά σας διαβάζει την κατάσταση του ακροδέκτη, θα είναι ψηλά (τραβηγμένο στο VCC) ή χαμηλό (τραβηγμένο στη γείωση);  Αυτό το φαινόμενο αναφέρεται ως  αιωρούμενο  (floating). Για να αποφευχθεί αυτή η άγνωστη κατάσταση, μια αντίσταση pull-up ή pull-down θα διασφαλίσει ότι η ακίδα βρίσκεται είτε σε υψηλή είτε σε χαμηλή κατάσταση, ενώ χρησιμοποιεί επίσης χαμηλή ποσότητα ρεύματος. Για απλότητα, θα εστιάσουμε στα pull-ups καθώς είναι πιο συνηθισμένα από τα pull-down. Λε...

Φωτοαντιστάτης

int a; // εδώ θα κρατάμε την τιμή που διαβάζουμε από τον φωτοαντιστάτη float b; // εδώ θα αποθηκεύουμε την τάση που έχει ο φωτοαντιστάτης στα άκρα του float c; // εδώ θα αποθηκεύουμε την τιμή της αντίστασης του φωτοαντιστάτη int d; // εδώ θα αποθηκεύσουμε την τιμή-όριο πάνω από την οποία θα ανάβουμε το void setup() { Serial.begin(9600); // ξεκινάμε το σειριακό μόνιτορ του Arduino IDE  d=500; // τιμή πάνω από την οποία θα ανάβουμε το LED pinMode(6, OUTPUT); // το πιν 6 θα είναι ή ΕΞΟΔΟΣ που θα συνδέσουμε το LED } void loop() { a=analogRead(A0); // διάβασε την αναλογική είσοδο A0 και βάλε την τιμή στην a  Serial.print("Τιμή: "); // απεικόνισε την τιμή της a στο σειριακό μόνιτορ του Arduino IDΕ Serial.print(a); Serial.print("\t"); b=a*5.0/1023; // υπολόγισε την τιμή της τάσης στα άκρα του φωτοαντιστάτη Serial.print("Τάση: "); Serial.print(b); // απεικόνισε την τιμή της τάσης Serial.print(" V \t"); c=b*10.0/(5-b); // υπολόγισε την αντίσταση του φωτοα...