I2C 온도 센서 LM75
작동 원리
El IC LM75는 실리콘 반도체 밴드갭 온도 센서.
반도체에서는 금지된 밴드 더 빠르게 움직일 수 있는 상태가 없기 때문에 전기장이 증가해도 증가할 수 없는 것은 전자의 에너지 영역입니다. 이것 금지된 밴드 사이에 포함됩니다. 가전자대 (낮은 에너지) 그리고 드라이빙 밴드 (더 높은 에너지). 열 여기(우리가 관심 있는 목적에 따른 온도 증가)는 일부 전자가 드라이빙 밴드.
이전 글에서 설명했듯이 전자 온도 측정, 금속의 경우 캐리어의 수는 온도에 의존하지 않지만(모든 전자는 항상 사용 가능) 이동도는 온도의 영향을 받습니다. 따라서 금속의 저항은 다음으로 인한 전자 속도의 감소로 인해 온도에 따라 증가합니다. 그들의 증가 열 교반 그리고 그것이 생성하는 전자의 산란.
반도체의 경우 이 물질이 존재하기 때문에 금지된 밴드 캐리어 수는 온도에 따라 다릅니다(온도에 따라 다름). 페르미-디랙 분포) 온도에 따라 전도도가 증가합니다. 반도체에서는 온도가 증가하면 저항이 증가하지만 전도성도 (더) 증가합니다.
롯 실리콘 반도체 밴드갭 온도 센서LM75의 경우와 마찬가지로 이 원리에 따라 작동하여 온도가 실리콘 다이오드의 전압에 미치는 영향을 정량화하여 결정할 수 있습니다.
LM75 하드웨어 구성 요소
LM75에는 시그마-델타 변조에 의한 아날로그-디지털 변환기 온도의 숫자(디지털) 값을 얻는 역할을 하며, 이 값은 이후 버스를 통해 읽을 수 있는 레지스터 중 하나에 저장됩니다(100ms마다). 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,8V에서 5,5V 사이의 전압으로 전원을 공급받을 수 있습니다. 버스 I2C 일반적인 경우처럼 75개의 핀 A0, A1, A2를 하이 또는 로우 레벨로 구성하여 최대 XNUMX개의 LMXNUMX 온도계를 배열할 수 있습니다.
반면에 LM75를 프로브로 사용하는 것은 제공되는 패키지로 인해 불편합니다. TSSOP (TSSOP8) 또는 비서 (SO8) 일반적으로 주변 온도를 측정하거나 주변 환경에 배열된 구성 요소의 온도를 측정하는 데 사용됩니다. PCB LM75 온도계가 있는 곳.
시작 시 LM75는 최대 +80°C의 온도를 감지하도록 구성됩니다. 히스테리시스 +75°C 및 비교기 작동 모드, 즉 온도 조절 장치의 작동을 에뮬레이트하는 모드: 최대 온도에 도달하고 온도가 온도 이하로 떨어질 경우에만 경고를 활성화합니다. 히스테리시스 공지를 재생성합니다.
I75C 버스를 통해 마이크로컨트롤러에서 LM2 활용
사용 덕분에 버스 I2C LM75의 작동은 매우 간단합니다. 버스에서 차지하는 주소에 액세스하여 구성을 저장하거나 읽고 측정된 온도 값을 얻으면 됩니다.
주소 I2C LM75의 기본은 0B01001XXX이며 위에서 설명한 대로 하드웨어에 의해 핀 A0, A1 및 A2가 높음(값 XNUMX) 또는 낮음(값 XNUMX)으로 설정되는 마지막 세 개의 주소 비트로 보완됩니다.
온도계로서의 LM75
마지막으로 측정된 온도를 저장하는 레지스터(TEMP)는 주소 0x00에 있고, 구성 레지스터(CONF)는 주소 0x01에 있으며, 온도를 저장하는 레지스터는 다음과 같습니다. 히스테리시스 주소 0x02에 있고 최대 또는 과열(TOS)은 주소 0x03에 있습니다. 현재온도(TEMP)를 제외하고 모두 읽기, 쓰기 기능을 합니다.
위해 개발된 일부 코드 예제 사용 아두 이노 (거의 보편적인 기준이 됨) 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비트)를 사용하며 그 중 최상위 XNUMX비트만 유효합니다. 온도를 정수로 읽으려면(부호는 2의 보수) 가장 중요한 바이트가 변수에 먼저 로드됩니다. int
de 아두 이노 왼쪽으로 8비트 회전되어 가장 중요한 부분에 남게 됩니다. int
. 그런 다음 두 번째 바이트를 읽고 변수에 추가합니다. int
OR 연산으로
LM75의 부하 온도 값 해석
24행에서는 온도 값을 해석하는 방법을 볼 수 있습니다. 우선 32를 정수로 나누고(부호를 잃지 않고 관련 11비트를 회전) 온도를 나타내는 '단계' 수(도의 옥타브)인 8로 나누어야 합니다. 유형의 값을 얻으려면 float
해당 소수점으로. 컴파일러(포함) 이후 도구 모음 de 아두 이노) 정수 나누기를 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비트(XNUMX/XNUMX도)가 아닌 XNUMX(XNUMX도)를 고려하므로 더 작은 값이 저장되더라도 이 해상도의 간격만 고려됩니다.
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는 최대 온도를 XNUMX회, XNUMX회, XNUMX회 또는 XNUMX회 초과한 후 경고하도록 구성할 수 있습니다.
구성 레지스터에는 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
}
}
|
코멘트 남기기