Датчик температури I2C LM75
Принцип дії
El IC LM75 - це a кремнієвий напівпровідниковий датчик температури забороненої зони.
У напівпровідниках заборонена смуга Це енергетична зона електронів, яку неможливо збільшити зі збільшенням електричного поля, оскільки немає станів, доступних для більш швидкого руху. Це заборонена смуга входить між валентна зона (нижча енергія) і зона провідності (вища енергія). Теплове збудження (підвищення температури, для цілей, які нас цікавлять) може змусити деякі електрони отримати достатньо енергії, щоб перейти в зона провідності.
Як пояснювалося в попередній статті про електронне вимірювання температури, у металах, хоча кількість носіїв не залежить від температури (усі електрони завжди доступні), їхня рухливість залежить від температури, так що опір у металах зростає з температурою через зменшення швидкості електронів через збільшення їх теплове перемішування і розсіювання електронів, яке воно створює.
У випадку з напівпровідниками через наявність цього заборонена смуга Кількість носіїв залежить від температури (в залежності від Розподіл Фермі–Дірака), викликаючи підвищення провідності з температурою. У напівпровідниках підвищення температури викликає збільшення опору, але також призводить до (подальшого) збільшення провідності.
L кремнієві напівпровідникові датчики температури в забороненій зоні, як і у випадку LM75, працюють за цим принципом, дозволяючи визначати температуру шляхом кількісного визначення її впливу на напругу в кремнієвому діоді.
Апаратні компоненти LM75
LM75 також має a аналого-цифровий перетворювач за сигма-дельта модуляцією який відповідає за отримання числового (цифрового) значення температури, значення, яке згодом зберігається (кожні 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 як зонда незручне через упаковку, в якій він представлений, ТСОП (TSSOP8) Або СОІК (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 з
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
}
}
|
Дати коментар