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?
:-)
LADECADENCE.NET