Ο αισθητήρας θερμοκρασίας DS18B20
Το DS18B20 είναι ένας ψηφιακός αισθητήρας για την μέτρηση θερμοκρασίας υπό μορφή ολοκληρωμένου κυκλώματος. Η έξοδος του είναι σε βαθμούς Κελσίου με ακρίβεια 9 εως 12 bit. Ο αισθητήρας DS18B20 παρέχει και λειτουργία συναγερμού θερμοκρασίας με προγραμματιζόμενα από το χρήστη πάνω και κάτω όρια θερμοκρασίας. Επειδή διαθέτει μνήμη EEPROM αυτά τα όρια συναγερμού μπορούν να αποθηκευτούν σε αυτή τη μνήμη και να είναι διαθέσιμα σε περίπτωση διακοπής τάσης.
Το DS18B20 μπορεί να επικοινωνεί με τον μικροελεγκτή σειριακά με μια γραμμή δεδομένων και συγκεκριμένα με το πρωτόκολλο 1-Wire. Μπορεί να μετρήσει θερμοκρασίες -55οC έως 125oC, όμως στη περιοχή θερμοκρασιών -10οC έως 85οC με ακρίβεια ±0,5οC.
To DS18B20 μπορεί να τροφοδοτηθεί με τάση με δυο τρόπους: Ο ένας από εξωτερική τάση και ο δεύτερος με την λειτουργία του σε “parasite mode” κατά το οποίο αντλεί ισχύ από τη γραμμή δεδομένων.
Κάθε ένα DS18B20 έχει ενσωματωμένο ένα 64-bit σειριακό κωδικό που επιτρέπει την σύνδεση πολλαπλών DS18B20 στο ίδιο δίαυλο και με αυτό τον τρόπο ο μικροελεγκτής μπορεί να ελέγχει πολλά BS18B20 κατανεμημένα σε μια μεγάλη περιοχή.
Το DS18B20 είναι δομημένο με μια SRAM μνήμη. Στα πρώτα δυο bytes της μνήμης αυτής αποθηκεύεται η τιμή της θερμοκρασίας. Επιπρόσθετα σε αυτή τη μνήμη SRAM περιέχονται τα bytes του πάνω και κάτω ορίου συναγερμού θερμοκρασίας (ΤΗ και ΤL).
Επίσης στην μνήμη SRAM αποθηκεύεται και το byte του καταχωρητή διαμόρφωσης. Ο καταχωρητής διαμόρφωσης επιτρέπει στο χρήστη να ορίσει την ανάλυση του μετατροπέα της θερμοκρασίας σε ψηφιακό σήμα με τιμές 9, 10, 11, ή 12 bits. Τα byte του πάνω και κάτω ορίου συναγερμού θερμοκρασίας μαζί με τον καταχωρητή διαμόρφωσης, μπορούν να αποθηκευτούν εκτός την μνήμη SRAM και σε στη μνήμη EEPROM έτσι ώστε να διατηρούνται τα δεδομένα τους σε περίπτωση διακοπή της τροφοδοσίας.
Λειτουργία-Μέτρηση θερμοκρασίας
Ο αισθητήρας DS18B20 μετρά τη θερμοκρασία δίνοντας την ψηφιακή τιμή της. Η ανάλυση του θερμοκρασιακού αισθητήρα ορίζεται από το χρήστη και μπορεί να είναι 9, 10, 11 ή 12 bits, δηλαδή σε βήματα θερμοκρασίας 0,5οC, 0,25οC, 0,125οC, 0,0625οC αντίστοιχα. Η προκαθορισμένη ανάλυση με την εφαρμογή της τροφοδοσίας είναι 12-bit.
Με την εφαρμογή τάσης στον θερμοκρασιακό αισθητήρα, αυτός μπαίνει σε αδρανή κατάσταση, με χαμηλή κατανάλωση. Για να προκληθεί μια μέτρηση από το DS18B20, από αναλογική σε ψηφιακή τιμή, ο αφέντης (μικροελεγκτής) δίνει την εντολή Convert T [44h] στον αισθητήρα. Αυτό έχει σαν αποτέλεσμα η τιμή της ψηφιακής μέτρησης της θερμοκρασίας να αποθηκευτεί στα δυο bytes του καταχωρητή θερμοκρασίας στην περιοχή μνήμης SRAM και έπειτα το DS18B20 να μπει σε αδρανή κατάσταση.
Εάν ο αισθητήρας τροφοδοτείται από εξωτερική τάση, ο αφέντης μπορεί να ζητήσει να διαβάσει ένα bit μετά την εντολή Convert T [44h] και ο αισθητήρας θα ανταποκριθεί μεταδίδοντας το λογικό 0 όταν είναι σε κατάσταση μέτρησης και λογικό 1 όταν η μέτρηση της θερμοκρασίας έχει ολοκληρωθεί. Αυτό δεν ισχύει όταν ο αισθητήρας τροφοδοτείται μπαίνοντας σε “parasite power”.
Οι τιμές θερμοκρασίας που δίνει το DS18B20 είναι σε βαθμούς Κελσίου. Για τιμές Βαθμών Φαρενάιτ μια ρουτίνα μετατροπής πρέπει να χρησιμοποιηθεί επιπρόσθετα. Οι τιμές της θερμοκρασίας αποθηκεύονται σαν τιμές 12-bit με συμπλήρωμα ως προς δυο, στον 2-byte καταχωρητή θερμοκρασίας στην περιοχή μνήμης; SRAM.
Το bit προσήμου (S) δείχνει αν η θερμοκρασία είναι θετική ή αρνητική. Για θετικές τιμές τίθεται S=0 και για αρνητικές τιμές τίθεται S=1. Εάν το DS18B20 διαμορφωθεί σε 12-bit ανάλυση όλα τα bits του θερμοκρασιακού καταχωρητή έχουν έγκυρα δεδομένα. Για 11-bit ανάλυση το bit0 δεν ορίζεται. Για 10-bit ανάλυση τα bits0 και 1 δεν ορίζονται ενώ για 9-bit ανάλυση τα bits2, 1, 0 δεν ορίζονται.
Λειτουργία – Κατάσταση συναγερμού
Όταν ο αφέντης δώσει εντολή για μέτρηση της θερμοκρασίας, η θερμοκρασιακή μέτρηση του DS18B20 συγκρίνεται με τις δύο τιμές των ορίων συναγερμού θερμοκρασίας ΤΗ και TL οι οποίες είναι τιμές συμπληρώματος ως προς δύο, οι οποίες ορίζονται από το χρήστη. Οι καταχωρητές ΤΗ και TL αποθηκεύονται στα byte2 και 3 της περιοχής μνήμης SRAM καθώς επίσης και στη μνήμη EEPROM για να διατηρηθούν οι τιμές τους σε περίπτωση διακοπή ρεύματος.
64- bit ROM κωδικός αριθμός
Σε κάθε ένα αισθητήρα DS18B20 έχει εκχωρηθεί από το εργοστάσιο παραγωγής μοναδικός κωδικός αριθμός, αποθηκευμένος στη μνήμη ROM. Τα οχτώ λιγότερο σημαντικά ψηφία από αυτόν τον 64-bit κωδικό, αποτελούν τον 1-Wire κωδικό της οικογένειας του DS18B20 και συγκεκριμένα τον 28h. Τα επόμενα 48 bits περιέχουν ένα μοναδικό σειριακό αριθμό. Τα οκτώ περισσότερα σημαντικά ψηφία, περιέχουν το byte του κυκλικού ελέγχου απόρριψης (CRC), ο οποίος υπολογίζεται από τα πρώτα 56 bits του ROM κωδικού. Περαιτέρω εξήγηση για το CRC bits μπορείτε να βρείτε στο datasheet του DS18B20.
Μνήμη
Η περιοχή της μνήμης που είναι τύπου SRAM και είναι οργανωμένη όπως φαίνεται στο σχήμα 7. Τα byte0 και byte1 της περιοχής μνήμης περιέχουν το LSB και MSB του θερμοκρασιακού καταχωρητή αντίστοιχα. Τα byte αυτά είναι μόνο ανάγνωσης. Τα byte2 και byte3 παρέχουν πρόσβαση στους TH και TL καταχωρητές συναγερμού, ενώ το byte4 αντιστοιχεί στον καταχωρητή διαμόρφωσης. Τα byte5, 6, 7 είναι δεσμευμένα για εσωτερική χρήση και δεν μπορούν να γραφούν ενώ επιστρέφουν 1 όταν διαβαστούν. Το byte8 της περιοχής μνήμης περιέχει τον κωδικό του κυκλικού ελέγχου απόρριψης (CRC) για τα bytes0 έως 7 της μνήμης SRAM.
Τα όρια των καταχωρητών συναγερμού θερμοκρασίας γράφονται στα bytes2, 3 της περιοχής της μνήμης SRAM κάνοντας χρήση της εντολής Write Scratchpad [4Eh]. Τα όρια αυτά γράφονται στην περιοχή μνήμης του DS18B20 ξεκινώντας από το λιγότερο σημαντικό bit του byte2.
Για την επαλήθευση εγγραφής των δεδομένων στη μνήμη SRAM, τα δεδομένα μπορούν να διαβαστούν στην μνήμη SRAM με την εντολή Read Scrastchpad [Beh] μετά την εγγραφή τους. Κατά το διάβασμα των δεδομένων της μνήμης SRAM, με αυτή την εντολή, τα δεδομένα μεταφέρονται πάνω στο 1-Wire δίαυλο δεδομένων σειριακά ξεκινώντας από το λιγότερο σημαντικό bit του byte0.
Υπάρχει και η μνήμη EEPROM για την αποθήκευση των δεδομένων των καταχωρητών ΤΗ, ΤL και διαμόρφωσης. Για τη μεταφορά (διάβασμα) των δεδομένων των ΤΗ, ΤL και διαμόρφωσης από τη μνήμη SRAM στη μνήμη EEPROM γίνεται με την εντολή του αφέντη Copy Scratchpad [48h]. Τα δεδομένα στην μνήμη EEPROM διατηρούνται όταν διακόπτεται η τάση τροφοδοσίας. Με την παροχή τροφοδοσίας τα δεδομένα της EEPROM ξαναφορτώνονται στις αντίστοιχες θέσεις στη περιοχή μνήμη SRAM. Ο αφέντης μπορεί να ζητήσει να φορτωθούν τα δεδομένα της μνήμης EEPROM στην περιοχή μνήμης SRAM με την εντολή Recall E2 [B8h] Όταν το DS18B20 τροφοδοτείται από εξωτερική πηγή o αφέντης μπορεί να διαβάζει το bit ακολουθούμενο της εντολής Recall E2 και το DS18B20 ανταποκρίνεται μεταδίδοντας το λογικό 0 όταν η εντολή recall είναι σε κατάσταση εκτέλεσης και το λογικό 1 όταν η εκτέλεση της εντολής recall έχει τελειώσει.
Καταχωρητής διαμόρφωσης
Στην περιοχή της μνήμης SRAM και συγκεκριμένα το byte4 περιέχει τον καταχωρητή διαμόρφωσης (configuration register) που η δομή του είναι όπως στο σχήμα 8. Ο χρήστης μπορεί να διαμορφώσει την ανάλυση της τιμής της θερμοκρασίας ορίζοντας κατάλληλα τον καταχωρητή διαμόρφωσης θέτοντας τις κατάλληλες τιμές στα bits R0 και R1 αυτού του καταχωρητή. Σημειώστε ότι υπάρχει μια σχέση μεταξύ της ανάλυσης και του χρόνου μετατροπής. Το bit7 και τα bits0 έως 4 στον καταχωρητή διαμόρφωσης είναι δεσμευμένα για εσωτερική χρήση του αισθητήρα και δεν μπορούν να γραφούν.
1-WIRE ΔΙΑΥΛΟΣ ΔΕΔΟΜΕΝΩΝ
Ο 1-Wire δίαυλος δεδομένων χρησιμοποιεί ένα αφέντη για τον έλεγχο ενός ή περισσότερους σκλάβους συσκευές. Ο αισθητήρας DS18B20 ορίζεται πάντα ως σκλάβος. Όταν υπάρχει μόνο ένας σκλάβος στον δίαυλο δεδομένων, το σύστημα ονομάζεται “single-drop”. Το σύστημα είναι “multi-drop” όταν υπάρχουν πολλαπλοί σκλάβοι στον δίαυλο δεδομένων. Στον 1-Wire δίαυλο δεδομένων όλα τα δεδομένα και εντολές μεταδίδονται με το λιγότερο σημαντικό ψηφίο πρώτο. Η επόμενη συζήτηση για το 1-Wire δίαυλο δεδομένων χωρίζεται σε τρία μέρη:
Α] Διαμόρφωση υλικού,
Β] Διαδικασία μετάδοσης και τη
Γ] Δομή του 1-Wire σήματος με εφαρμογή ένα AVR μικροελεγκτή.
Α] ΔΙΑΜΟΡΦΩΣΗ ΥΛΙΚΟΥ
Ο 1-Wire δίαυλος δεδομένων έχει μια γραμμή δεδομένων. Κάθε συσκευή (αφέντης ή σκλάβος) συνδέεται στη γραμμή δεδομένων διαμέσου μιας ανοικτού συλλέκτη ή τριών καταστάσεων πόρτα. Αυτό επιτρέπει κάθε συσκευή να “ελευθερώνει” τη γραμμή δεδομένων όταν η συσκευή δεν μεταδίδει δεδομένα, έτσι ώστε η γραμμή δεδομένων να είναι διαθέσιμη για άλλη συσκευή.
Η 1-Wire πόρτα του DS18B20 (το DQ pin) είναι ανοικτού συλλέκτη, με ένα ισοδύναμο εσωτερικό κύκλωμα σαν αυτό που δείχνεται στο σχήμα 10. Ο 1-Wire δίαυλος δεδομένων απαιτεί μια pull-up αντίσταση τιμής 5KΩ, έτσι ώστε η αδρανή κατάσταση του 1-Wire διαύλου είναι high. Εάν ο αφέντης κρατήσει τον δίαυλο δεδομένων σε low περισσότερο από 480μs όλες οι συσκευές πάνω στο δίαυλο αρχικοποιούνται (επαναφέρονται).
Β] ΔΙΑΔΙΚΑΣΙΑ ΜΕΤΑΔΟΣΗΣ
Η σειρά με την οποία γίνεται η επικοινωνία του DS18B20 με τον μικροελεγκτή είναι η ακόλουθη:
Βήμα 1: Αρχικοποίηση
Βήμα 2: Εντολή ROM (Ακολουθούμενη με τα απαραίτητα δεδομένα).
Βήμα 3: Εντολή λειτουργίας του DS18B20 (Ακολουθούμενη με τα απαραίτητα δεδομένα).
Είναι πολύ σημαντικό να ακολουθείται αυτή τη σειρά κάθε φορά που προκαλούμε πρόσβαση στο DS18B20, καθώς το DS18B20 δεν θα ανταποκριθεί, αν κάποιο από τα βήματα επικοινωνίας παραλειφθεί. Εξαιρέσεις σε αυτό τον κανόνα είναι οι εντολές Search ROM [F0h] και Alarm Search [Ech]. Έπειτα που δοθούν αυτές οι εντολές, ο αφέντης πρέπει να επιστρέψει στο βήμα 1 της σειράς επικοινωνίας.
Βήμα 1: Αρχικοποίηση
Η διαδικασία μετάδοσης πάνω στον 1-Wire δίαυλο δεδομένων, ξεκινά με το βήμα της αρχικοποίησης. Η αρχικοποίηση αποτελείται από τον τον παλμό επαναφοράς (αρχικοποίησης) που ζητά ο αφέντης, πάνω στο δίαυλο δεδομένων ακολουθούμενο από τους παλμούς παρουσίας που μεταδίδουν ο (οι) σκλάβος (οι). Ο παλμός παρουσίας επιτρέπει στον αφέντη να γνωρίζει ότι σκλάβοι συσκευές (όπως το DS18B20) είναι πάνω στο δίαυλο δεδομένων και είναι έτοιμες να λειτουργήσουν και να ανταποκριθούν.
Βήμα 2: Εντολές ROM
Έπειτα που ο αφέντης έχει ανιχνεύσει ένα παλμό παρουσίας από κάποιον αισθητήρα DS18B20, μπορεί να ζητήσει από αυτόν μια εντολή ROM. Αυτές οι εντολές ROM δρουν πάνω στο μοναδικό 64-bit ROM κωδικό της κάθε σκλάβου συσκευής και επιτρέπει στον αφέντη να καθορίσει μια συσκευή ή πολλαπλές συσκευές είναι πάνω στο 1-Wire δίαυλο δεδομένων. Αυτές οι εντολές ROM επιτρέπουν, επίσης, στον αφέντη να αναγνωρίσει πόσες και τον τύπο των συσκευών που υπάρχουν πάνω στο δίαυλο δεδομένων ή αν κάποια συσκευή βρίσκεται σε κατάσταση θερμοκρασιακού συναγερμού. Υπάρχουν πέντε εντολές ROM και όλες αυτές οι εντολές έχουν 8-bit μέγεθος. Ο αφέντης πρέπει να δώσει την κατάλληλη εντολή ROM πριν δώσει μια εντολή λειτουργίας του DS18B20.
Search Rom [F0h]
Όταν το σύστημα αρχικά τροφοδοτείται, ο αφέντης πρέπει να διαβάσει τους ROM κωδικούς όλων των σκλάβων συσκευών, πάνω στον δίαυλο δεδομένων, το οποίο επιτρέπει στον αφέντη να καθορίσει τον αριθμό και το τύπο των σκλάβων συσκευών. Αυτό μπορεί να γίνει με την εντολή Search ROM [F0h]. Ο αφέντης μαθαίνει τους ROM κωδικούς διαμέσου μιας διαδικασίας που απαιτεί από τον αφέντη να εκτελεί ένα κύκλο Search ROM όσες φορές χρειάζεται για να αναγνωρίσει όλους τους σκλάβους συσκευές. Εάν υπάρχει μόνο ένας σκλάβος πάνω στο δίαυλο δεδομένων, η απλούστερη εντολή Read ROM [33h] μπορεί να χρησιμοποιηθεί στην θέση της Search ROM διαδικασίας.
Read Rom [33h]
Η εντολή Read ROM [33h] μπορεί να χρησιμοποιηθεί όταν υπάρχει ένας σκλάβος στο δίαυλο δεδομένων. Επιτρέπει στον αφέντη να διαβάσει τον 64-bit ROM κωδικό του σκλάβου χωρίς τη χρήση της Search ROM διαδικασίας. Εάν αυτή η εντολή χρησιμοποιηθεί όταν υπάρχουν περισσότεροι από ένας σκλάβους συσκευές στο δίαυλο δεδομένων, μια σύγκρουση δεδομένων θα συμβεί, καθώς όλοι οι σκλάβοι προσπαθούν να ανταποκριθούν την ίδια χρονική στιγμή.
Match Rom [55h]
Η εντολή Match ROM ακολουθούμενη από τον 64-bit ROM κωδικό, επιτρέπει στον αφέντη να ενεργοποιήσει ένα συγκεκριμένο σκλάβο συσκευή σε ένα multi-drop ή single-drop δίαυλο δεδομένων. Μόνο ο σκλάβος που καθορίζεται από το συγκεκριμένο 64-bit ROM κωδικό θα ανταποκρίνεται σε όλες τις εντολές λειτουργίας που ζητά ο αφέντης, ενώ οι υπόλοιπες σκλάβους συσκευές περιμένουν τον παλμό αρχικοποίησης (επαναφοράς).
Skip Rom [CCh]
Ο αφέντης μπορεί να δώσει την εντολή Skip ROM [Cch] για να ορίσει όλες τις συσκευές του διαύλου δεδομένων ταυτόχρονα χωρίς να στείλει ROM κωδικούς. Για παράδειγμα, ο αφέντης μπορεί να προκαλέσει όλα τα DS18B20 του διαύλου δεδομένων να εκτελέσουν ταυτόχρονα μέτρηση και μετατροπή θερμοκρασίας. Ζητώντας μια Skip ROM εντολή ακολουθούμενη από την εντολή Convert T [44h].
Σημείωση: η εντολή λειτουργίας Read Scratchpad [Beh] μπορεί να ακολουθεί την εντολή Skip ROM μόνο όταν υπάρχει μια σκλάβος συσκευή στο δίαυλο δεδομένων. Σε αυτή την περίπτωση εξοικονομείται χρόνος στον αφέντη για να διαβάζει από τον σκλάβο, χωρίς να στείλει τον 64-bit ROM κωδικό. Η εντολή Skip ROM ακολουθούμενη από την εντολή Read Scratchpad θα προκαλέσει σύγκρουση δεδομένων στο δίαυλο δεδομένων όταν υπάρχουν περισσότεροι από ένα σκλάβοι από την στιγμή που υπάρχουν πολλαπλοί σκλάβοι θα προσπαθήσουν να μεταδώσουν δεδομένα ταυτόχρονα.
Alarm Search [Ech]
Η λειτουργία της εντολής Alarm Search [Ech] είναι πανομοιότυπη με την λειτουργία της εντολής Search ROM, εκτός από το ότι μόνο οι σκλάβοι με ενεργοποιημένοι τη σημαία συναγερμού θερμοκρασίας θα ανταποκριθούν. Αυτή η εντολή επιτρέπει στον αφέντη να καθορίσει εάν κάποιο DS18B20 βρίσκεται σε κατάσταση συναγερμού στην πρόσφατη μέτρηση και μετατροπή της θερμοκρασίας. Μετά από κάθε κύκλο Alarm Search, ο αφέντης πρέπει να επιτρέψει στο βήμα 1 (αρχικοποίηση) της διαδικασία μετάδοσης.
Βήμα 3: Εντολές λειτουργίας του DS18B20
Μετά που ο αφέντης έχει χρησιμοποιήσει μια εντολή ROM, για να ορίσει το DS18B20 που επιθυμεί να επικοινωνήσει, ο αφέντης μπορεί να δώσει μια εντολή λειτουργίας του DS18B20. Αυτές οι εντολές λειτουργίας επιτρέπουν στον αφέντη να γράψει και να διαβάσει από την περιοχή της μνήμης του DS18B20, να αρχίσει τη μέτρηση και μετατροπή της θερμοκρασίας και να καθορίσει τον τρόπο τροφοδοσίας.
Convert T [44h]
Με αυτή την εντολή αρχίζει μια απλή μέτρηση και μετατροπή θερμοκρασίας. Τα ψηφιακά αποτελέσματα αυτής της εντολής αποθηκεύονται στον 2-byte καταχωρητή θερμοκρασίας, στην περιοχή μνήμης (SRAM byte 1, 0) και μετά το DS18B20 επιστρέφει σε αδρανή κατάσταση. Εάν το DS18B20 τροφοδοτείται από εξωτερική πηγή, ο αφέντης μπορεί να διαβάσει το bit εκείνη τη στιγμή στο δίαυλο δεδομένων, μετά την εντολή Convert T και το DS18B20 ανταποκρίνεται μεταδίδοντας 0 όταν βρίσκεται ακόμη σε κατάσταση μέτρησης και μετατροπής θερμοκρασίας και 1 αν η μέτρηση και μετατροπή έχει ολοκληρωθεί. Όταν τροφοδοτείται με “parasite power” αυτή η λειτουργία δεν μπορεί να χρησιμοποιηθεί.
Write Scratchpad [4Eh]
Αυτή η εντολή επιτρέπει στον αφέντη να γράψει τρία byte δεδομένων στην περιοχή μνήμης του DS18B20. Το πρώτο byte γράφεται στο ΤΗ καταχωρητή (byte2 της περιοχή μνήμης) το δεύτερο byte γράφεται στο TL καταχωρητή (byte3) και το τρίτο byte γράφεται στον καταχωρητή διαμόρφωσης (byte4). Τα δεδομένα μεταδίδονται πρώτα το λιγότερο σημαντικό bit. Όλα και τα τρία bytes πρέπει να γραφούν πριν ο αφέντης ζητήσει εντολή αρχικοποίησης (επαναφοράς).
Read Scratchpad [BEh]
Με αυτή την εντολή ο αφέντης διαβάζει τα περιεχόμενα της περιοχή μνήμης. Τα δεδομένα μεταφέρονται ξεκινώντας από το λιγότερο σημαντικό bit του byte0 και συνεχίζονται μέχρι το ένατο byte (byte8 -CRC) της περιοχή μνήμης. Ο αφέντης μπορεί να ζητήσει εντολή αρχικοποίησης (επαναφοράς) για να διακόψει το διάβασμα οποιαδήποτε στιγμή, εάν μόνο ένα τμήμα της περιοχή μνήμης χρειάζεται να διαβαστεί.
Copy Scratchpad [48h]
Αυτή η εντολή αντιγράφει τα περιεχόμενα των καταχωρητών ΤΗ, ΤL και διαμόρφωσης που αντιστοιχούν στα bytes 2, 3 και 4 της περιοχής της μνήμης προς την μνήμη EEPROM. Αν το DS18B20 λειτουργεί σε “parasite power mode” μέσα σε χρόνο 10μs το μέγιστο, μετά αυτή την εντολή ο αφέντης πρέπει να ενεργοποιήσει δυνατό τράβηγμα pull-up στον 1-Wire δίαυλο δεδομένων, με διάρκεια το λιγότερο 10ms.
Recall E2 [B8h]
Με αυτή την εντολή αντιγράφονται τα όρια του θερμοκρασιακού συναγερμού (ΤΗ και ΤL) και τα δεδομένα του byte διαμόρφωσης από την μνήμη EEPROM στα bytes2, 3 και 4 αντίστοιχα στη περιοχή της μνήμης. Ο αφέντης μετά την εντολή Recall E2 μπορεί να να διαβάζει το bit του διαύλου δεδομένων και το DS18B20 ανταποκρίνεται με 0 όταν η εντολή Recall E2 είναι σε διαδικασία εκτέλεσης και 1 όταν έχει ολοκληρωθεί. Η λειτουργία recall εκτελείται αυτόματα μόλις τροφοδοτηθεί με τάση το DS18B20 έτσι ώστε τα δεδομένα να είναι διαθέσιμα μέσα στη περιοχή μνήμης με την αρχή τροφοδοσίας του DS18B20.
Read Power Supply [B4h]
Ο αφέντης μπορεί να δώσει αυτή την εντολή και μετά να διαβάσει το bit της γραμμής δεδομένων, για να του γνωστοποιηθεί έναν κάποιο DS18B20 πάνω στο δίαυλο δεδομένων λειτουργεί με τροφοδοσία “parasite power”. Κατά τη διάρκεια του διαβάσματος του bit, τα DS18B20 που βρίσκονται σε κατάσταση “parasite mode” τραβούν το δίαυλο δεδομένων σε low ενώ αυτά που τροφοδοτούνται από εξωτερική πηγή αφήνουν το δίαυλο δεδομένων σε high. Εάν ο δίαυλος δεδομένων τραβηχτεί σε low, ο αφέντης γνωρίζει ότι θα πρέπει να τροφοδοτήσει με δυνατό pull-up στον 1-Wire δίαυλο δεδομένων κατά τη διάρκεια θερμοκρασιακών μετρήσεων και μετατροπών.
Γ] ΕΠΙΚΟΙΝΩΝΙΑ ΤΟΥ DS18B20 ΜΕ ΤΟΝ ΜΙΚΡΟΕΛΕΓΚΤΗ AVR
Ο αισθητήρας DS18B20 (σκλάβος) μπορεί και επικοινωνεί με ένα μικροελεγκτή Arduino διαμέσου του πρωτοκόλλου 1-Wire. Σε αυτό το πρωτόκολλο, διάφοροι τύποι σημάτων ορίζονται: παλμός επαναφοράς, παλμός παρουσίας, εγγραφή του ψηφίου 0, εγγραφή του ψηφίου 1, διάβασμα του ψηφίου 0 και διάβασμα του ψηφίου 1. Σε αυτό το κείμενο, θεωρούμε την σύνδεση του μικροελεγκτή Arduino Nano με τον αισθητήρα DS18B20. Για να είναι ο κώδικας που θα γράψουμε κατανοητός και ξεκάθαρος, συνιστώ να χρησιμοποιήσετε τις επόμενες ντιρεκτίβες στην αρχή του προγράμματος σας για το Arduino, οι οποίες ορίζουν τις απαραίτητες σταθερές γι την καλή λειτουργία του sketch μας.
#define PIN 12
#define THERM_CMD_CONVERTTEMP 0x44
#define THERM_CMD_RSCRATCHPAD 0xbe
#define THERM_CMD_SKIPROM 0xcc
Επίσης θα χρειαστεί να εισάγουμε την βιβλιοθήκη, έτσι ώστε να μπορούμε μα απεικονίζουμε δεδομένα στην οθόνη lcd:
#include <LiquidCrystal.h>
Kαι πρέπει να δημιουργήσουμε το αντικείμενο:
LiquidCrystal lcd(0,1, 2, 3, 4, 5); // pins RS, E, DB4, DB5, DB6, DB7
Προσοχή: τα ορίσματα PS, E, DB4, DB5, DB6, DB7 εξαρτούνται με τον τρόπο που συνδέουμε το Arduino με την οθόνη υγρών κρυστάλλων.
Για να μπορέσει το lcd να επικοινωνήσει με το Arduino, για την απεικόνιση της θερμοκρασίας, είναι απαραίτητες οι επόμενες συναρτήσεις:
void thermInputMode(){
pinMode(PIN, INPUT);
}
void thermOutputMode(){
pinMode(PIN, OUTPUT);
}
void thermLow(){
digitalWrite(PIN, 0);
}
void thermHigh(){
digitalWrite(PIN, 1);
}
ΑΡΧΙΚΟΠΟΙΗΣΗ: ΠΑΛΜΟΙ ΕΠΑΝΑΦΟΡΑΣ ΚΑΙ ΠΑΛΜΟΙ ΠΑΡΟΥΣΙΑΣ
Όλη η επικοινωνία με το DS18B20 αρχίζει με τη διαδικασία αρχικοποίησης που αποτελείται από την αποστολή του παλμού επαναφοράς από τον αφέντη (μικροελεγκτή) ακολουθούμενος από τον παλμό παρουσίας από το DS18B20. Όταν ο αισθητήρας DS18B20 στείλει το παλμό παρουσίας σαν ανταπόκριση στο παλμό επαναφοράς του αφέντη, ο σκλάβος (DS18B20) γνωστοποιεί στον αφέντη ότι είναι πάνω στον δίαυλο δεδομένων και ότι είναι έτοιμος να λειτουργήσει.
Κατά τη διάρκεια της διαδικασίας αρχικοποίησης ο αφέντης μεταδίδει (ΤΧ) τον παλμό επαναφοράς με τράβηγμα του 1-Wire διαύλου δεδομένων σε κατάσταση low, το λιγότερο για χρονικό διάστημα 480μs. Μετά ο αφέντης ελευθερώνει το δίαυλο δεδομένων και μπαίνει σε κατάσταση διαβάσματος (RX). Καθώς ο δίαυλος δεδομένων ελευθερώνεται η 5ΚΩ αντίσταση pull-up τραβά τον 1-Wire δίαυλο δεδομένων σε κατάσταση high. Όταν το DS18B20 ανιχνεύσει αυτή την ακμή της ανόδου της τάσης, περιμένει για χρονικό διάστημα από 15μs έως 60μs και μετά μεταδίδει τον παλμό παρουσίας, τραβώντας τον 1-Wire δίαυλο δεδομένων σε κατάσταση low για χρονικό διάστημα από 60μs έως 240μs.
Ο κώδικας σε γλώσσα Arduino της παραπάνω διαδικασίας αρχικοποίησης, δίνεται παρακάτω:
byte thermReset(){
noInterrupts();
byte i;
thermOutputMode();
thermLow();
delayMicroseconds(480);
thermInputMode();
delayMicroseconds(60);
i=digitalRead(PIN);
delayMicroseconds(420);
interrupts();
return i;
}
READ/WRITE SLOTS
Ο αφέντης γράφει δεδομένα στο DS18B20 κατά τη διάρκεια “write time slots” και διαβάζει δεδομένα από το DS18B20 κατά τη διάρκεια “read time slots”. Ένα bit δεδομένων μεταφέρεται πάνω στον 1-Wire δίαυλο δεδομένων κατά τη διάρκεια ενός “write time slot” ή ενός “read time slot”
Write time slots
Υπάρχουν δυο τύποι “write time slots” το “write 1” και το “write 0”. Ο αφέντης χρησιμοποιεί το “write 1 time slot” για να γράψει το λογικό 1 στο DS18B20 και το “write 0 time slot” για να γράψει το λογικό 0 στο DS18B20. Όλα τα “write time slots” πρέπει να έχουν το λιγότερο χρονική διάρκεια 60μs και το λιγότερο 1μs χρονική απόσταση μεταξύ δυο ανεξάρτητων “write slots”. Και οι δυο τύποι “write slots” αρχίζουν από τον αφέντη τραβώντας την 1-Wire γραμμή δεδομένων σε κατάσταση low.
Για τη δημιουργία του “write 1 time slot” ο αφέντης τραβά την 1-Wire γραμμή low και θα πρέπει να την ελευθερώσει μετα από χρόνο 15μs. Καθώς η γραμμή ελευθερώνεται, η 5ΚΩ pull-up αντίσταση τράβα το δίαυλο δεδομένων σε κατάσταση high. Για την δημιουργία του “write 0 time slot” μετά το τράβηγμα από τον αφέντη τη γραμμή δεδομένων σε κατάσταση low, ο αφέντης πρέπει να συνεχίσει να την κρατά σε κατάσταση low για χρονικό διάστημα ενός “time slot” (το λιγότερο 60μs). Το DS18B20 δειγματοληπτεί την 1-Wire γραμμή δεδομένων κατά την διάρκεια ενός χρονικού παραθύρου που διαρκεί από 15μs εως 60μs μετά που ο αφέντης αρχίζει το “write time slot” Εάν η γραμμή δεδομένων είναι σε κατάσταση high κατά τη διάρκεια του δειγματοληπτικού παραθύρου, το λογικό 1 γράφεται στο DS18B20. Εάν η γραμμή δεδομένων είναι σε κατάσταση low, το λογικό 0 γράφεται στο DS18B20.
Read time slots
Το DS18B20 μπορεί να μεταδίδει δεδομένα στον αφέντη, όταν ο αφέντης δημιουργεί “read time slots”. Επομένως ο αφέντης δημιουργεί “read time slots” αμέσως μετά την εντολή Read Scratchpad [Beh] ή Read Power Supply [B4h], έτσι ώστε το DS18B20 να παρέχει τα αιτούμενα δεδομένα. Επιπρόσθετα ο αφέντης μπορεί να δημιουργήσει “read time slot” μετά την εντολή Convert T [44h] ή την Recall E2 [B8h] για να ανιχνεύσει την κατάσταση εκτέλεσης εντολής στο DS18B20.
Όλες οι “read time slots” πρέπει να έχουν το λιγότερο χρονική διάρκεια 60μs και το ελάχιστο χρονικό διάστημα 1μs μεταξύ των “read slots”. Ένα “read time slot” αρχίζει από τον αφέντη τραβώντας την 1-Wire γραμμή δεδομένων σε κατάσταση low το λιγότερο 1μs και μετά ο αφέντης ελευθερώνει την γραμμή (βλέπε το διάγραμμα). Μετά που ο αφέντης αρχίσει ένα “read time slot”, το DS18B20 ανταποκρίνεται μεταδίδοντας το λογικό 1 ή το λογικό 0 στη γραμμή δεδομένων. Το DS18B20 μεταδίδει το λογικό 1 αφήνοντας τη γραμμή δεδομένων σε κατάσταση high και μεταδίδει το λογικό 0 τραβώντας τη γραμμή δεδομένων σε κατάσταση low. Όταν μεταδίδει το λογικό 0 το DS18B20 θα ελευθερώσει τη γραμμή δεδομένων στο τέλος του “time slot” και τότε η γραμμή δεδομένων θα τραβηχτεί σε κατάσταση high με την pull-up αντίσταση μπαίνοντας σε αδρανή κατάσταση. Τα δεδομένα από την έξοδο του DS18B20 είναι έγκυρα για 15μs μετά την πτώση σε low της αρχής του “read time slot”. Επομένως, ο αφέντης πρέπει να ελευθερώσει τη γραμμή δεδομένων μέσα σε χρόνο 15μs μετά την αρχή του “read time slot” και μετά να δειγματοληπτήσει τη γραμμή δεδομένων.
ΛΕΙΤΟΥΡΓΙΑ READ / WRITE
Θα σας δείξουμε πως να κάνετε συναρτήσεις στην Arduino, οι οποίες θα γράφουν και θα διαβάζουν ανεξάρτητα bits από το DS18B20 και μετά άλλες συναρτήσεις με τις οποίες διαβάζουν και θα γράφουν ολόκληρα bytes.
Διαβάζοντας / γράφοντας ανεξάρτητα bits
Κατά την διαδικασία εγγραφής, τραβάμε τη γραμμή δεδομένων σε κατάσταση low κατά το ξεκίνημα. Εάν θέλουμε να γράψουμε το λογικό 0 θα κρατήσουμε τη γραμμή δεδομένων σε κατάσταση low μέχρι το τέλος της χρονικής διάρκειας (60μs), αλλά αν θέλουμε να γράψουμε το λογικό 1, μετά την αρχή με μια καθυστέρηση 1μs ελευθερώνουμε τη γραμμή. Μια υλοποίηση σε γλώσσα Arduino δείχνεται ακολούθως.
void thermWriteBit(byte num){
noInterrupts();
thermOutputMode();
thermLow();
delayMicroseconds(2);
if(num) thermInputMode();
delayMicroseconds(60);
thermInputMode();
interrupts();
}
Από την άλλη μεριά, έχουμε τη διαδικασία διαβάσματος. Είναι αρκετά όμοια, αλλά έχει μερικές διαφορές. Ξεκινάμε τραβώντας τη γραμμή δεδομένων σε κατάσταση low για χρονικό διάστημα 1μs. Μετά πρέπει να ελευθερώσουμε τη γραμμή δεδομένων και να περιμένουμε για 14μs (14+1=15μs όπως φαίνεται στο διάγραμμα). Μετά από αυτό, μπορούμε να διαβάσουμε την τιμή της γραμμής δεδομένων, η οποία θα είναι σε κατάσταση high όταν το DS18B20 μεταδίδει το λογικό 1 και σε κατάσταση low όταν μεταδίδει το λογικό 0. Στο τέλος πρέπει να περιμένουμε 45μs μέχρι το τέλος του χρονικού διαστήματος των 60μs. Μια υλοποίηση σε γλώσσα Arduino δείχνεται ακολούθως.
byte thermReadBit(){
nointerrupts();
byte num=0;
thermOutputMode();
thermLow();
delayMicroseconds(2);
thermInputMode();
delayMicroseconds(14);
if(digitalRead(PIN)) num=1;
delayMicroseconds(45);
interrupts():
return num;
}
Διαβάζοντας / γράφοντας bytes
Τώρα που μπορούμε να διαβάσουμε ή να γράψουμε ανεξάρτητα bits, για να διαβάσουμε ή η να γράψουμε bytes είναι αρκετά εύκολο: Κάνουμε βρόγχους των οκτώ κύκλων και αποθηκεύουμε τα αποτελέσματα σε μια μεταβλητή. Μια υλοποίηση σε γλώσσα Arduino δείχνεται ακολούθως.
byte thermReadByte(){
noInterrupts();
byte i=8, n=0;
while(i--){
n>>=1;
n|=(thermReadBit()<<7);
}
interrupts();
return n;
}
void thermWriteByte(byte num){
noInterrupts();
byte i=8;
while(i--){
thermWriteBit(num&1);
num>>=1;
}
interrupts();
}
ΤΟ ΤΕΛΕΥΤΑΙΟ ΒΗΜΑ: ΔΙΑΒΑΖΟΝΤΑΣ ΤΗ ΘΕΡΜΟΚΡΑΣΙΑ
Τώρα που μπορούμε να γράψουμε και να διαβάσουμε από το θερμόμετρο DS18B20, είναι ώρα να μάθουμε πως να διαβάζουμε τη θερμοκρασία. Η θερμοκρασία αποθηκεύεται στα πρώτα δυο bytes της περιοχής μνήμης του D18B20, η οποία είναι μεγέθους εννέα bytes. Τώρα είναι η ώρα να κάνουμε υλοποίηση της διαδικασία διαβάσματος της θερμοκρασίας σε γλώσσα Arduino.
Όλες οι απαραίτητες συναρτήσεις για το διάβασμα της θερμοκρασίας από τον αισθητήρα και η απεικόνιση της στην οθόνη lcd βρίσκονται μέσα στη συνάρτηση loop() οι οποίες εκτελούνται επαναλαμβανόμενα κάθε ενα δευτερόλεπτο με την απεικόνιση της θερμοκρασίας.
Ο κώδικας που ακολουθεί λειτουργεί για ένα αισθητήρα DS18B20 στην γραμμή δεδομένων και διαμορφώθηκε για ανάλυση 12-bits.
void loop() {
thermReset();
thermWriteByte(THERM_CMD_SKIPROM);
thermWriteByte(THERM_CMD_CONVERTTEMP);
while(!thermReadBit());
thermReset();
thermWriteByte(THERM_CMD_SKIPROM);
thermWriteByte(THERM_CMD_RSCRATCHPAD);
tempLow=tempHigh=0;
tempLow=thermReadByte();
tempHigh=thermReadByte();
tempValue=0;
tempValue = tempLow>>4;
tempValue |= ( (tempHigh & 7) << 4);
lcd.clear();
lcd.print(tempValue, DEC);
delay(1000);
}
Στη συνάρτηση setup( ) αρχικοποιούμε και καθαρίζουμε την μονάδα απεικόνισης Lcd οπως φαίνεται στον ακόλουθο κώδικα:
void setup() {
lcd.begin(16, 2);
lcd.clear();
}
Εγγραφή κώδικα
Τα παραπάνω κομμάτια κώδικα μπορείτε να τα ενώσετε μαζί για γράψετε ένα sketch για το Arduino που θα μετρά τη θερμοκρασία περιβάλλοντος με τον αισθητήρα τύπου DS18B20
Για να μπορέσετε να μετρήσετε τη θερμοκρασία πιο εύκολα τοποθετήστε τις συναρτήσεις σε μια βιβλιοθήκη που θα πρέπει να την ενσωματώσετε στο περιβάλλον Arduino IDE. Μπορείτε να την κατεβάσετε κάνοντας κλικ εδώ.
Τοποθετήστε το αρχείο zip που θα κατεβάσατε σε κάποια θέσει στον υπολογιστή σας και ενσωματώσετε το στο περιβάλλον Arduino με την εντολή Σχέδιο>Συμπερίληψη Βιβλιοθήκης>Προσθήκη βιβλιοθήκης ZIP.
Για να μετρήσουμε τη θερμοκρασία κάνοντας χρήση την καινούργια βιβλιοθήκη ds18b20pl γράψτε το ακόλουθο απόσπασμα κώδικα:
#include "ds18b20pl.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(0,1, 2, 3, 4, 5);
ds18b20pl temp(12);
byte temperature=0;
void setup() {
lcd.begin(16, 2);
lcd.clear();
}
void loop() {
temperature=temp.getTemperature();
lcd.clear();
lcd.print("Temperature");
lcd.print(temperature)
delay(1000);
}