I2C teplotný senzor LM75
Princíp činnosti
El IC LM75 je a kremíkový polovodičový snímač teploty bandgap.
V polovodičoch je zakázaná kapela Je to energetická zóna elektrónov, ktorá sa nemôže zvýšiť so zvýšením elektrického poľa, pretože neexistujú žiadne stavy, ktoré by sa mohli pohybovať rýchlejšie. Toto zakázaná kapela je zaradený medzi valenčné pásmo (nižšia energia) a vodivé pásmo (vyššia energia). Tepelná excitácia (zvýšenie teploty, na účely, ktoré nás zaujímajú) môže spôsobiť, že niektoré elektróny získajú dostatok energie na prechod do vodivé pásmo.
Ako je vysvetlené v predchádzajúcom článku o elektronické meranie teploty, v kovoch, hoci počet nosičov nezávisí od teploty (všetky elektróny sú vždy k dispozícii), ich pohyblivosť je ovplyvnená teplotou, takže odpor v kovoch rastie s teplotou v dôsledku poklesu rýchlosti elektrónov v dôsledku nárast ich tepelné miešanie a rozptyl elektrónov, ktoré produkuje.
V prípade polovodičov kvôli prítomnosti tohto zakázaná kapela Počet nosičov závisí od teploty (v závislosti od Fermi-Diracovo rozdelenie), čo spôsobuje zvýšenie vodivosti s teplotou. V polovodičoch spôsobuje zvýšenie teploty zvýšenie odporu, ale tiež (ďalšie) zvýšenie vodivosti.
undefined kremíkové polovodičové teplotné senzory s medzerou v pásme, ako je to v prípade LM75, pracujú podľa tohto princípu, čo umožňuje určiť teplotu kvantifikáciou jej vplyvu na napätie v kremíkovej dióde.
Hardvérové komponenty LM75
LM75 má tiež a analógovo-digitálny prevodník moduláciou Sigma-Delta ktorá je zodpovedná za získanie číselnej (digitálnej) hodnoty teploty, hodnoty, ktorá sa následne (každých 100 ms) uloží do jedného z jej registrov, z ktorých sa dá načítať cez zbernicu I2C.
Okrem registra, ktorý obsahuje nameranú teplotu, má LM75 register, do ktorého je možné uložiť maximálnu teplotu, ako aj komparátor, ktorý je schopný generovať signál, ak nameraná teplota prekročí teplotu uloženú v tomto druhom registri. Aby sa výstraha nespustila znova, kým nameraná teplota neklesne pod určitú úroveň, umožňuje tretí register uložiť hodnotu teploty hysteréza.
Konfigurácia činnosti LM75 je uložená vo štvrtom registri, pomocou ktorého sa určujú podmienky, za ktorých sa generuje varovanie, spôsob spustenia tohto varovného signálu (režim prerušenia alebo porovnávacieho režimu), ako aj aktivácia zariadenia (režim). (normálna prevádzka alebo nízka spotreba) okrem iných parametrov.
Technické špecifikácie a implementácia LM75
Rozsah teplôt, ktoré je LM75 schopný merať, sa pohybuje od -55 °C do +125 °C a numerické rozlíšenie je 0.125 °C, hoci presnosť je v najlepšom prípade len ±2 °C, keď je teplota medzi − 25 °C a +100 °C a presnosťou ±3 °C pri najextrémnejších teplotách, medzi -55 °C a +125 °C.
Implementácia (hardvér) LM75 v obvode je veľmi jednoduchá, nepotrebuje viac komponentov ako odpory vytiahni del autobus I2C a môže byť napájaný napätím medzi 2,8 V a 5,5 V. V tom istom autobus I2C Až osem teplomerov LM75 je možné usporiadať konfiguráciou ich adresy pomocou troch kolíkov A0, A1 a A2 na vysokej alebo nízkej úrovni, ako je v týchto prípadoch obvyklé.
Na druhej strane je použitie LM75 ako sondy nepohodlné kvôli baleniam, v ktorých je prezentovaná, TSSOP (TSSOP8) alebo SEC (SO8) a bežne sa používa na meranie teploty okolia alebo na meranie teploty komponentov usporiadaných v okolí PCB v ktorej je umiestnený teplomer LM75.
Pri spustení je LM75 nakonfigurovaný na detekciu maximálnej teploty +80°C, teda teploty hysteréza +75 °C a prevádzkový režim komparátora, teda režim, ktorý napodobňuje činnosť termostatu: aktivuje varovanie pri dosiahnutí maximálnej teploty a iba vtedy, ak klesne pod hysteréza Regeneruje upozornenie.
Využitie LM75 z mikrokontroléra cez zbernicu I2C
Vďaka použitiu autobus I2C Obsluha LM75 je veľmi jednoduchá, stačí pristúpiť na adresu, ktorú zaberá na zbernici, uložiť alebo prečítať konfiguráciu a získať hodnotu nameranej teploty.
Adresa I2C základňa LM75 je 0B01001XXX a je doplnená, ako je vysvetlené vyššie, o posledné tri adresové bity, ktoré sú hardvérovo nastavené pomocou kolíkov A0, A1 a A2 high (hodnota jedna) alebo low (nulová hodnota).
LM75 ako teplomer
Register, ktorý uchováva poslednú nameranú teplotu (TEMP) sa nachádza na adrese 0x00, konfiguračný register (CONF) je na adrese 0x01, register, ktorý ukladá teplotu hysteréza na adrese 0x02 a maximálna alebo nadmerná teplota (TOS) má adresu 0x03. Okrem aktuálnej teploty (TEMP) všetky fungujú ako čítanie a zápis.
Použitie niektorých príkladov kódu vyvinutých pre Arduino (ktorá sa stala takmer univerzálnou referenciou) môže byť činnosť LM75 ďalej objasnená. Najzákladnejším užitočným príkladom je použitie LM75 ako teplomera načítaním záznamu poslednej nameranej teploty.
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
}
|
Tento proces je obvyklý pri práci so zariadením I2C:
- Pridajte knižnicu I2C ku kódu s
#include <Wire.h>
- Inicializujte knižnicu I2C použitie
Wire.begin();
- Prístup k snímaču teploty LM75 získate pomocou
Wire.beginTransmission(DIRECCION_LM75)
- Pošlite adresu registra, ku ktorému sa pristupuje pomocou
Wire.write(REGISTRO)
- Uvoľnite autobus I2C s
Wire.endTransmission()
- Opätovný prístup k LM75
- Požiadajte o hodnotu registra s
Wire.requestFrom(DIRECCION,CANTIDAD)
- Overte, či boli údaje prijaté pomocou
Wire.available()
- Prečítajte si požadovanú hodnotu
Wire.read()
(koľkokrát to tvoria bajty) - Hoci to nie je nevyhnutné, po dokončení uvoľnite autobus I2C
Okrem bežného protokolu na získavanie alebo ukladanie informácií do protokolov zariadenia pomocou autobus I2CNa využitie údajov, ktoré poskytuje LM75, je potrebné zvážiť formát, v ktorom interne reprezentuje teplotu.
Získanie hodnoty uloženej v teplotných záznamoch LM75
Na riadku 22 kódu v predchádzajúcom príklade môžete vidieť, ako načítať informácie uložené v troch teplotných registroch LM75. Používa dva bajty (16 bitov), z ktorých je platných iba 11 najvýznamnejších bitov. Na čítanie teploty ako celého čísla (so zakódovaným znakom dvojkový doplnok) najvýznamnejší bajt sa načíta ako prvý do premennej int
de Arduino a je otočený o 8 bitov doľava, pričom zostáva v najvýznamnejšej časti int
. Druhý bajt sa potom načíta a pridá do premennej. int
s operáciou OR
Interpretácia hodnoty zaťaženej teploty LM75
V riadku 24 môžete vidieť, ako interpretovať hodnotu teploty. V prvom rade je potrebné deliť 32 ako celé číslo (otočiť príslušných 11 bitov bez straty znamienka) a deliť 8, čo je počet „krokov“, ktorými je teplota reprezentovaná (oktávy stupňa) získať hodnotu typu float
so zodpovedajúcimi desatinnými miestami. Keďže kompilátory (vrátane toolchain de Arduino) optimalizovať celočíselné delenie 32, nie je potrebné zachovávať znamienko a "ručne" otáčať bity, keďže operácia nie je (citeľne) rýchlejšia.
Overte príjem dát zo zbernice I2C
Aj keď predchádzajúci kód bude fungovať bez problémov aj napriek tomu, že si neoveríte, či prístrojom požadované dáta dorazili. autobus I2C, najortodoxnejšia (a odporúčaná) vec je počkať, kým údaje prídu v príslušnom počte. Keďže prenosová rýchlosť a odolnosť voči chybám je viac než dostatočná, je bežné nájsť kód, v ktorom sú dáta jednoducho vyžiadané a načítané bez čakania. Pre príklady je užitočné to urobiť týmto spôsobom, pretože neodvádzajú pozornosť od hlavného zámeru, ale pre produkčný kód je vhodné to urobiť tak, ako je navrhnuté v siedmom bode zoznamu komunikačného procesu. I2C. Kód v nasledujúcom príklade zdôrazňuje odporúčané zmeny na používanie LM75 vo fáze využívania.
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
}
|
Nakonfigurujte prevádzku LM75
Najzákladnejšia konfigurácia LM75 pozostáva zo stanovenia maximálnej teploty na generovanie varovania a hysteréza, ktorý určí, kedy sa deaktivuje a môže sa opakovať. Na konfiguráciu týchto hodnôt ich stačí uložiť do príslušných registrov.
Rovnako ako aktuálny teplotný rekord, maximálna (výstražná) teplota a hysteréza Používajú dva bajty, ale na rozdiel od prvého nezohľadňujú 11 bitov (osmina stupňa), ale 9 (pol stupňa), takže aj keby bola uložená menšia hodnota, brali by sa do úvahy iba intervaly tohto rozlíšenia.
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
}
}
}
|
Keďže v predchádzajúcom kóde sa mení iba konfigurácia teplôt súvisiacich s varovaním, zvyšok operácie zodpovedá predvolenej konfigurácii.
V tejto predvolenej konfigurácii sú dôležité dve charakteristiky, po prvé režim varovania, štandardne nazývaný „režim termostatu“, ktorý pozostáva z aktivácie varovania pri dosiahnutí maximálnej teploty (alebo varovania) a jeho deaktivácie, kým nie je znížená na teplota hysteréza. Alternatívou je „režim prerušenia“, v ktorom sa signál aktivuje, keď prekročí maximum alebo keď dosiahne hodnotu nižšiu ako je hysteréza a resetuje sa načítaním akéhokoľvek záznamu, zvyčajne aktuálnej teploty.
Druhou charakteristikou je, že varovný signál sa aktivuje na nízkej úrovni, to znamená, že kolík OS je na vysokej úrovni, kým sa nedosiahne maximálna varovná teplota. Keďže polarita varovného signálu (úroveň, pri ktorej sa aktivuje) je konfigurovateľná, v niektorých jednoduchých inštaláciách bude stačiť použiť tento signál (hardvér) na využitie LM75, napríklad pripojenie alebo odpojenie ventilátora, keď systém dosiahne určitú teplotu.
Prevádzku LM75 je tiež možné nakonfigurovať tak, aby nevaroval ihneď po dosiahnutí varovnej teploty, ale po niekoľkých incidentoch. Toto správanie je veľmi užitočné pri práci na teplotnom limite alebo keď sa veľmi rýchlo mení. LM75 môže byť nakonfigurovaný tak, aby varoval po prekročení maximálnej teploty jeden, dva, štyri alebo šesťkrát.
V konfiguračnom registri je aj bit na deaktiváciu ("vypnutie") LM75 a vstup do režimu nízkej spotreby, ktorý sa ukončí opätovnou zmenou tohto bitu alebo jednoducho pri načítaní ďalšieho registra.
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
}
}
|
Pridať komentár