Sensor de temperatura MAX1668 en arduino

Introducción

Hace un tiempo conseguí algunas muestras de chips MAX1668, fabricados por MAXIM.

Estos chips permiten sensar temperatura mediante el uso de transistores PNP o NPN conectados en modo diodo, es decir uniendo la base (B) con el colector (C); con la gran ventaja de presentar lecturas de temperatura estables.

No es necesario realizar procesos de calibración adicionales. Aunque hay un error asociado de +/-3C en el rango de -60 a 100C, se podría minimizar recurriendo a la experimentación con varias muestras de transistores, hasta conseguir el que presente el menor error.

Características principales

  • Bus i2C
  • 4 sensores de temperatura externos (remotos)
  • 1 sensor local (ubicado en el encapsulado del chip)
  • No es necesario calibrar cada sensor
  • Rango de lectura de -55 a 125 C
  • Chip SMD de 16 pines
  • Los sensores se pueden construir con cualquier transistor NPN o PNP
  • Se pueden conectar hasta 9 chips en SDA/SCL (9 sensores locales y 36 sensores externos!!!)
  • Voltaje de alimentación 3 a 5 V

Librerías para arduino

El MAX1668 es un dispositivo i2C, así que para poder conectarlo a arduino podemos usar la librería Wire.

Necesitaremos familiarizarnos con los registros en los que internamente se puede acceder a la lectura de temperatura en cada sensor. En el datasheet, estos datos los podemos localizar en la página 12.

Es un chip SMD, así que tendremos que construir un soporte, sobre el cual colocaremos el encapsulado. Hace un tiempo mandé construir un shield, lo voy a localizar para continuar con el experimento.

El datasheet muestra un circuito típico de montaje, pero está orientado a dispositivos comerciales como motherboards, procesadores para PC, discos duros o tarjetas de video; en los que se usa como dispositivo de monitoreo/alarma de temperaturas.

Afortunadamente la placa arduino viene equipada con gran parte de la circuitería, solo hay que unir el pin Stby a VCC (3.3V); en el arduino solo hay que conectar GND, VCC a 3.3V, SDA y SCL.

PD: hasta aquí dejo el avance; este proyecto será en tiempo real, ya que hoy encontré los chips que tenía extraviados y quiero darles un uso en el arduino Due y en el Teensy 3.2. Por el momento estoy sin cámara, pero espero en unos días mas resolverlo.

Preparándome para el Teensy 3.6 que llegará en un par de semanas mas...

Transistores que se pueden emplear para construir los sensores externos

Para construir los sensores externos, se pueden emplear transistores de uso general tipo NPN o PNP.

Los sensores tienen dos terminales: una se prepara uniendo la base y el colector (B-C), la otra terminal del sensor es el el emisor (E). En el chip Max1668 la terminal B-C se une a DXNn; la terminal E se une a DXPn.

En teoría podría emplearse cualquier transistor, incluso un diodo 1N4148 en paralelo a un condensador cerámico 103, puede funcionar. Los diodos Schottky o los zener no funcionan. Incluso se podrían usar transistores SMD. Cabe señalar que los arreglos de diodos SMD no funcionan, tienen una configuración física semejante a la de los transistores SMD.

Para reducir el ruido eléctrico o alguna interferencia debida a la longitud del cableado, se puede instalar un capacitor cerámico de 2200 pF entre DXN y DXP. En distancias relativemente cortas, hasta unos 20 cm, se puede omitir el capacitor, si el cableado del sensor se entrelaza entre 10 y 15 veces. Hay que experimentar con la longitud y el número de vueltas del entrelazado del cable.

Los transistores que recomienda el fabricante son: CMPT3904, SST3904, KST3904-TF, SMB3904, FMMT-3904CT-ND.

Los equivalentes que he podido investigar son: MMBT3904 (SMD) y el 2n3904 (TO-92)

La especificaciones deben ser:

VCBO = 60V (max)
VCEO = 40V (max)
VEBO =   6V (max)

Ummmm

Suena atractivo, 5 puntos de medida de temperatura todo ello procesado de manera externa al microcontrolador de arduino y sin ocuparte más que las lineas sda y scl.

Lo que me hace recelar un poco más de ese integrado es su precio, si bien los thermistores son lo más barato, 5 thermistores te comen todas las entradas analógicas de un UNO.

No deja de ser interesante, no dudes de que seguiré atento a tu desarrollo

Saludos

Es cierto lo que mencionas, cabe la opción de agregar entradas analógicas al arduino con un chip extra, pero luego de un rato harán falta mas entradas para otro tipo de sensores.

Desafortunadamente MAXIM ya no tiene el envío de muestras al público en general, solo permite esa opción para correos electrónicos con giro empresarial comprobable.

Me pareció buena idea tratar de revivir los chips que pude conseguir hace un par de años. Espero que alguien allá afuera le ayude en alguno de sus proyectos.

Tras no sé que tantas pruebas, por fin conseguí acceder de forma correcta a los registros que permiten obtener los datos de temperatura, sin embargo hay que conectar en SDA/SCL otro dispositivo como por ejemplo un DS3231.

Estoy investigando si es que hace falta algún componente extra en la conexión del multisensor MAX, posiblemente SDA y SCL deben estar conectados en pull up. Estoy a la espera de algunas resistencias SMD para hacer pruebas adicionales.

Sensores de temperatura externos

Estos son los chips MAX1668 soldados sobre placas de prueba, que por cierto les van muy bien:

Los transistores con los que estoy haciendo las pruebas son de la familia 3904: 2N3904 y MMBT3904 en encapsulado SMD

El chip en la foto es un MAX6697, con el que también estoy haciendo pruebas.

Escaneo de dispositivos I2C

Este es el sketch para explorar dispositivos I2C en el teensy 3.6:

#include <Wire.h>
 
#define DS3231Pin        24
 
void setup()
{
  Wire.begin();
  pinMode(DS3231Pin, OUTPUT); 
  digitalWrite(DS3231Pin,HIGH);
 
  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}
 
void loop()
{
 while(1){  
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknow error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
  }
}

Las direcciones detectadas son:

0x1C   MAX1668
0x2A   MAX6697
0x57   EEPROM DS3231
0x68   DS3231