Датчик температуры I2C LM75
Принцип работы
El IC LM75 - это кремниевый полупроводниковый датчик температуры запрещенной зоны.
В полупроводниках запретная группа Это энергетическая зона электронов, которая не может быть увеличена с увеличением электрического поля, поскольку нет состояний, доступных для более быстрого движения. Этот запретная группа включено между валентная зона (более низкая энергия) и ведущая полоса (высшая энергия). Тепловое возбуждение (повышение температуры для интересующих нас целей) может привести к тому, что некоторые электроны приобретут достаточно энергии, чтобы перейти в ведущая полоса.
Как объяснялось в предыдущей статье о электронное измерение температуры, в металлах, хотя число носителей не зависит от температуры (все электроны всегда доступны), на их подвижность влияет температура, так что сопротивление в металлах увеличивается с температурой из-за уменьшения скорости электронов из-за увеличение их термическое перемешивание и рассеяние электронов, которое оно производит.
В случае полупроводников из-за присутствия этого запретная группа Число носителей зависит от температуры (в зависимости от Распределение Ферми – Дирака), вызывая увеличение проводимости с температурой. В полупроводниках повышение температуры приводит к увеличению сопротивления, но также приводит к (дальнейшему) увеличению проводимости.
кремниевые полупроводниковые датчики температуры запрещенной зоны, как и в случае с LM75, работают по этому принципу, позволяя определять температуру путем количественной оценки ее влияния на напряжение в кремниевом диоде.
Аппаратные компоненты LM75
LM75 также имеет аналого-цифровой преобразователь сигма-дельта модуляцией который отвечает за получение числового (цифрового) значения температуры, значения, которое впоследствии сохраняется (каждые 100 мс) в одном из его регистров, из которого его можно прочитать по шине 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 В до 5,5 В. В том же автобус I2C Можно организовать до восьми термометров LM75, настроив их адрес с помощью трех контактов A0, A1 и A2 на высоком или низком уровне, как обычно в таких случаях.
С другой стороны, использование LM75 в качестве пробника неудобно из-за упаковок, в которых он представлен, ЦСОП (ЦСОП8) Или СОИК (SO8) и обычно используется для измерения температуры окружающей среды или температуры компонентов, расположенных в среде Печатные платы в котором находится термометр 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 con
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
с соответствующими десятичными знаками. Поскольку компиляторы (в том числе Набор инструментов 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
}
}
|
Оставить комментарий