Capteur de température DS1631 et Arduino

Le DS1631 est un capteur de température, et est disponible en sample sur le site de Maxim, le fabriquant. Ce capteur s'interface facilement avec l'Arduino avec une liaison I2C. Il retourne une température avec une précision réglable allant jusqu'au 1/16ème de degré.

{filename}../images/DS1631.png

Diagramme du DS1631

Ci-dessous un exemple de cablage avec l'Arduino, sachant qu'on peut choisir une partie de l'adresse I2C avec les pins A0, A1, A2 ce qui peut s'avérer pratique pour gérer plusieurs capteurs en même temps.

{filename}../images/DS1631_Arduino.png

Branchement du DS1631 avec l'Arduino

Et voici le code permettant de lire puis d'afficher la température sur à l'aide d'une liaison série sur mon Minitel.

/*
 * DS1631 Temperature sensor
 * www.peyregne.info
*/

#include

// Adress pins of the DS1631 device
// 0 if pin connected to GND, 1 to VDD

#define DS1631_A0 0
#define DS1631_A1 0
#define DS1631_A2 0

#define DS1631_CFG_R1     1  // resolution 9 to 12 bits
#define DS1631_CFG_R0     1  // set to 12 bits (750ms conversion time)
#define DS1631_CFG_POL    0  // T_OUT polarity (1=active high, 0=active low)
#define DS1631_CFG_1SHOT  1  // Conversion mode (1=one shot mode, 0=continuous mode)

// Do not change the following definitions

#define DS1631_ADDR (0x48 | DS1631_A2<<2 | DS1631_A1<<1 | DS1631_A0)

#define DS1631_CFG (DS1631_CFG_R1 << 3 \
                    | DS1631_CFG_R0 << 2 \
                    | DS1631_CFG_POL << 1 \
                    | DS1631_CFG_1SHOT)

#define DS1631_DONE_MASK 0x80;

void setup()
{
  // Opening I2C interface as Master
  Wire.begin();

  // First, stop the conversion (if configured in continuous
  // conversion mode) to access the configuration register.
  Wire.beginTransmission(DS1631_ADDR);
  Wire.send(0x22); // Stop conversion
  Wire.endTransmission();

  // Configuration of DS1631 (see Datasheet)
  Wire.beginTransmission(DS1631_ADDR);
  Wire.send(0xAC); // Access Configuration
  Wire.send(DS1631_CFG);
  Wire.endTransmission();

#if DS1631_CFG_1SHOT == 0
  // If continuous mode is set, start continuous conversion
  Wire.beginTransmission(DS1631_ADDR);
  Wire.send(0x51);
  Wire.endTransmission();
  delay(750); // delay to be sure that the first value is correct
#endif

  UCSR0C = B00100100; // passage en mode 7bits + bit de parité
  Serial.begin(1200);
  Serial.print(12,BYTE);
}


void loop()
{
  float t = 0.0;
  t = readTempOne(DS1631_CFG_1SHOT);
  Serial.print(12,BYTE);
  Serial.print(10,BYTE);
  Serial.print(13,BYTE);
  Serial.print("Temperature : ");
  Serial.print(t,4);
  Serial.print(" degres");

  delay(10000); // wait 10 seconds
}

float readTempOne(boolean oneShotMode)
{
  float temp = 0.0;

  if (oneShotMode)
  {
    // Temperature conversion request
    Wire.beginTransmission(DS1631_ADDR);
    Wire.send(0x51);
    Wire.endTransmission();

    delay(750); // delay for 12 bits precision

    // Now we wait the end of the conversion
    boolean tempAvailable = false;
    while (!tempAvailable)
    {
      // See if the conversion is finished
      // in the configuration byte
      Wire.beginTransmission(DS1631_ADDR);
      Wire.send(0xAC);
      Wire.endTransmission();
      Wire.requestFrom(DS1631_ADDR,1);
      Wire.available();
      tempAvailable = Wire.receive() & DS1631_DONE_MASK;
      delay(10);
    }
  }

  // read result
  Wire.beginTransmission(DS1631_ADDR);
  Wire.send(0xAA); // read last conversion
  Wire.endTransmission();
  Wire.requestFrom(DS1631_ADDR,2);
  Wire.available();
  int tempMS = (int) Wire.receive();
  Wire.available();
  int tempLS = (int) Wire.receive();

  tempLS >>= 4; // last 4 bits are always 0

  if (tempMS & 0x80) // if the signed bit = 1
    tempMS -= 256;

  // Float conversion
  temp = (float) (tempMS + tempLS*0.0625);

  return temp;
}
{filename}../images/photo_ds1631.jpg

Le programme en action

Commentaires

Pour commenter cet article, merci de m'écrire directement par mail : mailto