I2C温度センサーLM75
動作原理
El IC LM75は、 シリコン半導体バンドギャップ温度センサー.
半導体では、 禁断のバンド これは、より速く移動できる状態が存在しないため、電場の増加によって増加できない電子のエネルギーゾーンです。これ 禁断のバンド の間に含まれます 価電子帯 (エネルギーが低い)そして ドライビングバンド (より高いエネルギー)。熱励起(私たちが興味を持っている目的では温度の上昇)により、一部の電子が十分なエネルギーを獲得して、 ドライビングバンド.
前回の記事でも説明したように、 電子温度測定、金属では、キャリアの数は温度に依存しませんが(すべての電子は常に利用可能です)、その移動度は温度の影響を受けるため、金属の抵抗は温度とともに増加します。これは、次のような理由による電子の速度の低下によるものです。彼らの増加 熱撹拌 そしてそれによって生成される電子の散乱。
半導体の場合、この存在により、 禁断のバンド キャリアの数は温度に依存します(温度によって異なります)。 フェルミ・ディラック分布) 温度とともに導電率が増加します。半導体では、温度が上昇すると抵抗が増加しますが、導電率も(さらに)増加します。
たくさん シリコン半導体バンドギャップ温度センサーLM75 の場合と同様、この原理に従って動作し、シリコン ダイオードの電圧に対する温度の影響を定量化することで温度を決定できます。
LM75 ハードウェア コンポーネント
LM75には、 シグマデルタ変調によるアナログデジタルコンバータ これは、温度の数値 (デジタル) 値を取得する役割を果たします。この値は、その後 (100 ミリ秒ごとに) レジスタの XNUMX つに格納され、バス経由で読み取ることができます。 I2C.
LM75 には、測定温度を含むレジスタに加えて、最大温度を保存できるレジスタと、測定温度がこの XNUMX 番目のレジスタに保存されている温度を超えた場合に信号を生成できるコンパレータがあります。測定温度が特定のレベルを下回るまで警告を再度発令しないように、XNUMX 番目のレジスタに温度の値を保存できます。 ヒステリシス.
LM75 の動作の設定は XNUMX 番目のレジスタに保存され、警告が生成される条件、この警告信号の起動方法 (割り込みモードまたは比較モード)、およびデバイスの起動 (モード) が決定されます。他のパラメータの中でも特に、通常の動作または低消費電力)。
LM75 の技術仕様と実装
LM75 が測定できる温度範囲は -55 °C から +125 °C まで変化し、数値分解能は 0.125 °C ですが、温度が - 2 °C および +25 °C、-100 °C ~ +3 °C の最も極端な温度での精度は ±55 °C です。
回路への LM75 の実装 (ハードウェア) は非常に簡単で、抵抗以外のコンポーネントは必要ありません。 プルアップ インクルード バス I2C 2,8 V ~ 5,5 V の電圧で電力を供給できます。 バス I2C この場合は通常のように、75 つのピン A0、A1、A2 をハイ レベルまたはロー レベルでアドレスを構成することで、最大 XNUMX つの LMXNUMX 温度計を配置できます。
一方、LM75 をプローブとして使用するのは、パッケージのせいで不快です。 TSSOP (TSSOP8)または SOIC (SO8) で、通常は周囲温度の測定、または環境内に配置されたコンポーネントの温度の測定に使用されます。 PCB ここには LM75 温度計があります。
起動時に、LM75 は最大温度 +80°C、温度 ヒステリシス +75 °C およびコンパレータ動作モード、つまりサーモスタットの動作をエミュレートするモード: 最高温度に達したとき、およびそれが温度を下回った場合にのみ警告がアクティブになります。 ヒステリシス 通知を再生成します。
I75C バスを介したマイクロコントローラーからの LM2 の悪用
の使用のおかげで バス I2C LM75 の操作は非常に簡単で、バス上で占有しているアドレスにアクセスして、設定を保存または読み取り、測定された温度の値を取得するだけです。
住所 I2C LM75 のベースは 0B01001XXX で、上で説明したように、ピン A0、A1、A2 を High (値 XNUMX) または Low (値 XNUMX) に設定するハードウェアによって設定される最後の XNUMX つのアドレス ビットによって補足されます。
温度計としてのLM75
最後に測定された温度を保存するレジスタ (TEMP) はアドレス 0x00 にあり、構成レジスタ (CONF) はアドレス 0x01 にあり、温度を保存するレジスタはアドレス XNUMXxXNUMX にあります。 ヒステリシス アドレス 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 バイト (XNUMX ビット) が使用され、そのうちの最上位 XNUMX ビットのみが有効です。温度を整数として読み取るには (符号は でエンコードされています) XNUMXの補数) 最上位バイトが最初に変数にロードされます int
de Arduinoの そしてそれは 8 ビット左に回転され、 int
。次に、XNUMX 番目のバイトが読み取られて変数に追加されます。 int
OR演算を使用する
LM75 にロードされた温度値の解釈
24 行目では、温度値を解釈する方法がわかります。まず、整数として 32 で割る必要があります (符号を失わずに関連する 11 ビットを回転します)。そして、温度を表す「ステップ」数 (8 オクターブ) である XNUMX で割る必要があります。 type の値を取得するには float
対応する小数を使用します。コンパイラ ( ツールチェーン de Arduinoの) 整数の 32 による除算を最適化すると、演算が (それほど) 高速化されないため、符号を保存してビットを「手動で」回転する必要がありません。
I2C バスからのデータ受信を確認する
前のコードは、デバイスが要求したデータが到着したかどうかを確認していないにもかかわらず、問題なく動作します。 バス I2C、最もオーソドックスな (そして推奨される) のは、データが適切な数で到着するのを待つことです。通信速度やエラー耐性が十分すぎるため、データを要求するだけで待たずに読み込むコードもよくあります。例の場合は、主な意図から逸れないため、この方法で行うと便利ですが、実稼働コードの場合は、通信プロセスのリストの XNUMX 番目のポイントで提案されているように行うことをお勧めします。 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 度) を考慮するため、より小さい値が格納された場合でも、この分解能の間隔のみが考慮されます。
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
}
}
}
|
前のコードでは、警告に関連する温度の構成のみが変更されているため、残りの操作はデフォルトの構成に対応します。
このデフォルト設定には、関連する XNUMX つの特性があります。XNUMX つは警告モードです。デフォルトでは「サーモスタット モード」と呼ばれるもので、最高温度 (または警告) に達したときに警告をアクティブにし、温度が下がるまでは非アクティブにしないという構成になっています。の温度 ヒステリシス。代替手段は「割り込みモード」です。このモードでは、信号が最大値を超えたとき、または信号が許容値よりも低い値に達したときにアクティブになります。 ヒステリシス 任意の記録 (通常は現在の温度) を読み取ることでリセットされます。
75 つ目の特徴は、警告信号がローレベルでアクティブになることです。つまり、最高警告温度に達するまで OS 端子がハイレベルになることです。警告信号の極性 (警告信号がアクティブになるレベル) は設定可能であるため、一部の単純な設置では、この信号 (ハードウェア) を使用して LMXNUMX を活用するだけで十分です。たとえば、システムが停止しているときにファンを接続または切断します。一定の温度に達します。
警告温度に達した直後に警告を発せず、数回のインシデントの後に警告を発するように 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
}
}
|
コメントを投稿