- DHT11 - Προδιαγραφές και εργασία
- Επικοινωνία με τον αισθητήρα DHT11
- Απαιτούμενα στοιχεία
- Σχηματικός
- DHT11 με εξήγηση κώδικα PIC MPLABX
Η μέτρηση θερμοκρασίας και υγρασίας είναι συχνά χρήσιμη σε πολλές εφαρμογές όπως οικιακός αυτοματισμός, παρακολούθηση περιβάλλοντος, μετεωρολογικός σταθμός κ.λπ. Ο πιο δημοφιλής χρησιμοποιούμενος αισθητήρας θερμοκρασίας δίπλα στο LM35 είναι ο DHT11, έχουμε προηγουμένως κατασκευάσει πολλά έργα DHT11 συνδέοντάς τον με το Arduino, με το Raspberry Pi και πολλοί άλλοι πίνακες ανάπτυξης. Σε αυτό το άρθρο, θα μάθουμε πώς να διασυνδέουμε αυτό το DHT11 με το PIC16F87A που είναι ένας μικροελεγκτής PIC 8-bit. Θα χρησιμοποιήσουμε αυτόν τον μικροελεγκτή για να διαβάσουμε τις τιμές θερμοκρασίας και υγρασίας χρησιμοποιώντας το DHT11 και να το εμφανίσουμε σε οθόνη LCD. Εάν είστε εντελώς νέοι με τη χρήση μικροελεγκτών PIC, μπορείτε να χρησιμοποιήσετε τη σειρά μαθημάτων PIC για να μάθετε πώς να προγραμματίζετε και να χρησιμοποιείτε τον μικροελεγκτή PIC, δηλαδή, ας ξεκινήσουμε.
DHT11 - Προδιαγραφές και εργασία
Ο αισθητήρας DHT11 διατίθεται είτε σε μορφή μονάδας είτε σε μορφή αισθητήρα. Σε αυτό το σεμινάριο χρησιμοποιούμε τον αισθητήρα, η μόνη διαφορά μεταξύ των δύο είναι ότι σε μορφή ενότητας ο αισθητήρας έχει έναν πυκνωτή φιλτραρίσματος και μια αντίσταση έλξης συνδεδεμένη στον πείρο εξόδου του αισθητήρα. Επομένως, εάν χρησιμοποιείτε τη μονάδα, δεν χρειάζεται να τις προσθέσετε εξωτερικά. Το DHT11 σε μορφή αισθητήρα φαίνεται παρακάτω.
Ο αισθητήρας DHT11 έρχεται με μπλε ή άσπρο χρώμα περίβλημα. Μέσα σε αυτό το περίβλημα, έχουμε δύο σημαντικά συστατικά που μας βοηθούν να αισθανθούμε τη σχετική υγρασία και θερμοκρασία. Το πρώτο συστατικό είναι ένα ζεύγος ηλεκτροδίων. Η ηλεκτρική αντίσταση μεταξύ αυτών των δύο ηλεκτροδίων αποφασίζεται από ένα υπόστρωμα συγκράτησης υγρασίας. Έτσι, η μετρούμενη αντίσταση είναι αντιστρόφως ανάλογη με τη σχετική υγρασία του περιβάλλοντος. Όσο υψηλότερη η σχετική υγρασία χαμηλότερη θα είναι η τιμή της αντίστασης και το αντίστροφο. Επίσης, σημειώστε ότι η σχετική υγρασία είναι διαφορετική από την πραγματική υγρασία. Η σχετική υγρασία μετρά την περιεκτικότητα του νερού στον αέρα σε σχέση με τη θερμοκρασία στον αέρα.
Το άλλο συστατικό είναι ένα NTC Thermistor. Ο όρος NTC σημαίνει τον αρνητικό συντελεστή θερμοκρασίας, για την αύξηση της θερμοκρασίας η τιμή της αντίστασης θα μειωθεί. Η έξοδος του αισθητήρα βαθμονομείται εργοστασιακά και ως εκ τούτου ως προγραμματιστής δεν χρειάζεται να ανησυχούμε για τη βαθμονόμηση του αισθητήρα. Η έξοδος του αισθητήρα που δίνεται από την επικοινωνία 1-Wire, ας δούμε το πείρο και το διάγραμμα σύνδεσης αυτού του αισθητήρα.
Το προϊόν είναι σε συσκευασία μιας σειράς 4 ακίδων. Ο 1ος πείρος συνδέεται σε όλη την VDD και ο 4ος πείρος συνδέεται σε ολόκληρο το GND. Ο 2ος πείρος είναι ο πείρος δεδομένων, που χρησιμοποιείται για επικοινωνιακούς σκοπούς. Αυτός ο ακροδέκτης δεδομένων χρειάζεται μια αντίσταση pull-up 5k. Ωστόσο, μπορούν να χρησιμοποιηθούν και άλλες αντιστάσεις όπως 4,7k έως 10k. Η 3η ακίδα δεν είναι συνδεδεμένη με τίποτα. Επομένως αγνοείται.
Το δελτίο δεδομένων παρέχει τεχνικές προδιαγραφές καθώς και πληροφορίες διασύνδεσης που μπορείτε να δείτε στον παρακάτω πίνακα-
Ο παραπάνω πίνακας δείχνει το εύρος και την ακρίβεια μέτρησης θερμοκρασίας και υγρασίας. Μπορεί να μετρήσει τη θερμοκρασία από 0-50 βαθμούς Κελσίου με ακρίβεια +/- 2 βαθμούς Κελσίου και σχετική υγρασία από 20-90% RH με ακρίβεια +/- 5% RH. Η περιγραφή λεπτομερειών μπορεί να δει στον παρακάτω πίνακα.
Επικοινωνία με τον αισθητήρα DHT11
Όπως αναφέρθηκε προηγουμένως, για να διαβάσουμε τα δεδομένα από το DHT11 με το PIC, πρέπει να χρησιμοποιήσουμε το πρωτόκολλο PIC one wire Communication. Οι λεπτομέρειες σχετικά με τον τρόπο εκτέλεσης αυτού μπορούν να γίνουν κατανοητές από το διάγραμμα διασύνδεσης του DHT 11 που μπορεί να βρεθεί στο δελτίο δεδομένων του, το ίδιο δίνεται παρακάτω.
Το DHT11 χρειάζεται ένα σήμα εκκίνησης από το MCU για να ξεκινήσει η επικοινωνία. Επομένως, κάθε φορά που το MCU χρειάζεται να στέλνει ένα σήμα εκκίνησης στον αισθητήρα DHT11 για να του ζητήσει να στείλει τις τιμές της θερμοκρασίας και της υγρασίας. Αφού ολοκληρώσει το σήμα εκκίνησης, το DHT11 στέλνει ένα σήμα απόκρισης που περιλαμβάνει τις πληροφορίες θερμοκρασίας και υγρασίας. Η επικοινωνία δεδομένων γίνεται με το πρωτόκολλο επικοινωνίας δεδομένων διαύλου. Το πλήρες μήκος δεδομένων είναι 40bit και ο αισθητήρας στέλνει πρώτα υψηλότερο bit δεδομένων.
Λόγω της αντίστασης pull-up, η γραμμή δεδομένων παραμένει πάντα στο επίπεδο VCC κατά την κατάσταση αναμονής. Το MCU πρέπει να μειώσει αυτήν την τάση από υψηλή σε χαμηλή για ελάχιστο εύρος 18ms. Κατά τη διάρκεια αυτής της περιόδου, ο αισθητήρας DHT11 ανιχνεύει το σήμα έναρξης και ο μικροελεγκτής κάνει τη γραμμή δεδομένων υψηλή για 20-40us. Αυτός ο χρόνος 20-40us ονομάζεται περίοδος αναμονής όπου το DHT11 ξεκινά στην απόκριση. Μετά από αυτήν την περίοδο αναμονής, το DHT11 στέλνει τα δεδομένα στη μονάδα μικροελεγκτή.
Μορφή δεδομένων DATA αισθητήρα DHT11
Τα δεδομένα αποτελούνται από δεκαδικά και ακέραια μέρη που συνδυάζονται μαζί. Ο αισθητήρας ακολουθεί την παρακάτω μορφή δεδομένων -
8bit integral RH data + 8bit decimal RH data + 8bit integral T data + 8bit decimal T data + 8bit checksum.
Κάποιος μπορεί να επαληθεύσει τα δεδομένα ελέγχοντας την τιμή αθροίσματος με τα ληφθέντα δεδομένα. Αυτό μπορεί να γίνει επειδή, αν όλα είναι σωστά και εάν ο αισθητήρας έχει μεταδώσει σωστά δεδομένα, τότε το άθροισμα ελέγχου πρέπει να είναι το άθροισμα των "8bit integral RH data + 8bit decimal RHdata + 8bit integral T data + 8bit decimal T data".
Απαιτούμενα στοιχεία
Για αυτό το έργο, απαιτούνται παρακάτω πράγματα -
- Ρύθμιση προγραμματισμού μικροελεγκτή PIC (8bit).
- Ψωμί
- Μονάδα τροφοδοσίας 5V 500mA.
- 4.7k αντίσταση 2τμχ
- 1 k αντίσταση
- PIC16F877Α
- 20mHz κρύσταλλο
- Πυκνωτής 33pF 2 τεμ
- LCD χαρακτήρων 16x2
- Αισθητήρας DHT11
- Καλώδια αλτών
Σχηματικός
Το διάγραμμα κυκλώματος για διασύνδεση DHT11 με PIC16F877A φαίνεται παρακάτω.
Χρησιμοποιήσαμε μια οθόνη LCD 16x2 για να εμφανίσουμε τις τιμές θερμοκρασίας και υγρασίας που μετράμε από το DHT11. Η οθόνη LCD συνδέεται σε λειτουργία 4 καλωδίων και τόσο ο αισθητήρας όσο και η οθόνη LCD τροφοδοτούνται από εξωτερική τροφοδοσία 5V. Έχω χρησιμοποιήσει ένα breadboard για να κάνω όλες τις απαιτούμενες συνδέσεις και έχω χρησιμοποιήσει έναν εξωτερικό προσαρμογέα 5V. Μπορείτε επίσης να χρησιμοποιήσετε αυτήν την πλακέτα τροφοδοσίας ψωμιού για να τροφοδοτήσετε την πλακέτα σας με 5V.
Μόλις το κύκλωμα είναι έτοιμο, το μόνο που πρέπει να κάνουμε είναι να ανεβάσετε τον κωδικό που δίνεται στο κάτω μέρος αυτής της σελίδας και μπορούμε να αρχίσουμε να διαβάζουμε τη θερμοκρασία και την υγρασία όπως φαίνεται παρακάτω. Αν θέλετε να μάθετε πώς γράφτηκε ο κώδικας και πώς λειτουργεί διαβάστε παρακάτω. Επίσης, μπορείτε να βρείτε την πλήρη εργασία αυτού του έργου στο βίντεο που δίνεται στο κάτω μέρος αυτής της σελίδας.
DHT11 με εξήγηση κώδικα PIC MPLABX
Ο κώδικας γράφτηκε χρησιμοποιώντας το MPLABX IDE και μεταγλωττίστηκε χρησιμοποιώντας τον μεταγλωττιστή XC8 και οι δύο που παρέχονται από την ίδια την Microchip και είναι δωρεάν για λήψη και χρήση. Ανατρέξτε στα βασικά σεμινάρια για να κατανοήσετε τα βασικά του προγραμματισμού, μόνο οι τρεις σημαντικές λειτουργίες που απαιτούνται για την επικοινωνία με τον αισθητήρα DHT11 συζητούνται παρακάτω. Οι συναρτήσεις είναι -
άκυρο dht11_init (); άκυρο find_response (); char read_dht11 ();
Η πρώτη συνάρτηση χρησιμοποιείται για το σήμα εκκίνησης με dht11. Όπως συζητήθηκε προηγουμένως, κάθε επικοινωνία με το DHT11 ξεκινά με ένα σήμα εκκίνησης, εδώ η κατεύθυνση του πείρου αλλάζει αρχικά για να διαμορφώσει τον ακροδέκτη δεδομένων ως έξοδο από τον μικροελεγκτή. Στη συνέχεια, η γραμμή δεδομένων τραβιέται χαμηλά και συνεχίζει να περιμένει τα 18mS. Μετά από αυτό και πάλι η γραμμή γίνεται ψηλά από τον μικροελεγκτή και συνεχίζει να περιμένει έως και 30us. Μετά από αυτόν τον χρόνο αναμονής, η καρφίτσα δεδομένων ορίστηκε ως είσοδος στον μικροελεγκτή για τη λήψη των δεδομένων.
void dht11_init () { DHT11_Data_Pin_Direction = 0; // Διαμόρφωση RD0 ως έξοδος DHT11_Data_Pin = 0; // Το RD0 στέλνει 0 στον αισθητήρα __delay_ms (18). DHT11_Data_Pin = 1; // Το RD0 στέλνει 1 στον αισθητήρα __delay_us (30). DHT11_Data_Pin_Direction = 1; // Διαμόρφωση RD0 ως είσοδος }
Η επόμενη λειτουργία χρησιμοποιείται για τη ρύθμιση ενός bit ελέγχου ανάλογα με την κατάσταση της καρφίτσας δεδομένων. Χρησιμοποιείται για την ανίχνευση της απόκρισης από τον αισθητήρα DHT11.
άκυρο find_response () { Check_bit = 0; __delay_us (40); εάν (DHT11_Data_Pin == 0) { __delay_us (80); εάν (DHT11_Data_Pin == 1) { Check_bit = 1; } __delay_us (50);} }
Τέλος, η λειτουργία ανάγνωσης dht11. Εδώ τα δεδομένα διαβάζονται σε μορφή 8-bit όπου τα δεδομένα επιστρέφονται χρησιμοποιώντας λειτουργία αλλαγής bit ανάλογα με την κατάσταση του pin.
char read_dht11 () { char data, for_count; για (for_count = 0; for_count <8; for_count ++) { while (! DHT11_Data_Pin); __delay_us (30); if (DHT11_Data_Pin == 0) { δεδομένα & = ~ (1 << (7 - για_ονομασία)); // Clear bit (7-b) } αλλιώς { data- = (1 << (7 - for_count)); // Ρύθμιση bit (7-b) ενώ (DHT11_Data_Pin); } } επιστροφή δεδομένων; }
Μετά από αυτό, όλα γίνονται στην κύρια λειτουργία. Κατ 'αρχάς, η αρχικοποίηση του συστήματος γίνεται όταν η LCD αρχικοποιείται και η κατεύθυνση της θύρας των ακίδων LCD έχει ρυθμιστεί στην έξοδο. Η εφαρμογή εκτελείται μέσα στην κύρια λειτουργία
void main () { system_init (); ενώ (1) { __delay_ms (800); dht11_init (); find_response (); εάν (Check_bit == 1) { RH_byte_1 = read_dht11 (); RH_byte_2 = read_dht11 (); Temp_byte_1 = read_dht11 (); Temp_byte_2 = read_dht11 (); Σύνοψη = read_dht11 (); εάν (Summation == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { Υγρασία = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("Temp:"); // lcd_puts (""); lcd_data (48 + ((Υγρασία / 10)% 10)); lcd_data (48 + (Υγρασία% 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("Υγρασία:"); // lcd_puts (""); lcd_data (48 + ((RH / 10)% 10)); lcd_data (48 + (RH% 10)); lcd_puts ("%"); } αλλιώς { lcd_puts ("Σφάλμα Checksum"); } } αλλιώς { clear_screen (); lcd_com (0x80); lcd_puts ("Σφάλμα !!!"); lcd_com (0xC0); lcd_puts ("Χωρίς απόκριση."); } __delay_ms (1000); } }
Η επικοινωνία με τον αισθητήρα DHT11 γίνεται στο εσωτερικό του , ενώ βρόχου, όπου το σήμα έναρξης υποβάλλεται στον αισθητήρα. Μετά από αυτό, ενεργοποιείται η λειτουργία find_response . Εάν το Check_bit είναι 1 τότε η περαιτέρω επικοινωνία πραγματοποιείται διαφορετικά η οθόνη LCD θα εμφανίσει το παράθυρο διαλόγου σφάλματος.
Ανάλογα με τα δεδομένα 40bit, το read_dht11 καλείται 5 φορές (5 φορές x 8bit) και αποθηκεύει τα δεδομένα σύμφωνα με τη μορφή δεδομένων που παρέχεται στο φύλλο δεδομένων. Η κατάσταση ελέγχου ελέγχεται επίσης και εάν εντοπιστούν σφάλματα, θα ειδοποιηθεί επίσης στην οθόνη LCD. Τέλος, τα δεδομένα μετατρέπονται και μεταδίδονται στην οθόνη LCD 16x2 χαρακτήρων.
Μπορείτε να κατεβάσετε τον πλήρη κωδικό για αυτήν τη μέτρηση θερμοκρασίας και υγρασίας PIC από εδώ. Δείτε επίσης το βίντεο επίδειξης που δίνεται παρακάτω.
Ελπίζω να καταλάβατε το έργο και σας άρεσε να φτιάξετε κάτι χρήσιμο. Εάν έχετε οποιεσδήποτε ερωτήσεις αφήστε τις στην παρακάτω ενότητα σχολίων ή χρησιμοποιήστε τα φόρουμ μας για άλλες τεχνικές ερωτήσεις.