Muchas veces es necesario medir la temperatura pero sin contacto físico determinando la temperatura por el nivel de radiación infrarroja emitida por un objeto. 
En esos casos el sensor MLX90614 es una solución ideal, bajo costo, gran precisión y fácil de conseguir.
Este sensor puede medir tanto la temperatura ambiente como la de un objeto apuntado por el sensor.
El sensor tiene una exactitud mas que discreta de 0.02 grados, incorpora un conversor analógico de 17 bits y un DSP como centro de procesamiento de los datos obtenidos.
Puede medir la temperatura ambiente con un rango que va desde los -40 a 125 grados centígrados y el objeto apuntado tiene un rango de -70 a 380 grados centígrados.
El sensor se comunica con el microcontrolador mediante PWM o el bus I2C.
En este ejemplo estamos usando el puerto I2C conectado a un PIC18F4620, el código que interpreta los datos enviados por sensor esta escrito en C,

El siguiente es el código completo del ejemplo que se ve en el vídeo.

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
85
86
87
88
89
90
91
92
93
94
/********************************************************************************
**  Descripción  : Manejo de un termómetro infrarrojo MLX90614 por puerto I2C
**  Target       : 40 PIN PIC18F4620
**  Compiler     : MikroC para PIC v 7.1
**  XTAL         : 40MHZ - (XTAL 10Mhz con PLLx4)
*********************************************************************************/
// Pines asignados al LCD
sbit LCD_RS at LATE1_bit;
sbit LCD_EN at LATE2_bit;
sbit LCD_D4 at LATD4_bit;
sbit LCD_D5 at LATD5_bit;
sbit LCD_D6 at LATD6_bit;
sbit LCD_D7 at LATD7_bit;
 
sbit LCD_RS_Direction at TRISE1_bit;
sbit LCD_EN_Direction at TRISE2_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
 
const _IR_THERMO_ADDR = 0x5A;
const _AMB_TEMP      = 0x06;
const _OBJ_TEMP      = 0x07;
 
float Temp;
 
/*****************************************************************************
* Función para leer el sensor por I2C.
* Vectores de Lectura  
* 0x06 Para temperatura ambiente
* 0x07 Para la temperatura del objeto * Retorna el valor de temperatura en grados Kelvin. *****************************************************************************/ float Leer_Sensor(char Temp_Source){   unsigned int Temp_var;     I2C1_Start();                    I2C1_Wr(_IR_THERMO_ADDR << 1);    I2C1_Wr(Temp_Source);             I2C1_Repeated_Start();            I2C1_Wr(_IR_THERMO_ADDR << 1);    Temp_var = I2C1_Rd(0);            Temp_var = (I2C1_Rd(0) << 8) + Temp_var;   I2C1_Stop();                        return Temp_var; } /***************************************************************************** * Muestra los valores de temperatura tanto del objeto como el ambiente. *****************************************************************************/ void Mostrar_Temperatura(char Temp_Source, float temperatura){   char text[15];   sprintf(text,"%2.1f", temperatura);     if (Temp_Source == _AMB_TEMP)     Lcd_Out(2, 2, text);     Lcd_Chr(2,6,223);     Lcd_Chr(2,7,0x43);   if (Temp_Source == _OBJ_TEMP)     Lcd_Out(2, 10, text);     Lcd_Chr(2,14,223);     Lcd_Chr(2,15,0x43); }   void main() {   CMCON |=7;   ADCON1 = 0x0f;   Lcd_Init();   Lcd_Cmd(_LCD_CLEAR);   Lcd_Cmd(_LCD_CURSOR_OFF);   Lcd_Out(1,1,"Sensor PIR");     I2C1_Init(100000);             // Configura el puerto I2C   Lcd_Out(2,1,"Iniciando......");   Delay_ms(2000);     Lcd_Cmd(_LCD_CLEAR);   Lcd_Out(1,1,"Ambiente ");   Lcd_Out(1,9," Objeto");     while (1){     Temp = Leer_Sensor(_AMB_TEMP);         // Lee Temp. ambiente     Temp = (Temp * 0.02) - 273.15;         // Convierte a grados Celsius     Mostrar_Temperatura(_AMB_TEMP, Temp);  // Muestra los datos     Temp = Leer_Sensor(_OBJ_TEMP);         // Lee la temperatura del objeto     Temp = (Temp * 0.02) - 273.15;        //  Convierte a Celsius       Mostrar_Temperatura(_OBJ_TEMP, Temp);  // Muestra los valores       Delay_ms(500);                         // Espera        } }

 

Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.