Πίνακας περιεχομένων:

Θερμόμετρο καταγραφής DIY με 2 αισθητήρες: 3 βήματα (με εικόνες)
Θερμόμετρο καταγραφής DIY με 2 αισθητήρες: 3 βήματα (με εικόνες)

Βίντεο: Θερμόμετρο καταγραφής DIY με 2 αισθητήρες: 3 βήματα (με εικόνες)

Βίντεο: Θερμόμετρο καταγραφής DIY με 2 αισθητήρες: 3 βήματα (με εικόνες)
Βίντεο: Κοψτο κι λιγο 2024, Νοέμβριος
Anonim
Θερμόμετρο καταγραφής DIY με 2 αισθητήρες
Θερμόμετρο καταγραφής DIY με 2 αισθητήρες
Θερμόμετρο καταγραφής DIY με 2 αισθητήρες
Θερμόμετρο καταγραφής DIY με 2 αισθητήρες

Αυτό το έργο είναι μια ενίσχυση του προηγούμενου έργου μου "Θερμόμετρο καταγραφής DIY". Καταγράφει τις μετρήσεις θερμοκρασίας σε κάρτα micro SD.

Αλλαγές υλικού

Πρόσθεσα έναν αισθητήρα θερμοκρασίας DS18B20 στη μονάδα ρολογιού πραγματικού χρόνου, όπου υπάρχει πρόβλεψη στην πλακέτα τυπωμένου κυκλώματος για αυτήν τη συσκευή. και πρόσθεσε το κατάλληλο καλώδιο από τον πείρο "DS" του RTC στο D2 του Arduino.

Αλλαγές λογισμικού

Στη συνέχεια πρόσθεσα και τροποποίησα το λογισμικό. Οι κυριότερες αλλαγές είναι:

Η οθόνη LCD εμφανίζει δύο θερμοκρασίες "In" και "Out".

Τα αρχεία καταγραφής που έχουν εγγραφεί στην κάρτα SD έχουν δύο πεδία θερμοκρασίας, "θερμοκρασία εισόδου" και "θερμοκρασία εξόδου".

Λόγω της μεγαλύτερης εγγραφής στην κάρτα SD, τα buffer εργασίας για το EEPROM ήταν μεγαλύτερα και ως αποτέλεσμα άρχισα να έχω προβλήματα σύγκρουσης μνήμης. Έκανα μια σειρά αλλαγών με στόχο τη μείωση της χρήσης δυναμικής μνήμης, συμπεριλαμβανομένης της χρήσης συστοιχιών χαρακτήρων για όλες τις συμβολοσειρές αντί του αντικειμένου συμβολοσειράς.

Το τμήμα του λογισμικού που δέχεται τις θερμοκρασίες έχει σημαντικές τροποποιήσεις, πολλές από τις οποίες έχουν να κάνουν με τον προσδιορισμό του ποιο αισθητήρα είναι "μέσα" και ποιος "έξω". Αυτή η ταυτοποίηση είναι ως επί το πλείστον αυτόματη. Εάν για κάποιο λόγο οι ανιχνευτές αλλάξουν, μπορεί να διορθωθεί αποσυνδέοντας τον αισθητήρα "out" και στη συνέχεια συνδέοντάς τον ξανά. Δεν έχω βιώσει αυτή την ανατροπή μόνος μου. Ο προγραμματιστής ή ο χρήστης δεν χρειάζεται να πληκτρολογήσει τις διευθύνσεις του αισθητήρα, το λογισμικό ανακαλύπτει τις διευθύνσεις του αισθητήρα θερμοκρασίας από μόνο του.

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

Βήμα 1: Ανάπτυξη λογισμικού

Αυτό το βήμα σας δίνει το πλήρες λογισμικό για το ολοκληρωμένο έργο. Το συνέταξα χρησιμοποιώντας το Arduino IDE 1.6.12. Χρησιμοποιεί 21, 400 byte μνήμης προγράμματος (69%) και 1, 278 bytes δυναμικής μνήμης (62%).

Έβαλα σχόλια στον κώδικα με την ελπίδα ότι θα καταστήσει σαφές τι συμβαίνει.

Βήμα 2: Εργασία με δύο αισθητήρες θερμοκρασίας - Λεπτομέρειες

Αυτό το λογισμικό χρησιμοποιεί τη βιβλιοθήκη "OneWire". Δεν χρησιμοποιεί καμία "DallasTemperature" ή παρόμοιες βιβλιοθήκες. Αντ 'αυτού, οι εντολές προς και τα δεδομένα από τους αισθητήρες θερμοκρασίας γίνονται με το σκίτσο και μπορούν να προβληθούν και να γίνουν κατανοητές πολύ εύκολα. Βρήκα μια χρήσιμη λίστα με τις εντολές της βιβλιοθήκης OneWire στη διεύθυνση

www.pjrc.com/teensy/td_libs_OneWire.html

Όταν υπάρχουν δύο (ή περισσότεροι) αισθητήρες θερμοκρασίας, καθίσταται απαραίτητο να προσδιοριστεί ποιος είναι ποιος.

Κάλεσα τους δύο αισθητήρες μου "μέσα" και "έξω", που είναι χαρακτηριστικό για τις εμπορικές μονάδες που έχουν έναν αισθητήρα στη μονάδα οθόνης που είναι συνήθως "μέσα" και τον άλλο αισθητήρα σε ένα καλώδιο για να μπορεί να τοποθετηθεί στην άλλη πλευρά ενός εξωτερικού τοίχου και έτσι να είναι «έξω».

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

Η πρόθεσή μου ήταν ότι το λογισμικό θα πρέπει να αναγνωρίζει αυτόματα τους αισθητήρες και να τους κατανέμει σωστά στο "μέσα" και "έξω". Αυτό είναι αρκετά εύκολο να το κάνετε τοποθετώντας τα σε ξεχωριστές καρφίτσες Arduino. Σε αυτό το έργο, τα A0 έως A3 και A6 και A7 είναι όλα αχρησιμοποίητα, οπότε ένα από αυτά θα μπορούσε να χρησιμοποιηθεί σε αυτήν την περίπτωση. Ωστόσο, πέτυχα να λειτουργήσει η αυτόματη αναγνώριση με τους αισθητήρες και οι δύο στο ίδιο δίαυλο OneWire.

Δουλεύει κάπως έτσι.

Η βιβλιοθήκη OneWire έχει μια εντολή "OneWireObject.search (διεύθυνση)" όπου "διεύθυνση" είναι ένας πίνακας 8 byte και "OneWireObject" είναι το όνομα μιας παρουσίας του αντικειμένου OneWire που έχει δημιουργηθεί προηγουμένως. Μπορεί να έχει οποιοδήποτε όνομα σας αρέσει. Το δικό μου λέγεται "ds". Όταν εκδίδετε αυτήν την εντολή "αναζήτησης", η βιβλιοθήκη OneWire κάνει κάποια σηματοδότηση στο δίαυλο ενός καλωδίου. Εάν εντοπίσει έναν αισθητήρα απόκρισης, επιστρέφει μια τιμή "TRUE" boolean και συμπληρώνει τον πίνακα "διεύθυνση" με το μοναδικό αναγνωριστικό 8 byte του αισθητήρα. Αυτό το αναγνωριστικό περιλαμβάνει έναν οικογενειακό κωδικό (στην αρχή) και ένα άθροισμα επιταγής (στο τέλος). Ενδιάμεσα υπάρχουν 6 byte που προσδιορίζουν μοναδικά τον αισθητήρα στην οικογένειά του.

Ένα αποτέλεσμα (διεύθυνση και επιστροφή TRUE) λαμβάνεται κάθε φορά που δίνεται αυτή η εντολή, κάνοντας ποδηλασία σε όλες τις συσκευές του διαύλου OneWire. Μόλις απαντήσει κάθε συσκευή, την επόμενη φορά που θα εκδοθεί η "αναζήτηση", η επιστροφή είναι "FALSE", υποδεικνύοντας ότι κάθε συσκευή στο λεωφορείο έχει ήδη απαντήσει. Εάν η "αναζήτηση" εκδοθεί ξανά, η πρώτη συσκευή ανταποκρίνεται ξανά - και ούτω καθεξής επ 'αόριστον. Οι συσκευές ανταποκρίνονται πάντα με την ίδια σειρά. Η σειρά των απαντήσεων βασίζεται στα αναγνωριστικά των συσκευών στο δίαυλο OneWire. Φαίνεται ότι είναι μια δυαδική αναζήτηση ξεκινώντας από τα λιγότερο σημαντικά κομμάτια των αναγνωριστικών συσκευής. Το πρωτόκολλο που χρησιμοποιείται για την εύρεση αυτών των αναγνωριστικών είναι αρκετά περίπλοκο και περιγράφεται στις σελίδες 51 - 54 του εγγράφου "Book of iButton Standards" που είναι ένα έγγραφο pdf στη διεύθυνση https://pdfserv.maximintegrated.com/en/an/AN937.pd …

Δοκίμασα αυτήν τη διαδικασία αναζήτησης με από 1 έως 11 αισθητήρες σε ένα μόνο δίαυλο και βρήκα ότι η σειρά απόκρισης για ένα συγκεκριμένο σύνολο συσκευών ήταν πάντα η ίδια, αλλά όταν πρόσθεσα μια νέα συσκευή στο τέλος του διαύλου, δεν υπήρχε τρόπος Θα μπορούσα να προβλέψω πού θα εμφανιστεί στη σειρά αναζήτησης. Για παράδειγμα, ο 11ος αισθητήρας που πρόσθεσα ήρθε στη θέση Νο. και ο πρώτος αισθητήρας που έβαλα στο λεωφορείο ήταν ο τελευταίος στη σειρά αναζήτησης.

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

Όταν ο αισθητήρας στο καλώδιο (ο αισθητήρας "έξω") αποσυνδεθεί, η εντολή "αναζήτηση" παράγει εναλλασσόμενες επιστροφές "TRUE" και "FALSE".

Όταν συνδέεται ο αισθητήρας στο καλώδιο, η εντολή "αναζήτηση" παράγει έναν κύκλο 3 σταδίων, με δύο "TRUE" και μία "FALSE".

Η διαδικασία μου είναι να εκδώσω 1, 2 ή 3 εντολές "αναζήτησης", έως ότου επιστρέψει ένα ΛΑΘΟΣ αποτέλεσμα. Στη συνέχεια, εκδίδω 2 ακόμη εντολές "αναζήτησης". Εάν ο δεύτερος αποτύχει (δηλαδή ΛΑΘΟΣ) ξέρω ότι υπάρχει μόνο ένας αισθητήρας στο δίαυλο και ότι είναι ο αισθητήρας "in". Η ταυτότητα της συσκευής καταγράφεται και κατανέμεται στον αισθητήρα "in".

Σε μεταγενέστερο χρόνο, εάν και η πρώτη και η δεύτερη επιστροφή είναι ΑΛΗΘΙΝΕΣ, ξέρω ότι υπάρχουν δύο αισθητήρες στο λεωφορείο. Ελέγχω ποια από αυτές έχει ταυτότητα ίση με τον αισθητήρα "in" και εκχωρώ την άλλη ως αισθητήρα "εκτός".

Το άλλο μικρό σημείο είναι ότι η συλλογή των αποτελεσμάτων από τους δύο αισθητήρες γίνεται με την αποστολή της "μετατροπής έναρξης" με αυτό που είναι γνωστό ως εντολή "παράλειψη ROM". Έχουμε την επιλογή αποστολής εντολών σε μία μόνο συσκευή (χρησιμοποιώντας το μοναδικό αναγνωριστικό της) ή σε όλες τις συσκευές του διαύλου (παράλειψη ROM). Ο κώδικας μοιάζει με αυτό:

ds.reset (); //

// αποστολή εντολής "παράλειψη ROM" (οπότε η επόμενη εντολή λειτουργεί και στους δύο αισθητήρες) ds.write (0xCC); // Παράλειψη εντολής ROM ds.write (0x44, 0); // έναρξη μετατροπής και στους δύο ανιχνευτές temperature_state = wait_convert; // μεταβείτε στην κατάσταση καθυστέρησης

Όταν περάσει ο απαιτούμενος χρόνος καθυστέρησης, οι θερμοκρασίες λαμβάνονται από κάθε αισθητήρα ξεχωριστά. Εδώ είναι ο κωδικός για τον δεύτερο αισθητήρα (δηλαδή τον αισθητήρα OUT).

αν (σημαία2) {

παρόν = ds.reset (); ds.select (DS18B20_addr_out); ds.write (0xBE); // Διαβάστε το Scratchpad των δεδομένων "" έξω του αισθητήρα [0] = ds.read (); δεδομένα [1] = ds.read (); temperature_out = (δεδομένα [1] << 8) + δεδομένα [0]; temperature_out = (6 * temperature_out) + temperature_out / 4; // πολλαπλασιάστε με 6,25} else {// όχι flag2 - δηλαδή ο αισθητήρας εξόδου δεν είναι συνδεδεμένος temperature_out = 30000; // επιδιόρθωση στους 300,00 C εάν ο αισθητήρας θερμοκρασίας δεν λειτουργεί} // τέλος του if (flag2)

Δούλεψα το μεγαλύτερο μέρος αυτού του λογισμικού σε ένα αυτόνομο σκίτσο που είχε μόνο τους αισθητήρες θερμοκρασίας, χωρίς τις επιπλοκές της υποστήριξης LCD, RTC και κάρτας SD. Αυτό το σκίτσο ανάπτυξης βρίσκεται στο παρακάτω αρχείο.

Βήμα 3: Προκαταρκτικά αποτελέσματα

Προκαταρκτικά αποτελέσματα
Προκαταρκτικά αποτελέσματα

Αυτό το γράφημα είναι ένας συνδυασμός των δύο πρώτων μερικών ημερών ανάγνωσης.

Συνιστάται: