Θέλω να μαζέψω το κάνετε μόνοι σας όργανο μέτρησης της ατμοσφαιρικής πίεσης και της θερμοκρασίας. Ο αισθητήρας θερμοκρασίας πρέπει να είναι απομακρυσμένος και σφιχτός, καθώς πρέπει να μετρά τη θερμοκρασία σε κάποια απόσταση από τη συσκευή. Θα ήθελα να διαθέτω μια τέτοια φορητή συσκευή με εύρος εργασίας από -30 ° C έως 50 ° C. Αλλά αυτό απαιτεί όλα τα εξαρτήματα να μπορούν να λειτουργούν σε αυτό το εύρος θερμοκρασίας. Τα εξαρτήματα που μπορούν να λειτουργούν σε εκτεταμένη κλίμακα θερμοκρασιών είναι πιο ακριβά και είναι πιο δύσκολο να τα αγοράσετε.
Για να εκπληρώσω το όνειρό μου στην πραγματικότητα, θα βοηθήσω το συμβούλιο, το οποίο περιέγραψα στο άρθρο "GY-BMP280-3.3 για τη μέτρηση της βαρομετρικής πίεσης και της θερμοκρασίας».
Από την πρακτική, είναι γνωστό ότι κατά τη συναρμολόγηση και τη διαμόρφωση ηλεκτρονικό πριν από την κατασκευή του, πρέπει να ελέγξετε τη δυνατότητα συντήρησης όλων των υλικών και εξαρτημάτων του καθενός ξεχωριστά. Διαφορετικά, μπορείτε αργότερα να συγχέεται και, ως αποτέλεσμα, το ηλεκτρονικό προϊόν δεν θα λειτουργήσει και θα είναι πολύ δύσκολο να εντοπίσετε την αιτία της δυσλειτουργίας.
Ας ξεκινήσουμε.
Πρώτο στάδιο. Εγκαταστήστε ένα κέλυφος ελεύθερου λογισμικού στον υπολογιστή σας Arduino IDE για να γράψετε προγράμματα (σκίτσα), να τα συντάξετε και στη συνέχεια να τα γράψετε στον μικροελεγκτή Mega328P που είναι εγκατεστημένος στον πίνακα. Σας συνιστούμε να κατεβάσετε την έκδοση shell του ARDUINO 1.6.5. Γιατί; Αρχικά, το έργο ARDUINO ήταν ένα, τώρα οι προγραμματιστές έχουν διασκορπιστεί και συνεχίζουν να αναπτύσσουν το σύστημα ARDUINO, αλλά το καθένα με τον δικό του τρόπο, με μικρές αποχρώσεις. Χρησιμοποίησα την έκδοση ARDUINO 1.6.5. Θα πρέπει να εγκατασταθεί και να δοκιμαστεί για συνεργασία με την πλατφόρμα Arduino Uno χρησιμοποιώντας τα πιο απλά παραδείγματα.
Δεύτερο στάδιο. Ελέγουμε τον πίνακα GY-BMP280-3.3 για τη μέτρηση της βαρομετρικής πίεσης και της θερμοκρασίας. Παίρνουμε 4 καλώδια, συνδέουμε τα GY-BMP280-3.3 και Arduino Uno, όπως φαίνεται στη φωτογραφία και το διάγραμμα. Οι καμπύλες λεπτές πολύχρωμες γραμμές είναι αγωγοί.
Ας αρχίσουμε τον έλεγχο της πλακέτας GY-BMP280-3.3. Για να γίνει αυτό, θα πρέπει να εγκαταστήσετε τη βιβλιοθήκη στο IDE του Arduino, που έχει γραφτεί από προγραμματιστές που εργάζονται στον ιστότοπο. Κατά κανόνα, μετά την εγκατάσταση της βιβλιοθήκης στο IDE του Arduino, εμφανίζονται παραδείγματα (δείγματα) κώδικα. Αλλάζοντας ελαφρώς τον κώδικα δείγματος, μπορούμε να τον συνθέσουμε σε δεδομένα που ο μικροελεγκτής κατανοεί και στη συνέχεια να τα στείλει στη μνήμη του μικροελεγκτή. Μπορείτε να βρείτε ένα παράδειγμα (δείγμα) δίνοντας προσοχή στις δύο φωτογραφίες οθόνης παρακάτω.
Μετά την εγγραφή δεδομένων στον μικροελεγκτή της πλατφόρμας Arduino Uno, αρχίζει άμεσα την εκτέλεση του προγράμματος (κώδικας) και αποστέλλει τα δεδομένα μέσω καλωδίου USB στον υπολογιστή στον οποίο είναι συνδεδεμένος ο πίνακας Arduino Uno.Και μπορούμε να δούμε το αποτέλεσμα μέτρησης της πλακέτας GY-BMP280-3.3 στο παράθυρο Arduino IDE, που ονομάζεται "οθόνη σειριακής θύρας".
Μπορούμε να δούμε το αποτέλεσμα των μετρήσεων στην πλακέτα GY-BMP280-3.3 στο πρότυπο πρόγραμμα Windows Hyper Terminal, μετά το κλείσιμο του κελύφους Arduino Uno και τη ρύθμιση μιας περιόδου λειτουργίας στο πρόγραμμα Hyper Terminal. Δηλαδή, μπορούμε να πάρουμε τα αποτελέσματα της κάρτας GY-BMP280-3.3 συνδέοντας το Arduino Uno με οποιοδήποτε υπολογιστή με καλώδιο USB στο οποίο είναι εγκατεστημένο το πρόγραμμα οδήγησης για το board Arduino Uno. Υπάρχουν πολλές βιβλιοθήκες για εργασία με το GY-BMP280-3.3. Όλα δούλευαν για μένα με τη βιβλιοθήκη. Το αρχείο που κατεβάζετε από αυτόν τον ιστότοπο θα μοιάζει με αυτό: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. Πρέπει να μετονομαστεί ως: zimduino_Pressure_BMP.zip. Τώρα πρέπει να εγκαταστήσουμε τη βιβλιοθήκη του zirduino_Pressure_BMP στο κέλυφος IDE του Arduino.
Ξεκινήστε το IDE του Arduino, μεταβείτε στο μενού Βιβλιοθήκη Sketch / Include Librari / Add.ZIP ... και, στη συνέχεια, επιλέξτε το αρχείο zdudu_Pressure_BMP.zip και κάντε κλικ στο κουμπί Άνοιγμα. Πρέπει επίσης να εγκαταστήσετε τις βιβλιοθήκες:,. Αφού εγκαταστήσουμε τις βιβλιοθήκες, επανεκκινήσαμε το κέλυφος IDE του Arduino, δηλαδή το κλείνουμε και το ξαναρχίζουμε. Στη συνέχεια, επιλέξτε το μενού BMP (Αισθητήρες πίεσης) / παράδειγμα.
Βλέπουμε τον κώδικα στο παράθυρο.
Ο κώδικας θα χρειαστεί να τροποποιηθεί ελαφρώς.
Στην πέμπτη γραμμή, αφαιρέστε δύο πτέρνες "//" και προσθέστε (0x76) ή (0x77) στην ενδέκατη γραμμή. (0x76) είναι η διεύθυνση του πίνακα βαρόμετρου. Η πλακέτα μου GY-BMP280-3.3 που είναι συνδεδεμένη στο δίαυλο I2C αποδείχθηκε ότι έχει την ίδια διεύθυνση (0x76). Πώς να βρείτε τον αριθμό της συσκευής που είναι συνδεδεμένη στο δίαυλο I2C; Θα λάβετε την απάντηση σε αυτή την ερώτηση διαβάζοντας το πλήρες άρθρο.
Έτσι, διορθώσαμε τον κώδικα στο παράθυρο, τώρα αρχίζουμε τον έλεγχο και την κατάρτιση του κώδικα στο μενού Sketch / Check / Compile. Εάν η επαλήθευση και η σύνταξη του κώδικα είναι επιτυχείς, τότε στο μενού Sketch / Load, ξεκινάμε την εγγραφή του προγράμματος στο Arduino Uno.
Εάν η λήψη είναι επιτυχής, ανοίγοντας την οθόνη σειριακής θύρας στο μενού: Εργαλεία / Παρακολούθηση σειριακών θυρών, θα δείτε τα δεδομένα που αποστέλλονται από την κάρτα GY-BMP280-3.3.
Στο παρακάτω στιγμιότυπο οθόνης, το αποτέλεσμα της κάρτας GY-BMP280-3.3 που λειτουργεί σε έναν υπολογιστή στον οποίο δεν έχει εγκατασταθεί το κέλυφος IDE του Arduino. Τα δεδομένα λαμβάνονται από το πρόγραμμα PuTTY.
Παράλληλα, φωτογραφήθηκε ένα εργαστηριακό βαρομετρητή, το οποίο βρισκόταν δίπλα στον πίνακα GY-BMP280-3.3. Συγκρίνοντας τις αναγνώσεις οργάνων, εσείς οι ίδιοι μπορείτε να εξαγάγετε συμπεράσματα σχετικά με την ακρίβεια του πίνακα GY-BMP280-3.3. Βαρόμετρο ανερχόμενου αέρα πιστοποιημένο από κρατικό εργαστήριο.
Τρίτο στάδιο. Έλεγχος της οθόνης LCD με τη μονάδα διασύνδεσης I2C. Βρίσκουμε μια οθόνη LDC με μια μονάδα διασύνδεσης που συνδέεται μέσω του διαύλου I2C με το Arduino UNO.
Ελέγουμε τη λειτουργία του χρησιμοποιώντας παραδείγματα από το κέλυφος IDE του Arduino. Αλλά πριν από αυτό, προσδιορίζουμε τη διεύθυνση της μονάδας διασύνδεσης. Η ενότητα διεπαφής μου έχει διεύθυνση 0x3F. Έβαλα αυτή τη διεύθυνση στη γραμμή σκίτσων: LiquidCrystal_I2C lcd (0x3F, 16.2);
Καθορίστηκε αυτή η διεύθυνση χρησιμοποιώντας το σκίτσο "σάρωση διευθύνσεων συσκευής I2C" που περιγράφεται στο.
Άρχισα το κέλυφος IDE του Arduino, από το άρθρο που αντιγράψα τον κώδικα του προγράμματος και επικολλήθηκα το παράθυρο του IDE του Arduino.
Ξεκίνησα τη σύνταξη και στη συνέχεια έγραψα τον κώδικα στην πλακέτα Arduino UNO, στην οποία ήταν συνδεδεμένος ο πίνακας GY-BMP280-3.3 και η οθόνη LDC με τη μονάδα διασύνδεσης I2C. Στη συνέχεια, στην οθόνη σειριακής θύρας πήρα το ακόλουθο αποτέλεσμα. Η ενότητα διεπαφής μου έχει διεύθυνση 0x3F.
Τέταρτο στάδιο. Έλεγχος του αισθητήρα θερμοκρασίας DS18b20. Το συνδέουμε ως εξής.
Η Βιβλιοθήκη OneWire Arduino για εργασία με τον αισθητήρα θερμοκρασίας DS18b20 έχει ήδη εγκατασταθεί.
Ανοίξτε το δείγμα DS18x20_Temperature, μεταγλωττίστε, φορτώστε, παρακολουθήστε το αποτέλεσμα μέτρησης στην οθόνη σειριακής θύρας. Εάν όλα λειτουργούν, προχωρήστε στο επόμενο βήμα.
Πέμπτο στάδιο. Συνέλευση σπίτι μετεωρολογικούς σταθμούς στα GY-BMP280-3.3 και Ds18b20.
Συγκεντρώνουμε τη συσκευή σύμφωνα με το σχήμα:
Έλαβα τον κώδικα για τη συσκευή συνδυάζοντας όλα τα παραδείγματα σε ένα και ρυθμίζοντας την έξοδο στην οθόνη εμφάνισης LDC. Εδώ είναι τι πήρα:
// Αποσύνδεση για υλοποίηση λογισμικού του δίαυλου I2C: //
// #define pin_SW_SDA 3 // Αντιστοιχίστε οποιοδήποτε pin Arduino για να λειτουργήσει ως γραμμή SDA του διαύλου λογισμικού I2C.
// #define pin_SW_SCL 9 // Αντιστοιχίστε οποιονδήποτε ακροδέκτη Arduino για να λειτουργήσει ως γραμμή SCL στο δίαυλο λογισμικού I2C.
// Αποσύνδεση για συμβατότητα με τις περισσότερες σανίδες: //
#include
#include // Η βιβλιοθήκη zimduino θα χρησιμοποιήσει τις μεθόδους και τις λειτουργίες της βιβλιοθήκης Wire.
#include // Βιβλιοθήκη για την εργασία του LDC τύπου 1602 στον δίαυλο I2C
//
#include // Συνδέστε τη βιβλιοθήκη για την εργασία με BMP180 ή BMP280.
αισθητήρας επιτάχυνσης_BMP (0x76); // Δηλώστε ένα αντικείμενο αισθητήρα για να εργαστείτε με έναν αισθητήρα πίεσης χρησιμοποιώντας τις λειτουργίες και τις μεθόδους της βιβλιοθήκης του zirduino_Pressure_BMP.
LiquidCrystal_I2C lcd (0χ3Ρ, 16,2).
OneWire ds (10);
άκυρη ρύθμιση () {
lcd.init ();
lcd.backlight ();
Serial.begin (9600); // Ξεκινήστε τη μεταφορά δεδομένων στην οθόνη σειριακής θύρας στα 9600 baud.
καθυστέρηση (1000). // Αναμονή για την ολοκλήρωση των παροδίων κατά τη διάρκεια ισχύος
sensor.begin (73). // Ξεκινήστε την εργασία με τον αισθητήρα. Το σημερινό υψόμετρο θα ληφθεί ως 73 μ. - το ύψος της πόλης του Buzuluk πάνω από τη στάθμη της θάλασσας
} //
void loop () {
// Διαβάστε τα δεδομένα και εμφάνιση: θερμοκρασία σε ° C, πίεση σε mm. rt., αλλαγή ύψους σε σχέση με την καθορισμένη στη λειτουργία εκκίνησης (προεπιλογή 0 μέτρα).
lcd.setCursor (0,0); // ορίστε το σημείο εξόδου "P =" στην LDC
lcd.print ("Ρ =");
lcd.print (αισθητήρας πίεσης / 1000,3). // διαιρέστε την τιμή του P που εκδίδεται από το BMP280 κατά 1000 και ρυθμίστε την έξοδο με 3 δεκαδικά ψηφία
lcd.setCursor (12,0); // ορίστε το σημείο εξόδου "kPa" στην LDC
lcd.print ("kPa");
lcd.setCursor (0,1);
lcd.print ("Τ =").
lcd.print (αισθητήρας θερμοκρασίας, 1); // ορίστε την έξοδο με ένα δεκαδικό ψηφίο
lcd.setCursor (6.1).
// lcd.print ("C");
// lcd.setCursor (9,1).
// lcd.print ("Η =");
// lcd.print (αισθητήρας, ύψος, 1);
αν είναι (αισθητήρας.αναφορά (1)) {Serial.println ((String) "CEHCOP BMP" + αισθητήρας.τύπος + ": \ tP =" + αισθητήρας.συμπίεση + "\ tMM.PT.CT, \ t T = "+ αισθητήρας θερμοκρασίας +" * C, \ t \ t B = "+ αισθητήρας. +" M. ")}
αλλού {Serial.println ("HET OTBETA OT CEHCOPA")}
// Διαβάστε τα δεδομένα και εμφάνιση: θερμοκρασία σε ° C και πίεση σε Pa, πίεση σε mm. rt., αλλαγή ύψους σε σχέση με την καθορισμένη στη λειτουργία εκκίνησης (προεπιλογή 0 μέτρα).
αν είναι (αισθητήρας.διατάγματος (2)) {Serial.println ((String) "CEHCOP BMP" + αισθητήρας.τύπος + ": \ tP =" + αισθητήρας.περιοχή + "\ tPa, \ t \ Θερμοκρασία αισθητήρα + "* C, \ t \ t B =" + αισθητήρας. + "M.")}
αλλού {Serial.println ("HET OTBETA OT CEHCOPA")}
byte i;
byte present = 0.
byte type_s;
δεδομένα byte [12].
byte addr [8].
float celsius, fahrenheit;
αν (! ds.search (addr)) {
Serial.println ("Δεν υπάρχουν περισσότερες διευθύνσεις.");
Serial.println ();
ds.reset_search ();
καθυστέρηση (250);
επιστροφή
}}
Serial.print ("ROM =");
για (i = 0, i <8, i ++) {
Serial.write ('');
Serial.print (addr [i], HEX).
}}
αν (OneWire :: crc8 (addr, 7)! = addr [7]) {
Serial.println ("Το CRC δεν είναι έγκυρο!");
επιστροφή
}}
Serial.println ();
// το πρώτο byte ROM υποδεικνύει ποιο τσιπ
διακόπτης (addr [0]) {
περίπτωση 0x10:
Serial.println ("Chip = DS18S20"). // ή παλιά DS1820
type_s = 1;
διάλειμμα.
περίπτωση 0x28:
Serial.println ("Chip = DS18B20").
type_s = 0;
διάλειμμα.
περίπτωση 0x22:
Serial.println ("Chip = DS1822").
type_s = 0;
διάλειμμα.
προεπιλογή:
Serial.println ("Η συσκευή δεν είναι συσκευή οικογένειας DS18x20").
επιστροφή
}}
ds.reset ();
ds.select (addr);
ds.write (0x44, 1). // έναρξη μετατροπής, με παράσιτο στο τέλος
καθυστέρηση (1000). // ίσως 750ms είναι αρκετό, ίσως όχι
// θα μπορούσαμε να κάνουμε ένα ds.depower () εδώ, αλλά το reset θα το φροντίσει.
present = ds.reset ();
ds.select (addr);
ds.write (0xBE); // Διαβάστε το Scratchpad
Serial.print ("Δεδομένα =");
Serial.print (παρόν, HEX);
Serial.print ("");
για (i = 0; i <9; i ++) {// χρειαζόμαστε 9 bytes
τα δεδομένα [i] = ds.read ();
Serial.print (δεδομένα [i], HEX).
Serial.print ("");
}}
Serial.print ("CRC =");
Serial.print (OneWire :: crc8 (δεδομένα, 8), HEX).
Serial.println ();
// Μετατροπή των δεδομένων σε πραγματική θερμοκρασία
// επειδή το αποτέλεσμα είναι ένας ακέραιος αριθμός 16 υπογεγραμμένος, θα πρέπει
// να αποθηκεύονται σε έναν τύπο "int16_t", ο οποίος είναι πάντα 16 bit
// ακόμη και όταν έχει καταρτιστεί σε επεξεργαστή 32 bit.
int16_t raw = (δεδομένα [1] & lt; 8) | δεδομένα [0].
αν (type_s) {
ωμή = ακατέργαστη & lt; & lt; 3; // προεπιλεγμένη ανάλυση 9 bit
αν (δεδομένα [7] == 0x10) {
// "μετράει παραμένει" δίνει πλήρη ανάλυση 12 bit
raw = (raw & amp; 0xFFF0) + 12 - δεδομένα [6].
}}
} else {
byte cfg = (δεδομένα [4] & 0x60).
// σε χαμηλότερη res, τα χαμηλά bits είναι απροσδιόριστα, οπότε ας μηδενίσουμε τα
αν (cfg == 0x00) raw = raw & amp; ~ 7; // ανάλυση 9 bit, 93,75 ms
else if (cfg == 0x20) raw = raw & amp; ~ 3; // 10 bit res, 187,5 ms
else if (cfg == 0x40) raw = raw & amp; ~ 1; // 11 bit res, 375 ms
//// default είναι ανάλυση 12 bit, χρόνος μετατροπής 750 ms
}}
celsius = (float) ακατέργαστο / 16,0;
fahrenheit = celsius * 1,8 + 32,0;
Serial.print ("Θερμοκρασία =");
Serial.print (celsius);
Serial.print ("Κελσίου");
Serial.print (fahrenheit);
Serial.println ("Fahrenheit");
lcd.setCursor (8.1); // ορίστε το σημείο εξόδου "Tds =" στην LDC
lcd.print ("Tds =");
lcd.print (celsius, 1).
καθυστέρηση (3000).
}}
Εδώ είναι τι πήρα:
Η πλακέτα GY-BMP280-3.3 δίνει πίεση σε pascals, η οποία δεν είναι πολύ βολική. Δεν θα μπορούσα να λύσω το πρόβλημα του πώς να φτιάξω τα δεδομένα πίεσης εξόδου του πίνακα GY-BMP280-3.3 σε kilopascals. Έχω λύσει αυτό το πρόβλημα στη γραμμή εξόδου της οθόνης LDC.
lcd.print (αισθητήρας πίεσης / 1000,3). // διαιρέστε την τιμή του P που εκδίδεται από το BMP280 κατά 1000 και ρυθμίστε την έξοδο με 3 δεκαδικά ψηφία
Ο πίνακας GY-BMP280-3.3 παρέχει επίσης τιμές υψομέτρου.
sensor.begin (73). // Ξεκινήστε την εργασία με τον αισθητήρα. Το σημερινό υψόμετρο θα ληφθεί ως 73 μ. - το ύψος της πόλης του Buzuluk πάνω από τη στάθμη της θάλασσας
Εάν θα χαλαρώσετε στη θάλασσα και θα αλλάξετε "sensor.begin (73)," στο "sensor.begin (0);" στον κώδικα και, στη συνέχεια, να μεταγλωττίσετε και να αποθηκεύσετε το πρόγραμμα στον οικιακό μετεωρολογικό σταθμό στις GY-BMP280-3.3 και Ds18b20 και να κάνετε έξοδο ύψους στην οθόνη LDC, θα έχετε επίσης ένα υψόμετρο.
// lcd.setCursor (9,1).
// lcd.print ("Η =");
// lcd.print (αισθητήρας, ύψος, 1); // Εκτυπώστε τις τιμές ύψους σε μέτρα με ένα δεκαδικό ψηφίο
Η ισχύς τροφοδοτείται στο κύκλωμα στην έκδοση μου μέσω καλωδίου USB. Μπορείτε να χρησιμοποιήσετε έναν μετατροπέα παλμών χαμηλής τάσης 5V / 600 mA και ο μετεωρολογικός σας σταθμός θα γίνει φορητός. Αυτός ο τύπος τροφοδοσίας είναι καλά περιγραφόμενος στο άρθρο.
Επιτυχής συλλογή!