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é.

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.

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;
}

Le programme en action
Commentaires
Pour commenter cet article, merci de m'écrire directement par mail :