I2C температурен сензор LM75
Принцип на работа
El IC LM75 е a силициев полупроводников температурен сензор за забранена лента.
В полупроводниците, забранена група Това е енергийната зона на електроните, която не може да бъде увеличена с увеличаване на електрическото поле, тъй като няма налични състояния, които да се движат по-бързо. Това забранена група се включва между валентна лента (по-ниска енергия) и проводяща лента (по-висока енергия). Топлинното възбуждане (повишаването на температурата, за целите, които ни интересуват) може да накара някои електрони да придобият достатъчно енергия, за да преминат в проводяща лента.
Както беше обяснено в предишната статия за електронно измерване на температурата, в металите, въпреки че броят на носителите не зависи от температурата (всички електрони са винаги налични), тяхната подвижност се влияе от температурата, така че съпротивлението в металите се увеличава с температурата поради намаляване на скоростта на електроните поради увеличаването на техните термично разбъркване и разсейването на електроните, което произвежда.
В случай на полупроводници, поради наличието на това забранена група Броят на носителите зависи от температурата (в зависимост от Разпределение на Ферми-Дирак), което води до увеличаване на проводимостта с температурата. В полупроводниците повишаването на температурата води до увеличаване на съпротивлението, но също така води до (по-нататъшно) увеличаване на проводимостта.
Лос силициеви полупроводникови температурни сензори за забранена лента, какъвто е случаят с LM75, работят в съответствие с този принцип, позволявайки температурата да бъде определена чрез количествено определяне на нейното влияние върху напрежението в силициев диод.
LM75 Хардуерни компоненти
LM75 също има a аналогово-цифров преобразувател чрез сигма-делта модулация който е отговорен за получаване на числената (цифрова) стойност на температурата, стойност, която впоследствие се съхранява (на всеки 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.
Внедряването (хардуер) на LM75 във верига е много просто, не се нуждае от повече компоненти от резисторите набиране дел автобус I2C и може да се захранва с напрежение между 2,8 V и 5,5 V. В същ автобус I2C До осем термометъра LM75 могат да бъдат подредени чрез конфигуриране на техния адрес с трите пина A0, A1 и A2 на високо или ниско ниво, както е обичайно в тези случаи.
От друга страна, използването на LM75 като сонда е неудобно поради опаковките, в които се предлага, ТСОП (TSSOP8) o SEC (SO8) и обикновено се използва за измерване на околната температура или за измерване на температурата на компоненти, разположени в околната среда на PCB в който се намира термометърът LM75.
При стартиране LM75 е конфигуриран да открива максимална температура от +80°C, температура от хистерезис от +75 °C и режима на работа на компаратора, т.е. режима, който емулира работата на термостат: той активира предупреждението при достигане на максималната температура и само ако тя падне под хистерезис Регенерира известието.
Експлоатация на LM75 от микроконтролер през I2C шина
Благодарение на използването на автобус I2C Работата с LM75 е много проста, просто влезте в адреса, който заема в шината, за да съхраните или прочетете конфигурацията и да получите стойността на измерената температура.
Адресът I2C основата на LM75 е 0B01001XXX и се допълва, както е обяснено по-горе, от последните три бита за адрес, които се задават от хардуера с щифтове 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()
(толкова пъти, колкото байта съставляват) - Въпреки че не е от съществено значение, когато приключите, освободете автобус I2C
В допълнение към обичайния протокол за получаване или съхраняване на информация в регистрационните файлове на устройството с помощта на автобус I2C, за да се използват данните, които LM75 предоставя, е необходимо да се вземе предвид форматът, в който той вътрешно представя температурата.
Получаване на стойността, съхранена в температурните записи на LM75
На ред 22 от кода в предишния пример можете да видите как да заредите информацията, съхранена от трите температурни регистъра на LM75. Той използва два байта (16 бита), от които само 11-те най-значими бита са валидни. За да прочетете температурата като цяло число (със знак, кодиран в допълнение на две) най-значимият байт се зарежда първи в променлива int
de Arduino и се завърта 8 бита наляво, оставяйки го в най-значимата част на int
. След това вторият байт се чете и добавя към променливата. int
с операция ИЛИ
Интерпретация на заредената температурна стойност на LM75
В ред 24 можете да видите как да интерпретирате стойността на температурата. На първо място е необходимо да се раздели на 32 като цяло число (завъртете съответните 11 бита, без да губите знака) и да се раздели на 8, което е броят на "стъпките", с които е представена температурата (октави от градус) за получаване на стойност от тип float
със съответните десетични знаци. Тъй като компилаторите (включително toolchain de Arduino) оптимизират целочисленото деление на 32, не е необходимо да запазвате знака и да въртите "ръчно" битовете, тъй като операцията не е (осезаемо) по-бърза.
Проверете приемането на данни от 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 се състои от установяване на максималната температура за генериране на предупреждението и хистерезис, което ще определи кога е деактивирано и може да се повтори. За да конфигурирате тези стойности, трябва само да ги съхраните в съответните регистри.
Подобно на текущия температурен рекорд, максималната (предупредителна) температура и хистерезис Те използват два байта, но за разлика от първия, те не вземат предвид 11 бита (една осма от градуса), а 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
}
}
}
|
Тъй като в предишния код се променя само конфигурацията на температурите, свързани с предупреждението, останалата част от операцията съответства на конфигурацията по подразбиране.
В тази конфигурация по подразбиране има две характеристики, които са от значение, първо, режимът на предупреждение, по подразбиране това, което се нарича "термостатен режим", който се състои от активиране на предупреждението, когато се достигне максималната температура (или предупреждение) и не го деактивира, докато не се понижи до температура на хистерезис. Алтернативата е "режим на прекъсване", при който сигналът се активира, когато превиши максимума или когато достигне стойност, по-ниска от тази на хистерезис и се нулира чрез четене на всеки запис, обикновено текущата температура.
Втората характеристика е, че предупредителният сигнал се активира на ниско ниво, тоест щифтът на OS е на високо ниво, докато се достигне максималната предупредителна температура. Тъй като полярността на предупредителния сигнал (нивото, на което се активира) може да се конфигурира, при някои прости инсталации ще бъде достатъчно да използвате този сигнал (хардуер), за да използвате LM75, например, свързване или изключване на вентилатор, когато системата достига определена температура.
Също така е възможно да конфигурирате работата на LM75 така, че да не предупреждава веднага след достигане на предупредителната температура, а да го прави след няколко инцидента. Това поведение е много полезно, когато работите при температурна граница или когато тя варира много бързо. 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
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
}
}
|
Публикувай коментар