Topic: Control de temperatura con el ds1624

Inaguro el subforo de arduino con mi último experimento.
Tenia unas muestras de este chip cogiendo polvo por aqui, y el otro día que tenía fiebre, pensé en ponerme con él.
El ds1624(maxim) es un sensor de temperatura digital, con una precisión de 0,03125º, con una eeprom de 256bytes, y manejable a través del bus i2c. Vamos, una pequeña maravilla que podemos manejar con dos cables.
Para hacer las pruebas usé una protoboard, conecté el ds1624 (dip-8), le pasé los 5V y masa desde el arduino, y conecté a masa también sus patillas A0,A1 y A2. Sirven para darle una dirección en bus i2c y asi poder usar varios en el mismo circuito. Las direcciones i2c son de 7 bits, y de estos, el ds1624 fija las 4 primeras a 1001. Asi tenemos otros tres bits para poder direccionar hasta 8 en el mismo bus i2c. En nuestro caso, conectando las patillas de dirección a tierra, tendremos la dirección 1001000.
Bien, ahora solo queda conectar las patillas del bus i2c, SDA y SCL. Patillas 1 y 2 del ds1624 y Analog5 y Analog4 del arduino respectivamente.
Ahora para usarlo es muy sencillo. Básicamente le pedimos que empieze a convertir la temperatura con un comando, y luego con otro comando le pedimos que mande la temperatura al bus. Nos la devuelve en dos bytes. El primer byte es la parte entera, y el segundo byte lleva la parte decimal en los 5 bytes más significativos. Asi que rotándolos a la derecha y haciendo un pequeño cálculo podemos obtener la parte decimal, con esa precisión de 0,03125º. Lo he estado probando y funciona de maravilla.
Adjunto el código Arduino que he usado, si teneis alguna duda preguntad.

#include <Wire.h>      // libreria i2c

#define DS1624_ADDR B01001000  // dirección en el bus i2c
#define DS1624_CONFIG_1SHOT    B00000001  // solo convierte cuando le pedimos
#define DS1624_CONFIG_CONT    B00000000  // convierte continuamente

// Usamos una de las dos configuraciones
#define DS1624_CONFIGS        DS1624_CONFIG_CONT

// Comandos
#define DS1624_CONFIG_ADDR    0xAC
#define DS1624_READ_TEMP    0xAA
#define DS1624_SMPL_START    0xEE
#define DS1624_SMPL_STOP    0x22
#define DS1624_ACCESS_MEM    0x17



int datos[2];  // variables donde recibimos los datos
float fdecimal;
int idecimal;

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  
  // Enviamos la configuración al sensor
  Wire.beginTransmission(DS1624_ADDR);
  Wire.send(DS1624_CONFIG_ADDR);
  Wire.send(DS1624_CONFIGS);
  Wire.endTransmission();
    
  delay(5); // (ms)
  
  // le pedimos que empieze la conversión    
  if (DS1624_CONFIGS == DS1624_CONFIG_CONT) {
    Wire.beginTransmission(DS1624_ADDR);
    Wire.send(DS1624_SMPL_START);
    Wire.endTransmission();
    
    delay(1000);
  }

}

void loop() {
  // le pedimos la temperatura
  Wire.beginTransmission(DS1624_ADDR);
  Wire.send(DS1624_READ_TEMP);
  Wire.endTransmission();
  
  // La conversión prepara para enviar 2 bytes, los pedimos
  Wire.requestFrom(DS1624_ADDR,2);
  
  // Los recibimos
  for (int i=0; i<= Wire.available(); i++) {
    datos[i] = Wire.receive();
  }
  
  // convertimos la parte decimal a entera
  idecimal = datos[1] >> 3;
  fdecimal = idecimal * 0.03125;
  idecimal = fdecimal * 10000;
  
  // imprimimos el resultado en el puerto serie
  Serial.print(datos[0]);
  Serial.print(".");
  if (idecimal < 1000)   // si la parte decimal tiene menos de 4 digitos
    Serial.print("0");   // añadimos un cero delante
  Serial.println(idecimal);
  
  
  delay(2000);
}

Sencillo, no?
:-)

DAVID PELLO
LADECADENCE.NET