Uno de los sensores con los que pude trabajar y que me gustaron mucho es el MLX90614 de la compañía Melexis http://www.melexis.com/ , esta pequeña maravilla es un sensor de temperatura infrarrojo que incluye una termopila para detectar la temperatura, un amplificador de bajo ruido, un convertidor analógico digital de 17 bits y una pequeña unidad DSP, todo en el mismo ASIC, la salida puede ser en forma de señal PWM proporcional a la temperatura ó utilizando el puerto SMBUS (que es básicamente el bus I2C con algunas variaciones)

 

sensor de temperatura MLX90614

Existen varias versiones del mismo sensor, dependiendo de algunas  características, por ejemplo si es de una o dos zonas de detección, voltaje de alimentación (3 ó 5 volts) , resolución, en fin (incluso existe una versión de grado médico) pero esto se puede verificar el la hoja de especificaciones.

El costo del sensor esta alrededor de los 5 dólares a través de América II electronics, un precio mucho mas que aceptable considerando las características del sensor, aunque al escribir esto pase por algunas de la tiendas en línea de electrónica  y me sorprendí al ver como se dispararon los precios, llegando a los 27 dólares en algunos lugares como Digikey.

Interfaz del sensor con un PIC MICRO

 

En la pagina del fabricante viene una nota de aplicación para realizar la  comunicación usando el SMBUS, sin embargo esta nota de aplicación se basa en un pic10 y usando lenguaje ensamblador, que aunque nos sirve para entender el proceso de comunicación completo,  realmente no es de mucha ayuda cuando se trata de echar a andar el sensor rápidamente para una aplicación.

Para utilizar rápidamente el sensor lo mas aconsejable es utilizar algún compilador en C y utilizar directamente el puerto I2C para la comunicación, en ejemplo que coloco aquí estoy utilizando un PIC18F4550, y el compilador CCS

////  Programa para hacer interfaz con el sensor de temperatura      ////
////  infrarrojo Melexis                                                                             ////
////                                                                                                              ////
////                                                                                                              ////
////                                                                                                              ////
//// status: Funcionando                                                                        ////
//// Por: Victor Pasilla Campos                                                              ////
////    30 Agosto 2007                                                                              ////
////                                                                                                             ////
//// Notas:                                                                                                ////
////                                                                                                             ////
////                                                                                                            ////
///////////////////////////////////////////////////////////////////////////////////////

#include <18F4550.H>
//#device ADC=10
//#device ADC=8
#device HIGH_INTS=TRUE

//#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,PUT,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN // para el cristal de 20mhz
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN   // para el cristal de 12mhz
#use delay (clock=48000000)
#use rs232(baud=115200, xmit=PIN_C6,rcv=PIN_C7)

#use I2C(master,sda=PIN_B0, scl=PIN_B1)

int8 resultado1=0;
int8 resultado2=0;
int8 CRC=0;
int16 tempk=0;
float tempc=0.0;

void main (void){

   while (TRUE){
//      lectura = read_adc();
      output_toggle(pin_B4);
      i2c_start();
      //i2c_write(0x00);        // pido datos del sensor
      if (i2c_write(0xB4)==0){   // direccion del sensor melexis para mandar comando
          i2c_write(0x07);        // pido datos del sensor
          i2c_start();
        i2c_write(0xB5);        // direccion del sensor melexis para leer

          resultado1 = i2c_read(1);
          resultado2 = i2c_read(1);
          tempk= make16(resultado2,resultado1); 
          CRC = i2c_read(0);

      }
      i2c_stop();
      tempc=(tempk*0.02)-273;
      printf("temp:%3.2f\n\r",tempc);
      delay_ms(500);

   }
}

 

El programa lee de un único sensor conectado en el bus I2C y envía el resultado de la temperatura a través del puerto Serial, en la PC puede visualizarse usando cualquier SERIAL PORT MONITOR, como el que viene incluido con el compilador CCS, o incluso puede usarse el hiperterminal.