I2C sıcaklık sensörü LM75
Çalışma prensibi
El IC LM75 bir silikon yarı iletken bant aralığı sıcaklık sensörü.
Yarı iletkenlerde, yasak bant Daha hızlı hareket edebilecek durumlar olmadığından, elektrik alanındaki artışla artırılamayan elektronların enerji bölgesidir. Bu yasak bant arasında yer alır değerlik bandı (düşük enerji) ve sürüş bandı (daha yüksek enerji). Termal uyarılma (ilgilendiğimiz amaçlar doğrultusunda sıcaklığın artması), bazı elektronların enerjinin ortama geçmesine yetecek kadar enerji kazanmasına neden olabilir. sürüş bandı.
Konuyla ilgili önceki makalede açıklandığı gibi elektronik sıcaklık ölçümümetallerde taşıyıcı sayısı sıcaklığa bağlı olmasa da (tüm elektronlar her zaman mevcuttur), hareketlilikleri sıcaklıktan etkilenir, böylece elektronların hızının azalması nedeniyle metallerdeki direnç sıcaklıkla artar. onların artışı termal çalkalama ve ürettiği elektronların saçılması.
Yarı iletkenler söz konusu olduğunda bunun varlığı nedeniyle yasak bant Taşıyıcıların sayısı sıcaklığa bağlıdır (bağlı olarak) Fermi-Dirac dağılımı) iletkenliğin sıcaklıkla artmasına neden olur. Yarı iletkenlerde artan sıcaklık, dirençte bir artışa neden olur, ancak aynı zamanda iletkenlikte (daha fazla) bir artışa da neden olur.
Jardines de Viveros silikon yarı iletken bant aralığı sıcaklık sensörleriLM75'te olduğu gibi, bu prensibe göre çalışır ve sıcaklığın silikon diyottaki voltaj üzerindeki etkisinin ölçülmesiyle belirlenmesine olanak tanır.
LM75 Donanım Bileşenleri
LM75 ayrıca bir Sigma-Delta modülasyonuyla analog-dijital dönüştürücü sıcaklığın sayısal (dijital) değerinin elde edilmesinden sorumludur; bu değer daha sonra (her 100 ms'de bir) veri yolu aracılığıyla okunabilen kayıtlarından birinde saklanır I2C.
Ölçülen sıcaklığı içeren kayıt defterine ek olarak LM75, maksimum sıcaklığın depolanabileceği bir kayıt defterine ve ayrıca ölçülen sıcaklığın bu ikinci kayıtta depolanan sıcaklığı aşması durumunda sinyal üretebilen bir karşılaştırıcıya sahiptir. Ölçülen sıcaklık belirli bir seviyenin altına düşene kadar uyarının tekrar başlamaması için üçüncü bir kayıt, sıcaklığın değerinin saklanmasına olanak sağlar. histerezis.
LM75 işleminin konfigürasyonu, uyarının oluşturulduğu koşulların, bu uyarı sinyalini başlatma yolunun (kesinti modu veya karşılaştırma modu) yanı sıra cihazın aktivasyonunun (mod) belirlendiği dördüncü bir kayıtta saklanır. diğer parametrelerin yanı sıra normal çalışma veya düşük tüketim).
LM75'in teknik özellikleri ve uygulaması
LM75'in ölçebildiği sıcaklık aralığı -55 °C ile +125 °C arasında değişir ve sayısal çözünürlük 0.125 °C'dir, ancak sıcaklık - - arasında olduğunda en iyi durumda hassasiyet yalnızca ±2 °C'dir. 25 °C ve +100 °C ve −3 °C ile +55 °C arasındaki en ekstrem sıcaklıklarda ±125 °C doğruluk.
LM75'in bir devredeki uygulaması (donanımı) çok basittir, dirençlerden daha fazla bileşene ihtiyaç duymaz çekme del otobüs I2C ve 2,8 V ile 5,5 V arasındaki voltajla çalıştırılabilir. Aynı zamanda otobüs I2C Bu durumlarda genellikle olduğu gibi, adresleri A75, A0 ve A1 üç pimi yüksek veya düşük seviyede yapılandırılarak sekiz adede kadar LM2 termometre düzenlenebilir.
Öte yandan LM75’in prob olarak kullanımı, sunulduğu paketler nedeniyle sakıncalıdır, TSBOP (TSSOP8) o SEC (SO8) ve normalde ortam sıcaklığını ölçmek veya cihazın ortamında düzenlenmiş bileşenlerin sıcaklığını ölçmek için kullanılır. PCB LM75 termometrenin bulunduğu yer.
Başlangıçta, LM75 maksimum +80°C sıcaklığı algılayacak şekilde yapılandırılmıştır. histerezis +75 °C ve karşılaştırıcı çalışma modu, yani bir termostatın çalışmasını taklit eden mod: maksimum sıcaklığa ulaşıldığında ve yalnızca sıcaklığın altına düştüğünde uyarıyı etkinleştirir. histerezis Bildirimi yeniden oluşturur.
LM75'in bir mikrodenetleyiciden I2C veri yolu aracılığıyla kullanılması
Kullanımı sayesinde otobüs I2C LM75'in çalışması çok basittir; yapılandırmayı saklamak veya okumak ve ölçülen sıcaklığın değerini elde etmek için veriyolunda bulunduğu adrese erişmeniz yeterlidir.
Adres I2C LM75'in tabanı 0B01001XXX'tir ve yukarıda açıklandığı gibi, A0, A1 ve A2 pinleri yüksek (bir değer) veya düşük (sıfır değeri) olan donanım tarafından ayarlanan son üç adres biti ile desteklenir.
Termometre olarak LM75
Son ölçülen sıcaklığı (TEMP) saklayan kayıt 0x00 adresinde bulunur, konfigürasyon kaydı (CONF) 0x01 adresindedir, sıcaklığı saklayan kayıt ise XNUMXxXNUMX adresindedir. histerezis 0x02 adresinde ve maksimum veya aşırı sıcaklığın (TOS) 0x03 adresi vardır. Mevcut sıcaklık (TEMP) dışında hepsi okuma ve yazma işlevi görmektedir.
için geliştirilen bazı kod örneklerini kullanma Arduino (neredeyse evrensel bir referans haline geldi) LM75'in çalışması daha da açıklığa kavuşturulabilir. En temel kullanışlı örnek, son ölçülen sıcaklığın kaydını okuyarak LM75'i termometre olarak kullanmaktır.
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 } |
İşlem, bir cihazla çalışırken olağan işlemdir I2C:
- Kitaplığı ekle I2C olan koda
#include <Wire.h>
- Kütüphaneyi başlat I2C kullanma
Wire.begin();
- LM75 sıcaklık sensörüne aşağıdakileri kullanarak erişin:
Wire.beginTransmission(DIRECCION_LM75)
- Kullanılarak erişilen kayıt defterinin adresini gönderin.
Wire.write(REGISTRO)
- Bırakın otobüs I2C ile
Wire.endTransmission()
- LM75'e yeniden erişin
- Kayıt defteri değerini şununla isteyin:
Wire.requestFrom(DIRECCION,CANTIDAD)
- kullanılarak verinin alındığını doğrulayın.
Wire.available()
- İstenilen değeri okuyun
Wire.read()
(bayt sayısı kadar) - Çok önemli olmasa da, işiniz bittiğinde serbest bırakın. otobüs I2C
kullanarak cihaz günlüklerinde bilgi almak veya depolamak için olağan protokole ek olarak otobüs I2CLM75'in sağladığı verilerden yararlanmak için sıcaklığı dahili olarak temsil ettiği formatın dikkate alınması gerekir.
LM75 sıcaklık kayıtlarında saklanan değerin elde edilmesi
Önceki örnekteki kodun 22. satırında LM75'in üç sıcaklık kaydı tarafından saklanan bilgilerin nasıl yükleneceğini görebilirsiniz. Yalnızca en önemli 16 bitinin geçerli olduğu iki bayt (11 bit) kullanır. Sıcaklığı bir tamsayı olarak okumak için (işaret kodlanmış olarak) Ikisinin tamamlayıcısı) en anlamlı bayt ilk önce bir değişkene yüklenir int
de Arduino ve 8 bit sola döndürülerek dizinin en önemli kısmında bırakılır. int
. Daha sonra ikinci bayt okunur ve değişkene eklenir. int
VEYA işlemiyle
LM75'in yüklü sıcaklık değerinin yorumlanması
24. satırda sıcaklık değerinin nasıl yorumlanacağını görebilirsiniz. Öncelikle 32'ye tamsayı olarak bölmek (ilgili 11 biti işareti kaybetmeden döndürün) ve sıcaklığın temsil edildiği "adım" sayısı olan (bir derecenin oktavı) 8'e bölmek gerekir. türünde bir değer elde etmek için float
karşılık gelen ondalık sayılarla. Derleyicilerden bu yana (dahil araç zinciri de Arduino) tam sayı bölümünü 32'ye kadar optimize ettiğinizde, işlem (kayda değer ölçüde) daha hızlı olmadığından, işareti korumak ve bitleri "manuel olarak" döndürmek gerekli değildir.
I2C veriyolundan veri alımını doğrulayın
Her ne kadar önceki kod, cihazın istediği verinin gelip gelmediği doğrulanmasa da sorunsuz çalışacaktır. otobüs I2C, en ortodoks (ve tavsiye edilen) şey, verilerin uygun sayıya ulaşmasını beklemektir. İletim hızı ve hatalara karşı dayanıklılık fazlasıyla yeterli olduğundan, verilerin basitçe istendiği ve beklemeden okunduğu kod bulmak yaygındır. Örnekler için bu şekilde yapmak, asıl amaçtan uzaklaşmamaları açısından faydalıdır ancak üretim kodu için, iletişim süreci listesinin yedinci noktasında önerildiği gibi yapılması tavsiye edilir. I2C. Aşağıdaki örnekteki kod, LM75'in kullanım aşamasında kullanılması için önerilen değişiklikleri vurgulamaktadır.
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'in çalışmasını yapılandırma
LM75'in en temel konfigürasyonu, uyarıyı oluşturmak için maksimum sıcaklığın belirlenmesinden oluşur ve histerezisne zaman devre dışı bırakılacağını ve tekrarlanabileceğini belirleyecektir. Bu değerleri yapılandırmak için bunları yalnızca ilgili kayıtlarda saklamanız gerekir.
Mevcut sıcaklık kaydı gibi, maksimum (uyarı) sıcaklık ve histerezis İki bayt kullanırlar, ancak ilkinden farklı olarak 11 bit (bir derecenin sekizde biri) yerine 9'u (yarım derece) dikkate alırlar, böylece daha küçük bir değer depolansa bile yalnızca bu çözünürlükteki aralıklar dikkate alınır.
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 } } } |
Önceki kodda yalnızca uyarıyla ilgili sıcaklıkların konfigürasyonu değiştirildiğinden, işlemin geri kalanı varsayılan konfigürasyona karşılık gelir.
Bu varsayılan konfigürasyonda ilgili iki karakteristik vardır; birincisi, varsayılan olarak "termostat modu" olarak adlandırılan ve maksimum sıcaklığa (veya uyarıya) ulaşıldığında uyarının etkinleştirilmesinden ve sıcaklık sıcaklığının altına inene kadar devre dışı bırakılmamasından oluşan uyarı modudur. sıcaklığı histerezis. Bunun alternatifi, sinyalin maksimum değeri aştığında veya daha düşük bir değere ulaştığında etkinleştirildiği "kesme modu"dur. histerezis ve herhangi bir kaydın (normalde mevcut sıcaklık) okunmasıyla sıfırlanır.
İkinci özellik ise uyarı sinyalinin düşük seviyede devreye girmesi yani OS pininin maksimum uyarı sıcaklığına ulaşılıncaya kadar yüksek seviyede kalmasıdır. Uyarı sinyalinin polaritesi (etkinleştirildiği seviye) yapılandırılabilir olduğundan, bazı basit kurulumlarda, LM75'ten yararlanmak için bu sinyali (donanımı) kullanmak, örneğin sistem çalışırken bir fanı bağlamak veya bağlantısını kesmek yeterli olacaktır. belli bir sıcaklığa ulaşır.
LM75'in çalışmasını, uyarı sıcaklığına ulaştıktan hemen sonra uyarı vermeyecek, ancak bunu birkaç olaydan sonra yapacak şekilde yapılandırmak da mümkündür. Bu davranış, sıcaklık sınırında çalışırken veya sıcaklığın çok hızlı değiştiği durumlarda çok faydalıdır. LM75, maksimum sıcaklığın bir, iki, dört veya altı kez aşılması durumunda uyarı verecek şekilde yapılandırılabilir.
Konfigürasyon kaydında ayrıca LM75'i devre dışı bırakmak ("kapatmak") ve düşük tüketim moduna girmek için bir bit vardır; bu bit tekrar değiştirilerek veya sadece bir sonraki kayıt okunurken çıkılır.
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 } } |
Yorum Ekle