مستشعر درجة الحرارة I2C LM75
مبدأ التشغيل
El IC LM75 هو مستشعر درجة حرارة فجوة نطاق أشباه الموصلات السيليكون.
في أشباه الموصلات، الفرقة المحرمة وهي منطقة طاقة الإلكترونات التي لا يمكن زيادتها بزيادة المجال الكهربائي حيث لا توجد حالات متاحة للتحرك بسرعة أكبر. هذا الفرقة المحرمة يتم تضمينه بين نطاق التكافؤ (طاقة أقل) و فرقة القيادة (طاقة أعلى). يمكن أن يؤدي الإثارة الحرارية (زيادة درجة الحرارة للأغراض التي نحن مهتمون بها) إلى حصول بعض الإلكترونات على طاقة كافية لتمريرها إلى فرقة القيادة.
كما شرحنا في المقال السابق عن قياس درجة الحرارة الإلكترونية، في المعادن، على الرغم من أن عدد الناقلات لا يعتمد على درجة الحرارة (جميع الإلكترونات متوفرة دائما)، إلا أن حركتها تتأثر بدرجة الحرارة، بحيث تزداد المقاومة في المعادن مع ارتفاع درجة الحرارة بسبب انخفاض سرعة الإلكترونات بسبب الزيادة فيهم التحريض الحراري وتشتت الإلكترونات التي تنتجها.
وفي حالة أشباه الموصلات، نظراً لوجود ذلك الفرقة المحرمة يعتمد عدد الناقلات على درجة الحرارة (اعتمادًا على توزيع فيرمي-ديراك) مما يسبب زيادة الموصلية مع درجة الحرارة. في أشباه الموصلات، تؤدي زيادة درجة الحرارة إلى زيادة في المقاومة ولكنها تنتج أيضًا زيادة (إضافية) في الموصلية.
الكثير أجهزة استشعار درجة حرارة فجوة نطاق أشباه الموصلات السيليكون، كما هو الحال في LM75، تعمل وفقًا لهذا المبدأ، مما يسمح بتحديد درجة الحرارة عن طريق قياس تأثيرها على الجهد في صمام ثنائي السيليكون.
مكونات الأجهزة LM75
يحتوي LM75 أيضًا على محول تناظري رقمي بواسطة تعديل سيجما-دلتا وهو المسؤول عن الحصول على القيمة الرقمية (الرقمية) لدرجة الحرارة، وهي القيمة التي يتم تخزينها لاحقا (كل 100 مللي ثانية) في أحد سجلاته والتي يمكن قراءتها منها عبر الناقل I2C.
بالإضافة إلى السجل الذي يحتوي على درجة الحرارة المقاسة، يحتوي LM75 على سجل يمكن تخزين درجة الحرارة القصوى فيه بالإضافة إلى جهاز مقارنة قادر على توليد إشارة إذا تجاوزت درجة الحرارة المقاسة تلك المخزنة في هذا السجل الثاني. وحتى لا يتم إطلاق التحذير مرة أخرى حتى تنخفض درجة الحرارة المقاسة عن مستوى معين، يسمح سجل ثالث بتخزين قيمة لدرجة حرارة التباطؤ.
يتم تخزين تكوين عملية LM75 في سجل رابع يتم من خلاله تحديد الشروط التي يتم بموجبها إنشاء التحذير وطريقة إطلاق إشارة التحذير هذه (وضع المقاطعة أو وضع المقارنة) وكذلك تفعيل الجهاز (الوضع) التشغيل العادي أو الاستهلاك المنخفض) من بين معلمات أخرى.
المواصفات الفنية وتنفيذ LM75
يتراوح نطاق درجة الحرارة الذي يستطيع LM75 قياسه من -55 درجة مئوية إلى +125 درجة مئوية والدقة الرقمية هي 0.125 درجة مئوية على الرغم من أن الدقة تكون فقط ±2 درجة مئوية في أفضل الأحوال، عندما تكون درجة الحرارة بين -25 درجة مئوية و+100 درجة مئوية ودقة ±3 درجة مئوية مع درجات الحرارة القصوى، بين -55 درجة مئوية و+125 درجة مئوية.
إن تنفيذ (أجهزة) LM75 في الدائرة أمر بسيط للغاية، فهو لا يحتاج إلى مكونات أكثر من المقاومات سحب ما يصل من حافلة I2C ويمكن تشغيله بجهد يتراوح بين 2,8 فولت و 5,5 فولت حافلة I2C يمكن ترتيب ما يصل إلى ثمانية أجهزة قياس حرارة LM75 عن طريق تكوين عنوانها باستخدام الأطراف الثلاثة A0 وA1 وA2 على مستوى عالٍ أو منخفض، كما هو معتاد عادةً في هذه الحالات.
ومن ناحية أخرى، فإن استخدام LM75 كمسبار غير مريح بسبب العبوات التي يقدم فيها، TSSOP (TSSOP8) أو SEC (SO8) ويستخدم عادة لقياس درجة الحرارة المحيطة أو لقياس درجة حرارة المكونات المرتبة في بيئة الجهاز PCB حيث يوجد مقياس الحرارة LM75.
عند بدء التشغيل، يتم تكوين LM75 للكشف عن درجة حرارة قصوى تبلغ +80 درجة مئوية، ودرجة حرارة التباطؤ +75 درجة مئوية ووضع التشغيل المقارن، أي الوضع الذي يحاكي تشغيل منظم الحرارة: يقوم بتنشيط التحذير عند الوصول إلى درجة الحرارة القصوى وفقط في حالة انخفاضها عن درجة الحرارة القصوى. التباطؤ يجدد الإشعار.
استغلال LM75 من المتحكم الدقيق عبر ناقل I2C
بفضل استخدام حافلة I2C يعد تشغيل LM75 بسيطًا للغاية، ما عليك سوى الوصول إلى العنوان الذي يشغله على الحافلة لتخزين أو قراءة التكوين والحصول على قيمة درجة الحرارة المقاسة.
العنوان I2C قاعدة LM75 هي 0B01001XXX ويتم استكمالها، كما هو موضح أعلاه، بواسطة آخر ثلاث بتات عنوان يتم تعيينها بواسطة الأجهزة ذات الأطراف A0 وA1 وA2 عالية (القيمة الأولى) أو منخفضة (القيمة صفر).
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 بت الأكثر أهمية صالحة. لقراءة درجة الحرارة كعدد صحيح (مع الإشارة المشفرة متمم ثنائي) يتم تحميل البايت الأكثر أهمية أولاً في متغير int
de اردوينو ويتم تدويره 8 بتات إلى اليسار، مما يتركه في الجزء الأكثر أهمية من int
. تتم بعد ذلك قراءة البايت الثاني وإضافته إلى المتغير. int
مع عملية أو
تفسير قيمة درجة الحرارة المحملة لـ LM75
في السطر 24 يمكنك معرفة كيفية تفسير قيمة درجة الحرارة. بادئ ذي بدء، من الضروري القسمة على 32 كعدد صحيح (تدوير 11 بت ذات الصلة دون فقدان الإشارة) والقسمة على 8، وهو عدد "الخطوات" التي يتم من خلالها تمثيل درجة الحرارة (أوكتافات الدرجة) للحصول على قيمة النوع float
مع الكسور العشرية المقابلة. نظرًا لأن المترجمين (بما في ذلك toolchain 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 (نصف درجة) بحيث، حتى لو تم تخزين قيمة أصغر، سيتم أخذ فترات من هذا القرار في الاعتبار فقط.
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
}
}
}
|
نظرًا لأنه في الكود السابق تم تغيير تكوين درجات الحرارة المتعلقة بالتحذير فقط، فإن بقية العملية تتوافق مع التكوين الافتراضي.
في هذا التكوين الافتراضي هناك خاصيتان ذات صلة، أولاً وضع التحذير، افتراضيًا ما يسمى "وضع منظم الحرارة" والذي يتكون من تنشيط التحذير عند الوصول إلى درجة الحرارة القصوى (أو التحذير) وعدم إلغاء تنشيطه حتى ينخفض إلى درجة الحرارة القصوى. درجة حرارة التباطؤ. البديل هو "وضع المقاطعة"، حيث يتم تفعيل الإشارة عندما تتجاوز الحد الأقصى أو عندما تصل إلى قيمة أقل من قيمة الإشارة التباطؤ ويتم إعادة تعيينه من خلال قراءة أي سجل، وعادة ما تكون درجة الحرارة الحالية.
السمة الثانية هي أن إشارة التحذير يتم تنشيطها عند مستوى منخفض، أي أن دبوس نظام التشغيل يكون عند مستوى مرتفع حتى يتم الوصول إلى درجة حرارة التحذير القصوى. نظرًا لأن قطبية إشارة التحذير (المستوى الذي يتم تنشيطها فيه) قابلة للتكوين، في بعض التركيبات البسيطة، سيكون كافيًا استخدام هذه الإشارة (الجهاز) لاستغلال 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
}
}
|
أكتب تعليق