Αισθητήρας θερμοκρασίας I2C LM75
Λειτουργική αρχή
El IC Το LM75 είναι ένα αισθητήρας θερμοκρασίας διάκενου ζώνης ημιαγωγών πυριτίου.
Στους ημιαγωγούς, το απαγορευμένη μπάντα Είναι η ενεργειακή ζώνη των ηλεκτρονίων που δεν μπορεί να αυξηθεί με την αύξηση του ηλεκτρικού πεδίου καθώς δεν υπάρχουν διαθέσιμες καταστάσεις για να κινηθούν πιο γρήγορα. Αυτό απαγορευμένη μπάντα περιλαμβάνεται μεταξύ των ζώνη σθένους (χαμηλότερη ενέργεια) και το οδηγική μπάντα (υψηλότερη ενέργεια). Η θερμική διέγερση (η αύξηση της θερμοκρασίας, για τους σκοπούς που μας ενδιαφέρει) μπορεί να προκαλέσει ορισμένα ηλεκτρόνια να αποκτήσουν αρκετή ενέργεια για να περάσουν στο οδηγική μπάντα.
Όπως εξηγήθηκε στο προηγούμενο άρθρο σχετικά με το ηλεκτρονική μέτρηση θερμοκρασίας, στα μέταλλα, αν και ο αριθμός των φορέων δεν εξαρτάται από τη θερμοκρασία (όλα τα ηλεκτρόνια είναι πάντα διαθέσιμα), η κινητικότητά τους επηρεάζεται από τη θερμοκρασία, έτσι ώστε η αντίσταση στα μέταλλα αυξάνεται με τη θερμοκρασία λόγω της μείωσης της ταχύτητας των ηλεκτρονίων λόγω την αύξηση τους θερμική ανάδευση και τη σκέδαση των ηλεκτρονίων που παράγει.
Στην περίπτωση των ημιαγωγών, λόγω της παρουσίας αυτού απαγορευμένη μπάντα Ο αριθμός των φορέων εξαρτάται από τη θερμοκρασία (ανάλογα με το Κατανομή Fermi–Dirac) προκαλώντας αύξηση της αγωγιμότητας με τη θερμοκρασία. Στους ημιαγωγούς, η αύξηση της θερμοκρασίας προκαλεί αύξηση της αντίστασης αλλά προκαλεί και (περαιτέρω) αύξηση της αγωγιμότητας.
Ο αισθητήρες θερμοκρασίας ζώνης ημιαγωγών πυριτίου, όπως στην περίπτωση του LM75, λειτουργήστε σύμφωνα με αυτήν την αρχή, επιτρέποντας τον προσδιορισμό της θερμοκρασίας ποσοτικοποιώντας την επιρροή της στην τάση σε μια δίοδο πυριτίου.
LM75 Εξαρτήματα υλικού
Το LM75 έχει επίσης ένα αναλογικός-ψηφιακός μετατροπέας με διαμόρφωση Sigma-Delta η οποία είναι υπεύθυνη για τη λήψη της αριθμητικής (ψηφιακής) τιμής της θερμοκρασίας, μια τιμή που στη συνέχεια αποθηκεύεται (κάθε 100 ms) σε έναν από τους καταχωρητές του από τον οποίο μπορεί να διαβαστεί μέσω του διαύλου I2C.
Εκτός από τον καταχωρητή που περιέχει τη μετρούμενη θερμοκρασία, το LM75 διαθέτει έναν καταχωρητή στον οποίο μπορεί να αποθηκευτεί μια μέγιστη θερμοκρασία καθώς και έναν συγκριτή που είναι ικανός να παράγει ένα σήμα εάν η μετρούμενη θερμοκρασία υπερβαίνει αυτή που είναι αποθηκευμένη σε αυτόν τον δεύτερο καταχωρητή. Για να μην ξεκινήσει ξανά η προειδοποίηση έως ότου η μετρούμενη θερμοκρασία πέσει κάτω από ένα ορισμένο επίπεδο, ένας τρίτος καταχωρητής επιτρέπει την αποθήκευση μιας τιμής για τη θερμοκρασία του υστέρηση.
Η διαμόρφωση της λειτουργίας LM75 αποθηκεύεται σε έναν τέταρτο καταχωρητή με τον οποίο καθορίζονται οι συνθήκες υπό τις οποίες δημιουργείται η προειδοποίηση, ο τρόπος εκκίνησης αυτού του προειδοποιητικού σήματος (λειτουργία διακοπής ή λειτουργία σύγκρισης) καθώς και η ενεργοποίηση της συσκευής (λειτουργία). κανονική λειτουργία ή χαμηλή κατανάλωση) μεταξύ άλλων παραμέτρων.
Τεχνικές προδιαγραφές και υλοποίηση του LM75
Το εύρος θερμοκρασιών που μπορεί να μετρήσει το LM75 ποικίλλει από -55 °C έως +125 °C και η αριθμητική ανάλυση είναι 0.125 °C, αν και η ακρίβεια είναι μόνο ±2 °C στην καλύτερη περίπτωση, όταν η θερμοκρασία είναι μεταξύ − 25 °C και +100 °C και ακρίβεια ±3 °C με τις πιο ακραίες θερμοκρασίες, μεταξύ -55 °C και +125 °C.
Η υλοποίηση (hardware) του LM75 σε ένα κύκλωμα είναι πολύ απλή, δεν χρειάζεται περισσότερα εξαρτήματα από τις αντιστάσεις Τραβήξτε del λεωφορείο I2C και μπορεί να τροφοδοτηθεί με τάση μεταξύ 2,8 V και 5,5 V. Στο ίδιο λεωφορείο I2C Μπορούν να τακτοποιηθούν έως και οκτώ θερμόμετρα LM75 διαμορφώνοντας τη διεύθυνσή τους με τις τρεις ακίδες A0, A1 και A2 σε υψηλό ή χαμηλό επίπεδο, όπως συνήθως σε αυτές τις περιπτώσεις.
Από την άλλη πλευρά, η χρήση του LM75 ως ανιχνευτή είναι άβολη λόγω των συσκευασιών στις οποίες παρουσιάζεται, ΤΣΣΟΠ (TSSOP8) Ή ΣΟΙΚ (SO8) και χρησιμοποιείται συνήθως για τη μέτρηση της θερμοκρασίας περιβάλλοντος ή για τη μέτρηση της θερμοκρασίας των εξαρτημάτων που είναι διατεταγμένα στο περιβάλλον του PCB στο οποίο βρίσκεται το θερμόμετρο LM75.
Κατά την εκκίνηση, το LM75 έχει ρυθμιστεί να ανιχνεύει μέγιστη θερμοκρασία +80°C, θερμοκρασία υστέρηση +75 °C και τον τρόπο λειτουργίας σύγκρισης, δηλαδή τον τρόπο λειτουργίας που μιμείται τη λειτουργία ενός θερμοστάτη: ενεργοποιεί την προειδοποίηση όταν επιτευχθεί η μέγιστη θερμοκρασία και μόνο εάν πέσει κάτω από το υστέρηση Αναγεννά την ειδοποίηση.
Εκμετάλλευση του LM75 από μικροελεγκτή μέσω του διαύλου I2C
Χάρη στη χρήση του λεωφορείο I2C Η λειτουργία του LM75 είναι πολύ απλή, απλώς αποκτήστε πρόσβαση στη διεύθυνση που καταλαμβάνει στο λεωφορείο για να αποθηκεύσετε ή να διαβάσετε τη διαμόρφωση και να λάβετε την τιμή της μετρούμενης θερμοκρασίας.
Η διεύθυνση I2C Η βάση του LM75 είναι 0B01001XXX και συμπληρώνεται, όπως εξηγήθηκε παραπάνω, από τα τρία τελευταία bit διεύθυνσης που ορίζονται από το υλικό με τις ακίδες A0, A1 και A2 υψηλό (τιμή ένα) ή χαμηλό (τιμή μηδέν).
Το LM75 ως θερμόμετρο
Ο καταχωρητής που αποθηκεύει την τελευταία μετρούμενη θερμοκρασία (TEMP) βρίσκεται στη διεύθυνση 0x00, ο καταχωρητής διαμόρφωσης (CONF) βρίσκεται στη διεύθυνση 0x01, ο καταχωρητής που αποθηκεύει τη θερμοκρασία του υστέρηση στη διεύθυνση 0x02 και η μέγιστη ή υπερθερμοκρασία (TOS) έχει διεύθυνση 0x03. Εκτός από την τρέχουσα θερμοκρασία (TEMP), όλες λειτουργούν ως ανάγνωση και εγγραφή.
Χρησιμοποιώντας ορισμένα παραδείγματα κώδικα που αναπτύχθηκαν για Arduino (που έχει γίνει σχεδόν καθολική αναφορά) η λειτουργία του LM75 μπορεί να διευκρινιστεί περαιτέρω. Το πιο βασικό χρήσιμο παράδειγμα είναι να χρησιμοποιήσετε το LM75 ως θερμόμετρο διαβάζοντας την εγγραφή της τελευταίας μετρημένης θερμοκρασίας.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#define DIRECCION_LM75 0B01001000 // Dirección del LM75 con A0, A1 y A2 a nivel bajo
#define TEMPERATURA_ACTUAL_LM75 0x00 // Registro que almacena la temperatura medida
//#define TIEMPO_CONVERSION_LM75 100 // El LM75 convierte la temperatura (AD) cada 100 ms así que el intervalo entre lecturas debe ser mayor.
#define TIEMPO_ENTRE_LECTURAS_DE_TEMPERATURA 3000 // Intervalo entre lecturas consecutivas de la temperatura en ms
#include <Wire.h>
int temperatura; // Valor de la temperatura actual cargado del LM75
void setup()
{
Serial.begin(9600); // Inicializar las comunicaciones serie (para mostrar en la consola el valor de la temperatura)
Wire.begin(); // Inicializar las comunicaciones I2C
}
void loop()
{
Wire.beginTransmission(DIRECCION_LM75); // Acceder al LM75 por su dirección en el bus I2C
Wire.write(TEMPERATURA_ACTUAL_LM75); // Solicitar la lectura del registro de la temperatura actual
Wire.endTransmission(); // Liberar el bus I2C
Wire.requestFrom(DIRECCION_LM75,2); // Pedir dos bytes (el valor del registro de la temperatura actual)
temperatura=(Wire.read()<<8)|Wire.read(); // Leer el primer byte, rotarlo 8 posiciones y añadir el valor del segundo byte
Wire.endTransmission(); // Liberar el bus I2C
Serial.println((float)temperatura/32/8,DEC); // Sólo son relevantes los 11 bits más significativos con una precisión de un octavo de grado (1/8 = 0.125 °C)
delay(TIEMPO_ENTRE_LECTURAS_DE_TEMPERATURA); // Esperar un poco antes de volver a leer la temperatura
}
|
Η διαδικασία είναι η συνηθισμένη όταν εργάζεστε με μια συσκευή I2C:
- Προσθέστε τη βιβλιοθήκη I2C στον κωδικό με
#include <Wire.h>
- Αρχικοποιήστε τη βιβλιοθήκη I2C χρησιμοποιώντας
Wire.begin();
- Αποκτήστε πρόσβαση στον αισθητήρα θερμοκρασίας LM75 χρησιμοποιώντας
Wire.beginTransmission(DIRECCION_LM75)
- Στείλτε τη διεύθυνση του μητρώου στο οποίο έχετε πρόσβαση χρησιμοποιώντας
Wire.write(REGISTRO)
- Αφήστε το λεωφορείο I2C με
Wire.endTransmission()
- Αποκτήστε πρόσβαση στο LM75
- Ζητήστε την τιμή μητρώου με
Wire.requestFrom(DIRECCION,CANTIDAD)
- Βεβαιωθείτε ότι τα δεδομένα έχουν ληφθεί χρησιμοποιώντας
Wire.available()
- Διαβάστε την ζητούμενη τιμή
Wire.read()
(όσες φορές το αποτελούν τα byte) - Αν και δεν είναι απαραίτητο, όταν τελειώσετε, αφήστε το λεωφορείο I2C
Εκτός από το συνηθισμένο πρωτόκολλο για τη λήψη ή την αποθήκευση πληροφοριών στα αρχεία καταγραφής συσκευών χρησιμοποιώντας το λεωφορείο I2C, για να εκμεταλλευτούμε τα δεδομένα που παρέχει το LM75, είναι απαραίτητο να εξετάσουμε τη μορφή με την οποία αναπαριστά εσωτερικά τη θερμοκρασία.
Λήψη της τιμής που είναι αποθηκευμένη στις εγγραφές θερμοκρασίας LM75
Στη γραμμή 22 του κώδικα στο προηγούμενο παράδειγμα, μπορείτε να δείτε πώς να φορτώσετε τις πληροφορίες που είναι αποθηκευμένες από τους τρεις καταχωρητές θερμοκρασίας του LM75. Χρησιμοποιεί δύο byte (16 bit) από τα οποία μόνο τα 11 πιο σημαντικά bit είναι έγκυρα. Για να διαβάσετε τη θερμοκρασία ως ακέραιο (με το σύμβολο κωδικοποιημένο μέσα συμπλήρωμα δύο) το πιο σημαντικό byte φορτώνεται πρώτα σε μια μεταβλητή int
de Arduino και περιστρέφεται 8 bit προς τα αριστερά, αφήνοντάς το στο πιο σημαντικό μέρος του int
. Στη συνέχεια διαβάζεται το δεύτερο byte και προστίθεται στη μεταβλητή. int
με μια λειτουργία OR
Ερμηνεία της τιμής φορτωμένης θερμοκρασίας του LM75
Στη γραμμή 24 μπορείτε να δείτε πώς να ερμηνεύσετε την τιμή της θερμοκρασίας. Πρώτα απ 'όλα, είναι απαραίτητο να διαιρέσουμε με το 32 ως ακέραιο (περιστρέψτε τα σχετικά 11 bit χωρίς να χάσετε το πρόσημο) και να διαιρέσετε με το 8, που είναι ο αριθμός των "βημάτων" με τα οποία αναπαρίσταται η θερμοκρασία (οκτάβες ενός βαθμού) για να λάβετε μια τιμή τύπου float
με τα αντίστοιχα δεκαδικά. Δεδομένου ότι οι μεταγλωττιστές (συμπεριλαμβανομένων των εργαλείο de Arduino) βελτιστοποιήστε τη διαίρεση ακεραίων με το 32, δεν είναι απαραίτητο να διατηρήσετε το πρόσημο και να περιστρέψετε τα bit "χειροκίνητα", αφού η λειτουργία δεν είναι (αισθητά) ταχύτερη.
Επαληθεύστε τη λήψη δεδομένων από το δίαυλο I2C
Παρόλο που ο προηγούμενος κωδικός θα λειτουργήσει χωρίς προβλήματα, παρόλο που δεν επαληθεύεται αν έχουν φτάσει τα δεδομένα που ζητήθηκαν από τη συσκευή. λεωφορείο I2C, το πιο ορθόδοξο (και σκόπιμο) είναι να περιμένεις να φτάσουν τα δεδομένα στον κατάλληλο αριθμό. Δεδομένου ότι η ταχύτητα μετάδοσης και η αντίσταση στα σφάλματα είναι περισσότερο από επαρκείς, είναι συνηθισμένο να βρίσκουμε κώδικα στον οποίο τα δεδομένα απλά ζητούνται και διαβάζονται χωρίς αναμονή. Για τα παραδείγματα είναι χρήσιμο να το κάνετε με αυτόν τον τρόπο, καθώς δεν αποσπούν την προσοχή από την κύρια πρόθεση, αλλά για τον κώδικα παραγωγής καλό είναι να το κάνετε όπως προτείνεται στο έβδομο σημείο της λίστας της διαδικασίας επικοινωνίας I2C. Ο κώδικας στο ακόλουθο παράδειγμα επισημαίνει τις προτεινόμενες αλλαγές για τη χρήση του LM75 στη φάση εκμετάλλευσης.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#define DIRECCION_LM75 0B01001000 // Dirección del LM75 con A0, A1 y A2 a nivel bajo
#define TEMPERATURA_ACTUAL_LM75 0x00 // Registro que almacena la temperatura medida
//#define TIEMPO_CONVERSION_LM75 100 // El LM75 convierte la temperatura (AD) cada 100 ms así que el intervalo entre lecturas debe ser mayor.
#define TIEMPO_ENTRE_LECTURAS_DE_TEMPERATURA 3000 // Intervalo entre lecturas consecutivas de la temperatura en ms
#define TIMEOUT_I2C 30 // Esperar 30 ms antes de renunciar a leer el bus I2C
#include <Wire.h>
int temperatura; // Valor de la temperatura actual cargado del LM75
unsigned long cronometro_i2c; // Cronómetro para medir el tiempo de espera de la lectura del bus I2C (y cancelar la operación si se supera el máximo)
void setup()
{
Serial.begin(9600); // Inicializar las comunicaciones serie (para mostrar en la consola el valor de la temperatura)
Wire.begin(); // Inicializar las comunicaciones I2C
}
void loop()
{
Wire.beginTransmission(DIRECCION_LM75); // Acceder al LM75 por su dirección en el bus I2C
Wire.write(TEMPERATURA_ACTUAL_LM75); // Solicitar la lectura del registro de la temperatura actual
Wire.endTransmission(); // Liberar el bus I2C
Wire.requestFrom(DIRECCION_LM75,2); // Pedir dos bytes (el valor del registro de la temperatura actual)
cronometro_i2c=millis();
while(Wire.available()<2&&(unsigned long)(millis()–cronometro_i2c)>TIMEOUT_I2C); // Esperar a que lleguen dos bytes al bus I2C o pase el tiempo máximo para abandonar
if(Wire.available()==2) // Si han llegado dos bytes
{
temperatura=(Wire.read()<<8)|Wire.read(); // Leer el primer byte, rotarlo 8 posiciones y añadir el valor del segundo byte
}
Wire.endTransmission(); // Liberar el bus I2C
Serial.println((float)temperatura/32/8,DEC); // Sólo son relevantes los 11 bits más significativos con una precisión de un octavo de grado (1/8 = 0.125 °C)
delay(TIEMPO_ENTRE_LECTURAS_DE_TEMPERATURA); // Esperar un poco antes de volver a leer la temperatura
}
|
Διαμορφώστε τη λειτουργία του LM75
Η πιο βασική διαμόρφωση του LM75 συνίσταται στον καθορισμό της μέγιστης θερμοκρασίας για τη δημιουργία της προειδοποίησης και της υστέρηση, το οποίο θα καθορίσει πότε θα απενεργοποιηθεί και μπορεί να επαναληφθεί. Για να διαμορφώσετε αυτές τις τιμές, πρέπει μόνο να τις αποθηκεύσετε στους αντίστοιχους καταχωρητές.
Όπως το τρέχον ρεκόρ θερμοκρασίας, η μέγιστη (προειδοποιητική) θερμοκρασία και υστέρηση Χρησιμοποιούν δύο byte αλλά σε αντίθεση με το πρώτο δεν λαμβάνουν υπόψη 11 bit (ένα όγδοο της μοίρας) αλλά 9 (μισό βαθμό), έτσι ώστε, ακόμη και αν αποθηκευτεί μια μικρότερη τιμή, θα λαμβάνονται υπόψη μόνο διαστήματα αυτής της ανάλυσης.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
#define DIRECCION_LM75 0B01001000 // Dirección del LM75 con A0, A1 y A2 a nivel bajo
#define TEMPERATURA_ACTUAL_LM75 0x00 // Registro que almacena la temperatura medida
#define TEMPERATURA_MAXIMA_LM75 0x03 // Registro que almacena la temperatura máxima (al superarla avisa cambiando el estado del pin OS) 80 °C al inicio
#define TEMPERATURA_HISTERESIS_LM75 0x02 // Registro que almacena la temperatura por debajo de la cual la máxima vuelve a generar un cambio en el pin OS (temperatura de histéresis) 75 °C al inicio
//#define TIEMPO_CONVERSION_LM75 100 // El LM75 convierte la temperatura (AD) cada 100 ms
#define TIEMPO_ENTRE_AVISOS_DE_TEMPERATURA 3000 // Intervalo entre avisos consecutivos de exceso de temperatura en ms
#define TIMEOUT_I2C 30 // Esperar 30 ms antes de renunciar a leer el bus I2C
#define TEMPERATURA_AVISO 32.5 // Avisar a los 32.5 °C (Solamente se consideran 9 bits, es decir, medios grados)
#define TEMPERATURA_HISTERESIS 31.0 // No volver a avisar (a los 32.5 °C) hasta que no se baje a los 31.0 °C
#define PIN_AVISO_LM75 2 // Pin de Arduino al que se conecta la salida OS del LM75
#include <Wire.h> // Cargar la librería de las comunicaciones I2C
int temperatura; // Valor de la temperatura actual cargado del LM75
unsigned long cronometro_i2c; // Cronómetro para medir el tiempo de espera de la lectura del bus I2C (y cancelar la operación si se supera el máximo)
unsigned long cronometro_avisos=0; // Cronómetro para controlar que se avise del exceso de temperatura a un intervalo máximo (como máximo cada TIEMPO_ENTRE_AVISOS_DE_TEMPERATURA)
void setup()
{
pinMode(PIN_AVISO_LM75,INPUT); // Usar como entrada el pin de Arduino al que se conecta la salida OS del LM75
Serial.begin(9600); // Inicializar las comunicaciones serie
Wire.begin(); // Inicializar las comunicaciones I2C
//Configurar la temperatura de aviso
Wire.beginTransmission(DIRECCION_LM75); // Iniciar la comunicación con el LM75
Wire.write(TEMPERATURA_MAXIMA_LM75); // Acceder al registro que almacena la temperatura máxima (temperatura de aviso)
Wire.write((byte)((int)(TEMPERATURA_AVISO*8.0)>>3)); // Desplazar 5 bits a la izquierda y 8 a la derecha
Wire.write((byte)((int)(TEMPERATURA_AVISO*8.0)<<5)); // Desplazar 5 bits a la izquierda
Wire.endTransmission(); // Liberar el bus I2C
//Configurar la temperatura de histéresis
Wire.beginTransmission(DIRECCION_LM75); // Iniciar la comunicación con el LM75
Wire.write(TEMPERATURA_HISTERESIS_LM75); // Acceder a la temperatura de histéresis
Wire.write((byte)((int)(TEMPERATURA_HISTERESIS*8.0)>>3)); // Desplazar 5 bits a la izquierda y 8 a la derecha
Wire.write((byte)((int)(TEMPERATURA_HISTERESIS*8.0)<<5)); // Desplazar 5 bits a la izquierda
Wire.endTransmission(); // Liberar el bus I2C
// El aviso se activará cuando la temperatura sea TEMPERATURA_AVISO o superior
// y no se desactivará hasta que sea TEMPERATURA_HISTERESIS o inferior
}
void loop()
{
if(!digitalRead(PIN_AVISO_LM75)) // Si la señal OS del LM75 está a nivel bajo (polaridad por defecto del aviso)
{
if((millis()–cronometro_avisos)>TIEMPO_ENTRE_AVISOS_DE_TEMPERATURA) // Si ha transcurrido el tiempo entre avisos (además de estar activa la señal)
{
cronometro_avisos=millis(); // Reiniciar el cronómetro de aviso de la temperatura
Wire.beginTransmission(DIRECCION_LM75); // Acceder al LM75 por su dirección en el bus I2C
Wire.write(TEMPERATURA_ACTUAL_LM75); // Solicitar la lectura del registro de la temperatura actual
Wire.endTransmission(); // Liberar el bus I2C
Wire.requestFrom(DIRECCION_LM75,2); // Pedir dos bytes (el valor del registro de la temperatura actual)
cronometro_i2c=millis(); // Iniciar el cronómetro que controla si ha pasado el tiempo máximo de espera de recepción de datos desde el bus I2C
while(Wire.available()<2&&(unsigned long)(millis()–cronometro_i2c)>TIMEOUT_I2C); // Esperar a que lleguen dos bytes al bus I2C o pase el tiempo máximo para abandonar
if(Wire.available()==2) // Si han llegado dos bytes
{
temperatura=(Wire.read()<< 8)|Wire.read(); // Leer el primer byte, rotarlo 8 posiciones y añadir el valor del segundo byte
Serial.println((float)temperatura/32/8,DEC); // Sólo son relevantes los 11 bits más significativos con una precisión de un octavo de grado (1/8 = 0.125 °C)
}
Wire.endTransmission(); // Liberar el bus I2C
}
}
}
|
Εφόσον στον προηγούμενο κωδικό αλλάζει μόνο η διαμόρφωση των θερμοκρασιών που σχετίζονται με την προειδοποίηση, η υπόλοιπη λειτουργία αντιστοιχεί στην προεπιλεγμένη διαμόρφωση.
Σε αυτήν την προεπιλεγμένη διαμόρφωση υπάρχουν δύο χαρακτηριστικά που είναι σχετικά, πρώτον η λειτουργία προειδοποίησης, από προεπιλογή αυτό που ονομάζεται "λειτουργία θερμοστάτη" που αποτελείται από την ενεργοποίηση της προειδοποίησης όταν επιτευχθεί η μέγιστη θερμοκρασία (ή προειδοποίηση) και όχι την απενεργοποίησή της έως ότου χαμηλότερη θερμοκρασία του υστέρηση. Η εναλλακτική είναι η "λειτουργία διακοπής", στην οποία το σήμα ενεργοποιείται όταν υπερβαίνει το μέγιστο ή όταν φτάσει σε τιμή χαμηλότερη από αυτή του υστέρηση και επαναφέρεται διαβάζοντας οποιαδήποτε εγγραφή, συνήθως την τρέχουσα θερμοκρασία.
Το δεύτερο χαρακτηριστικό είναι ότι το προειδοποιητικό σήμα ενεργοποιείται σε χαμηλό επίπεδο, δηλαδή ο ακροδέκτης του λειτουργικού συστήματος βρίσκεται σε υψηλό επίπεδο μέχρι να επιτευχθεί η μέγιστη προειδοποιητική θερμοκρασία. Δεδομένου ότι η πολικότητα του προειδοποιητικού σήματος (το επίπεδο στο οποίο ενεργοποιείται) μπορεί να ρυθμιστεί, σε ορισμένες απλές εγκαταστάσεις θα αρκεί η χρήση αυτού του σήματος (υλικό) για την εκμετάλλευση του LM75, για παράδειγμα, σύνδεση ή αποσύνδεση ενός ανεμιστήρα όταν το σύστημα φτάσει σε μια ορισμένη θερμοκρασία.
Είναι επίσης δυνατό να ρυθμίσετε τη λειτουργία του LM75 έτσι ώστε να μην προειδοποιεί αμέσως μετά την επίτευξη της προειδοποιητικής θερμοκρασίας αλλά να το κάνει μετά από πολλά περιστατικά. Αυτή η συμπεριφορά είναι πολύ χρήσιμη όταν εργάζεστε στο όριο θερμοκρασίας ή όταν μεταβάλλεται πολύ γρήγορα. Το LM75 μπορεί να ρυθμιστεί ώστε να προειδοποιεί μετά από υπέρβαση της μέγιστης θερμοκρασίας μία, δύο, τέσσερις ή έξι φορές.
Στον καταχωρητή διαμόρφωσης υπάρχει επίσης ένα bit για να απενεργοποιήσετε («απενεργοποιήσετε») το LM75 και να εισέλθετε σε λειτουργία χαμηλής κατανάλωσης, η οποία εξέρχεται αλλάζοντας ξανά αυτό το bit ή απλά όταν διαβάζετε τον επόμενο καταχωρητή.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
#define DIRECCION_LM75 0B01001000 // Dirección del LM75 con A0, A1 y A2 a nivel bajo
#define TEMPERATURA_ACTUAL_LM75 0x00 // Registro que almacena la temperatura medida
#define TEMPERATURA_MAXIMA_LM75 0x03 // Registro que almacena la temperatura máxima (al superarla avisa cambiando el estado del pin OS) 80 °C al inicio
#define TEMPERATURA_HISTERESIS_LM75 0x02 // Registro que almacena la temperatura por debajo de la cual la máxima vuelve a generar un cambio en el pin OS (temperatura de histéresis) 75 °C al inicio
#define CONFIGURACION_LM75 0x01 // Registro del LM75 que almacena la configuración. El valor por defecto es cero
#define ENCENDER_LM75 0B00000000 // Encender el LM75 almacenando este valor (OR el resto) en el registro de configuración
#define APAGAR_LM75 0B00000001 // Apagar el LM75 (modo de bajo consumo) almacenando el valoren el registro de configuración
#define AVISO_LM75_COMPARAR 0B00000000 // Activo cuando se supera la temperatura máxima inactivo cuando la temperatura es menor que la de histéresis (modo termostato)
#define AVISO_LM75_INTERRUPCION 0B00000010 // Activo cuando se supera la temperatura máxima. Se resetea al leer el valor. No se volverá a activar hasta que no se alcance (primero) la de histéresis
#define AVISAR_LM75_BAJO 0B00000000 // Establece el nivel bajo en el pin OS cuando se supere la temperatura máxima
#define AVISAR_LM75_ALTO 0B00000100 // Establece el nivel alto en el pin OS cuando se supere la temperatura máxima
#define AVISAR_LM75_A_1 0B00000000 // Avisar cuando se supere una vez la temperatura (con riesgo de que un error producido por ruido en la conversión lance un aviso incorrecto)
#define AVISAR_LM75_A_2 0B00001000 // Avisar de temperatura superada cuando se mida dos veces
#define AVISAR_LM75_A_4 0B00010000 // Avisar de temperatura superada cuando se mida cuatro veces
#define AVISAR_LM75_A_6 0B00011000 // Avisar de temperatura superada cuando se mida seis veces
//#define TIEMPO_CONVERSION_LM75 100 // El LM75 convierte la temperatura (AD) cada 100 ms
#define TIEMPO_ENTRE_LECTURAS_DE_TEMPERATURA 2000 // Intervalo entre lecturas de la temperatura en ms
#define TIMEOUT_I2C 30 // Esperar 30 ms antes de renunciar a leer el bus I2C
#define TEMPERATURA_AVISO 32.5 // Avisar a los 32.5 °C (Solamente se consideran 9 bits, es decir, medios grados)
#define TEMPERATURA_HISTERESIS 31.0 // No volver a avisar (a los 32.5 °C) hasta que no se baje a los 31.0 °C
#define PIN_AVISO_LM75 7 // Pin de Arduino al que se conecta la salida OS del LM75
#include <Wire.h> // Cargar la librería de las comunicaciones I2C
int temperatura; // Valor de la temperatura actual cargado del LM75
unsigned long cronometro_i2c; // Cronómetro para medir el tiempo de espera de la lectura del bus I2C (y cancelar la operación si se supera el máximo)
unsigned long cronometro_avisos=0; // Cronómetro para controlar que se avise del exceso de temperatura a un intervalo máximo (como máximo cada TIEMPO_ENTRE_AVISOS_DE_TEMPERATURA)
void setup()
{
pinMode(PIN_AVISO_LM75,INPUT); // Usar como entrada el pin de Arduino al que se conecta la salida OS del LM75
Serial.begin(9600); // Inicializar las comunicaciones serie
Wire.begin(); // Inicializar las comunicaciones I2C
// El aviso se activará, a nivel alto (AVISAR_LM75_ALTO), cuando la temperatura sea TEMPERATURA_AVISO o superior cuatro veces consecutivas (AVISAR_LM75_A_4, que vale 0B00010000)
// y no se desactivará hasta que sea TEMPERATURA_HISTERESIS o inferior
// Configurar la temperatura de aviso
Wire.beginTransmission(DIRECCION_LM75); // Iniciar la comunicación con el LM75
Wire.write(TEMPERATURA_MAXIMA_LM75); // Acceder al registro que almacena la temperatura máxima (temperatura de aviso)
Wire.write((byte)((int)(TEMPERATURA_AVISO*8.0)>>3)); // Desplazar 5 bits a la izquierda y 8 a la derecha
Wire.write((byte)((int)(TEMPERATURA_AVISO*8.0)<<5)); // Desplazar 5 bits a la izquierda
Wire.endTransmission(); // Liberar el bus I2C
// Configurar la temperatura de histéresis
Wire.beginTransmission(DIRECCION_LM75); // Iniciar la comunicación con el LM75
Wire.write(TEMPERATURA_HISTERESIS_LM75); // Acceder a la temperatura de histéresis
Wire.write((byte)((int)(TEMPERATURA_HISTERESIS*8.0)>>3)); // Desplazar 5 bits a la izquierda y 8 a la derecha
Wire.write((byte)((int)(TEMPERATURA_HISTERESIS*8.0)<<5)); // Desplazar 5 bits a la izquierda
Wire.endTransmission(); // Liberar el bus I2C
// Configurar el número de veces que debe superarse la temperatura para generar un aviso y la polaridad del aviso
Wire.beginTransmission(DIRECCION_LM75); // Iniciar la comunicación con el LM75
Wire.write(CONFIGURACION_LM75); // Acceder al registro de configuración
Wire.write(AVISAR_LM75_ALTO|AVISAR_LM75_A_4); // Componer la configuración con operaciones OR sobre los diferentes (bits) valores
Wire.endTransmission(); // Liberar el bus I2C
}
void loop()
{
if((millis()–cronometro_avisos)>TIEMPO_ENTRE_LECTURAS_DE_TEMPERATURA) // Si ha transcurrido el tiempo entre lecturas
{
cronometro_avisos=millis(); // Reiniciar el cronómetro de aviso de la temperatura
Wire.beginTransmission(DIRECCION_LM75); // Acceder al LM75 por su dirección en el bus I2C
Wire.write(TEMPERATURA_ACTUAL_LM75); // Solicitar la lectura del registro de la temperatura actual
Wire.endTransmission(); // Liberar el bus I2C
Wire.requestFrom(DIRECCION_LM75,2); // Pedir dos bytes (el valor del registro de la temperatura actual)
cronometro_i2c=millis(); // Iniciar el cronómetro que controla si ha pasado el tiempo máximo de espera de recepción de datos desde el bus I2C
while(Wire.available()<2&&(unsigned long)(millis()–cronometro_i2c)>TIMEOUT_I2C); // Esperar a que lleguen dos bytes al bus I2C o pase el tiempo máximo para abandonar
if(Wire.available()==2) // Si han llegado dos bytes
{
temperatura=(Wire.read()<<8)|Wire.read(); // Leer el primer byte, rotarlo 8 posiciones y añadir el valor del segundo byte
Serial.print(“Temperatura “);
if(digitalRead(PIN_AVISO_LM75)) // Si la señal OS del LM75 está activa (a nivel alto)
{
Serial.print(“demasiado alta”);
}
else
{
Serial.print(“correcta”);
}
Serial.print(” (“);
Serial.print((float)temperatura/32/8,DEC); // Sólo son relevantes los 11 bits más significativos con una precisión de un octavo de grado (1/8 = 0.125 °C)
Serial.println(“)”);
}
Wire.endTransmission(); // Liberar el bus I2C
}
}
|
Δημοσίευση σχολίου