- Απαιτούμενα στοιχεία: -
- Αισθητήρας θερμοκρασίας DS18B20:
- Διάγραμμα κυκλώματος:-
- Βήματα ή ροή κώδικα: -
- Επεξήγηση κώδικα:
- Λήψη δεδομένων από τον αισθητήρα θερμοκρασίας DS18B20:
Γενικά, ο αισθητήρας θερμοκρασίας LM35 χρησιμοποιείται με μικροελεγκτές για τη μέτρηση της θερμοκρασίας επειδή είναι φθηνός και εύκολα διαθέσιμος. Αλλά το LM35 δίνει αναλογικές τιμές και πρέπει να τις μετατρέψουμε σε ψηφιακή χρησιμοποιώντας ADC (Analog to Digital Converter). Αλλά σήμερα χρησιμοποιούμε αισθητήρα θερμοκρασίας DS18B20 στον οποίο δεν χρειαζόμαστε μετατροπή ADC για να πάρουμε τη θερμοκρασία. Εδώ θα χρησιμοποιήσουμε τον μικροελεγκτή PIC με DS18B20 για τη μέτρηση της θερμοκρασίας.
Έτσι λοιπόν κατασκευάζουμε ένα θερμόμετρο με τις ακόλουθες προδιαγραφές χρησιμοποιώντας τη μονάδα μικροελεγκτή PIC16F877A από το μικροτσίπ.
- Θα δείξει Πλήρες εύρος θερμοκρασίας από -55 βαθμούς έως +125 βαθμούς.
- Θα εμφανίσει τη θερμοκρασία μόνο εάν η θερμοκρασία αλλάξει + / -.2 βαθμός.
Απαιτούμενα στοιχεία: -
- Πακέτο Pic16F877A - PDIP40
- Πίνακας ψωμιού
- Pickit-3
- Προσαρμογέας 5V
- LCD JHD162A
- Αισθητήρας θερμοκρασίας DS18b20
- Καλώδια για σύνδεση περιφερειακών.
- 4.7k Αντιστάσεις - 2 τεμάχια
- 10k ποτ
- 20mHz κρύσταλλο
- 2 τεμ κεραμικοί πυκνωτές 33pF
Αισθητήρας θερμοκρασίας DS18B20:
Το DS18B20 είναι ένας εξαιρετικός αισθητήρας για την ακριβή αίσθηση της θερμοκρασίας. Αυτός ο αισθητήρας παρέχει ανάλυση 9bit έως 12bit για την ανίχνευση θερμοκρασίας. Αυτός ο αισθητήρας επικοινωνεί με ένα μόνο καλώδιο και δεν χρειάζεται ADC για να αποκτήσει αναλογικές θερμοκρασίες και να τις μετατρέψει ψηφιακά.
Η προδιαγραφή του αισθητήρα είναι: -
- Μετρά τις θερμοκρασίες από -55 ° C έως + 125 ° C (-67 ° F έως + 257 ° F)
- ± 0,5 ° C Ακρίβεια από -10 ° C έως + 85 ° C
- Προγραμματιζόμενη ανάλυση από 9 Bits έως 12 Bits
- Δεν απαιτούνται εξωτερικά στοιχεία
- Ο αισθητήρας χρησιμοποιεί διεπαφή 1-Wire®
Εάν κοιτάξουμε την παραπάνω εικόνα pinout από το φύλλο δεδομένων, μπορούμε να δούμε ότι ο αισθητήρας μοιάζει ακριβώς με το πακέτο BC547 ή BC557, TO-92. Ο πρώτος πείρος είναι Γείωση, ο δεύτερος πείρος είναι DQ ή τα δεδομένα και ο τρίτος πείρος είναι VCC.
Ακολουθεί η ηλεκτρική προδιαγραφή από το φύλλο δεδομένων που θα χρειαστεί για το σχεδιασμό μας. Η ονομαστική τάση τροφοδοσίας για τον αισθητήρα είναι + 3.0V έως + 5.5V. Χρειάζεται επίσης τάση τροφοδοσίας που είναι ίδια με την τάση τροφοδοσίας που αναφέρεται παραπάνω.
Επίσης, υπάρχει ένα περιθώριο ακρίβειας που είναι + -0,5 βαθμοί Κελσίου για το εύρος από -10 βαθμούς C έως +85 βαθμούς Κελσίου, και η ακρίβεια αλλάζει για το περιθώριο πλήρους εμβέλειας, το οποίο είναι + -2 βαθμός για -55 βαθμούς έως + Εύρος 125 μοιρών.
Αν κοιτάξουμε ξανά το φύλλο δεδομένων, θα δούμε τις προδιαγραφές σύνδεσης του αισθητήρα. Μπορούμε να συνδέσουμε τον αισθητήρα σε κατάσταση παρασιτικής ισχύος όπου χρειάζονται δύο καλώδια, DATA και GND, ή μπορούμε να συνδέσουμε τον αισθητήρα χρησιμοποιώντας εξωτερική τροφοδοσία, όπου χρειάζονται τρία ξεχωριστά καλώδια. Θα χρησιμοποιήσουμε τη δεύτερη διαμόρφωση.
Καθώς γνωρίζουμε τώρα τις βαθμολογίες ισχύος του αισθητήρα και των περιοχών που σχετίζονται με τη σύνδεση, μπορούμε τώρα να επικεντρωθούμε στην κατασκευή του σχηματικού.
Διάγραμμα κυκλώματος:-
Αν δούμε το διάγραμμα κυκλώματος θα δούμε ότι:
Το LCD 16x2 χαρακτήρων συνδέεται μέσω μικροελεγκτή PIC16F877A, στον οποίο τα RB0, RB1, RB2 συνδέονται με τον ακροδέκτη LCD RS, R / W και E. Και RB4, RB5, RB6 και RB7 συνδέονται μεταξύ των 4 ακίδων LCD D4, D5, D6, Δ7. Η οθόνη LCD είναι συνδεδεμένη σε λειτουργία 4bit ή nibble.
Ένας κρυσταλλικός ταλαντωτής των 20MHz με δύο κεραμικούς πυκνωτές 33pF συνδέεται μεταξύ των ακίδων OSC1 και OSC2. Θα παρέχει σταθερή συχνότητα ρολογιού 20Mhz στον μικροελεγκτή.
Το DS18B20 συνδέεται επίσης σύμφωνα με τη διαμόρφωση του πείρου και με μια αντίσταση έλξης 4,7k όπως συζητήθηκε προηγουμένως. Έχω συνδέσει όλα αυτά στο breadboard.
Εάν είστε νέοι στο PIC Microcontroller παρά ακολουθήστε τα PIC Microcontroller Tutorials που δηλώνουν με το «Ξεκινώντας με το PIC Microcontroller».
Βήματα ή ροή κώδικα: -
- Ορίστε τις διαμορφώσεις του μικροελεγκτή που περιλαμβάνουν διαμόρφωση Oscillator.
- Ρυθμίστε την επιθυμητή θύρα για LCD συμπεριλαμβανομένου του μητρώου TRIS.
- Κάθε κύκλος με αισθητήρα ds18b20 ξεκινά με επαναφορά, οπότε θα επαναφέρουμε το ds18b20 και θα περιμένουμε τον παλμό παρουσίας.
- Γράψτε το scratchpad και ορίστε την ανάλυση του αισθητήρα 12bit.
- Παράλειψη της ανάγνωσης ROM ακολουθούμενη από παλμό επαναφοράς.
- Υποβολή εντολής μετατροπής θερμοκρασίας.
- Διαβάστε τη θερμοκρασία από το μηδέν.
- Ελέγξτε την τιμή θερμοκρασίας είτε αρνητική είτε θετική.
- Εκτυπώστε τη θερμοκρασία σε LCD 16x2.
- Περιμένετε τις αλλαγές θερμοκρασίας για +/-. 20 βαθμούς Κελσίου.
Επεξήγηση κώδικα:
Ο πλήρης κωδικός για αυτό το ψηφιακό θερμόμετρο δίνεται στο τέλος αυτού του σεμιναρίου με ένα βίντεο επίδειξης. Θα χρειαστείτε ορισμένα αρχεία κεφαλίδας για να εκτελέσετε αυτό το πρόγραμμα, το οποίο μπορείτε να κατεβάσετε από εδώ.
Κατ 'αρχάς, πρέπει να ρυθμίσουμε τα bit διαμόρφωσης στον μικροελεγκτή pic και μετά να ξεκινήσουμε με την κενή κύρια λειτουργία.
Στη συνέχεια, χρησιμοποιούνται τέσσερις γραμμές για να συμπεριλάβετε το αρχείο κεφαλίδας βιβλιοθήκης, lcd.h και ds18b20.h . Και το xc.h είναι για το αρχείο κεφαλίδας μικροελεγκτή.
#περιλαμβάνω
Αυτοί οι ορισμοί χρησιμοποιούνται για την αποστολή εντολών στον αισθητήρα θερμοκρασίας. Οι εντολές παρατίθενται στο φύλλο δεδομένων του αισθητήρα.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E # καθορισμός ανάλυσης_12bit 0x7F # καθορισμός read_scratchpad 0xBE
Αυτός ο πίνακας 3 από το φύλλο δεδομένων του αισθητήρα δείχνει όλες τις εντολές όπου οι μακροεντολές χρησιμοποιούνται για την αποστολή αντίστοιχων εντολών.
Η θερμοκρασία θα εμφανιστεί στην οθόνη μόνο εάν η θερμοκρασία αλλάξει +/- .20 μοίρες. Μπορούμε να αλλάξουμε αυτό το κενό θερμοκρασίας από αυτήν τη μακροεντολή temp_gap . Αλλάζοντας την τιμή σε αυτήν τη μακροεντολή, η προδιαγραφή θα αλλάξει.
Άλλες δύο μεταβλητές float που χρησιμοποιούνται για την αποθήκευση των δεδομένων θερμοκρασίας που εμφανίζονται και τις διαφοροποιούν με το κενό θερμοκρασίας
# καθορισμός temp_gap 20 float pre_val = 0, aft_val = 0;
Στην κενή συνάρτηση () , το lcd_init () ; είναι μια λειτουργία για την προετοιμασία της οθόνης LCD. Αυτή η συνάρτηση lcd_init () καλείται από τη βιβλιοθήκη lcd.h.
Οι καταχωρητές TRIS χρησιμοποιούνται για την επιλογή καρφίτσες εισόδου / εξόδου ως είσοδο ή έξοδο. Δύο μη υπογεγραμμένα σύντομα μεταβλητά TempL και TempH χρησιμοποιούνται για την αποθήκευση των δεδομένων ανάλυσης 12bit από τον αισθητήρα θερμοκρασίας.
void main (void) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; χωρίς υπογραφή σύντομο TempL, TempH; χωρίς υπογραφή int t, t2; διαφορά float1 = 0, διαφορά2 = 0; lcd_init ();
Ας δούμε τον βρόχο while, εδώ σπάζουμε τον βρόχο while (1) σε μικρά κομμάτια.
Αυτές οι γραμμές χρησιμοποιούνται για την αίσθηση ότι ο αισθητήρας θερμοκρασίας είναι συνδεδεμένος ή όχι.
ενώ (ow_reset ()) {lcd_com (0x80); lcd_puts ("Παρακαλώ συνδεθείτε"); lcd_com (0xC0); lcd_puts ("Temp-Sense Probe"); }
Χρησιμοποιώντας αυτό το τμήμα κώδικα αρχικοποιούμε τον αισθητήρα και στέλνουμε εντολή για τη μετατροπή της θερμοκρασίας.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); write_byte (0); write_byte (0); write_byte (ανάλυση_12bit); // ανάλυση 12bit ow_reset (); write_byte (skip_rom); write_byte (convert_temp);
Αυτός ο κωδικός προορίζεται για την αποθήκευση των δεδομένων θερμοκρασίας 12bit σε δύο μη υπογεγραμμένες σύντομες μεταβλητές.
ενώ (read_byte () == 0xff); __delay_ms (500); ow_reset (); write_byte (skip_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
Στη συνέχεια, αν ελέγξετε τον πλήρη κώδικα παρακάτω, έχουμε δημιουργήσει συνθήκη if-else για να μάθετε το σύμβολο θερμοκρασίας εάν είναι θετικό ή αρνητικό.
Χρησιμοποιώντας τον κωδικό δήλωσης If , χειριζόμαστε τα δεδομένα και βλέπουμε αν η θερμοκρασία είναι αρνητική ή όχι και προσδιορίζουμε ότι οι αλλαγές θερμοκρασίας βρίσκονται στο εύρος +/-.20 μοιρών ή όχι. Και σε άλλο μέρος ελέγξαμε αν η θερμοκρασία είναι θετική ή όχι και ανιχνεύεται αλλαγή θερμοκρασίας
κώδικας
Λήψη δεδομένων από τον αισθητήρα θερμοκρασίας DS18B20:
Ας δούμε το χρονικό κενό της διεπαφής 1-Wire®. Χρησιμοποιούμε Crystal 20Mhz. Αν κοιτάξουμε μέσα στο αρχείο ds18b20.c, θα δούμε
# καθορισμός _XTAL_FREQ 20000000
Αυτός ο ορισμός χρησιμοποιείται για ρουτίνα καθυστέρησης μεταγλωττιστή XC8. 20Mhz ορίζεται ως η συχνότητα κρυστάλλου.
Κάναμε πέντε συναρτήσεις
- ow_reset
- read_bit
- read_byte
- γράψτε_bit
- γράψτε_byte
Το πρωτόκολλο 1-Wire ® χρειάζεται αυστηρούς χρονοθυρίδες για να επικοινωνήσει. Μέσα στο δελτίο δεδομένων, θα λάβουμε τέλειες πληροφορίες σχετικά με το χρονικό διάστημα.
Μέσα στην παρακάτω συνάρτηση δημιουργήσαμε την ακριβή χρονική περίοδο. Είναι σημαντικό να δημιουργήσετε την ακριβή καθυστέρηση κράτησης και απελευθέρωσης και ελέγχου του bit TRIS της αντίστοιχης θύρας του αισθητήρα.
unsigned char ow_reset (άκυρο) {DQ_TRIS = 0; // Tris = 0 (έξοδος) DQ = 0; // ρυθμίστε τον πείρο # σε χαμηλό (0) __delay_us (480); // 1 καλώδιο απαιτεί καθυστέρηση χρόνου DQ_TRIS = 1; // Tris = 1 (είσοδος) __delay_us (60); // 1 καλώδιο απαιτεί χρονική καθυστέρηση εάν (DQ == 0) // εάν υπάρχει παρουσία pluse {__delay_us (480); επιστροφή 0; // επιστροφή 0 (υπάρχει 1 καλώδιο)} άλλο {__delay_us (480) επιστροφή 1; // επιστροφή 1 (1 καλώδιο ΔΕΝ υπάρχει)}} // 0 = παρουσία, 1 = κανένα μέρος
Τώρα, σύμφωνα με την παρακάτω περιγραφή χρονοθυρίδας που χρησιμοποιείται στο Read and Write, δημιουργήσαμε τη λειτουργία ανάγνωσης και εγγραφής αντίστοιχα.
unsigned char read_bit (void) {unsigned char i; DQ_TRIS = 1; DQ = 0; // τραβήξτε το χαμηλό DQ για να ξεκινήσετε την κουλοχέρη DQ_TRIS = 1; DQ = 1; // τότε επιστρέψτε ψηλά για (i = 0; i <3; i ++); // καθυστέρηση 15us από την έναρξη της επιστροφής χρονικού σημείου (DQ). // τιμή επιστροφής της γραμμής DQ} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // τραβήξτε DQ χαμηλά για να ξεκινήσετε το χρονικό σημείο εάν (bitval == 1) DQ = 1; // επιστροφή DQ υψηλή αν γράψετε 1 __delay_us (5); // τιμή κράτησης για το υπόλοιπο της χρονικής περιόδου DQ_TRIS = 1; DQ = 1; } // Η καθυστέρηση παρέχει 16us ανά βρόχο, συν 24us. Επομένως καθυστέρηση (5) = 104us
Περαιτέρω έλεγχος όλα τα συναφή κεφαλίδα και.c αρχεία εδώ.
Έτσι λοιπόν μπορούμε να χρησιμοποιήσουμε τον αισθητήρα DS18B20 για να πάρουμε τη θερμοκρασία με τον μικροελεγκτή PIC.
Αν θέλετε να δημιουργήσετε ένα απλό Ψηφιακό Θερμόμετρο με LM35, ελέγξτε παρακάτω έργα με άλλους Μικροελεγκτές:
- Μέτρηση θερμοκρασίας δωματίου με Raspberry Pi
- Ψηφιακό θερμόμετρο χρησιμοποιώντας Arduino και LM35
- Ψηφιακό θερμόμετρο χρησιμοποιώντας LM35 και 8051
- Μέτρηση θερμοκρασίας με χρήση μικροελεγκτή LM35 και AVR