Problème capteur de température DS1820

Bonjour, alors voilà j'ai pour projet un mini frigo. Pour pouvoir gérer le fonctionnement du module Peltier j'ai besoin de connaître la température à l'intérieur du compartiment, j'utilise donc le capteur DS1820.
Pour le code j'ai utilisé la librairie Onewire que j'ai modifier. Lorsque j'implémente mon code j’obtiens ce résultat:

La température, en plus de ne pas être la bonne, ne varie pas.

Voici mon code :

#include <OneWire.h>

// initialisation des variables ici propre au capteur 

const int DS1820_PIN=2; // ici je défini sur quel port de ma carte est branché la sortie du capteur 
const int DS1820_ID=0x10; // ici c'est le début de la ROM du capteur qui permet d'observer si on a le bon type de composant 

// déclaration de l'objet ds 

OneWire  ds(DS1820_PIN);

// défintion des variables globales 

const int SERIAL_PORT=9600;
float celcius; // températiure en degrés celcius 

// initialisation du port de commmunication 
void setup(void) {
  Serial.begin(SERIAL_PORT);
  Serial.println("Initialtialisation programme") ; // commande pour observer le bon lancement du prog à l'odinateur 
}

//----------------------------------------------------------------------------------------------------------------------Acquisiontion de la température-----------------------------------------------------------\\

// définition des variables locales de la fonction 

void loop(void) {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  float celsius;
//*--- recherche,vérification et validation de communication entre le capteur et la carte ---*\\

  // recherche des capteur 
    // dans le cas où je n'ai plus de capteur
      if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
      }
    // Affichge de l'adresse du capteur (facultatif)
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }
  // Ici je vérifie que la transmission est bien passée 
  
  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();

  // Maintenant il s'agit de vérifier si le type de capteur de température est correct en allant chercher le 1er bit de ROM
  if (addr[0] != DS1820_ID){
    Serial.println(" Chip = DS1820"); // l'équipement trouvé n'est pas un DS1820
    return false ;
  }

 //*--- lecture et traitement numérique de la température  ---*\\
  // lecture est mémorisation de la température ( atttention il y a un temps de lecture qu'il faut accordé au capteur d'après la datasheet min : 200ms et max : 500ms)
  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // début de la conversion Issue “Convert T” command datasheet voir memory function
  
  delay(550);     // normalement une valeur entre 200 et 500 ms est suffisante d'après la datasheet
  
  // le capteur nous renvoit la valeur mémorisé 
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);   //    Read Scratchpad command. voir datasheet memory function
  
  // on recoit un mot de 9 octets, on va alors les placer dans un tableau de données data  
  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
 
// valeur reçue en hexa ( facultatif_pour le teste) 
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();
  
  // Convertir les données en la valuer actuelle de la température
 
  celsius = ( (data[1] << 8) + data[0] )*0.0625;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
}

Il s'agit sans peut-être du fait que le composant est mort puisque sur le montage que l'on m'a donné le capteur était monté à l'envers.

JulTur:
Bonjour, alors voilà j'ai pour projet un mini frigo. Pour pouvoir gérer le fonctionnement du module Peltier j'ai besoin de connaître la température à l'intérieur du compartiment, j'utilise donc le capteur DS1820.
Pour le code j'ai utilisé la librairie Onewire que j'ai modifier. Lorsque j'implémente mon code j’obtiens ce résultat:
...
Il s'agit sans peut-être du fait que le composant est mort puisque sur le montage que l'on m'a donné le capteur était monté à l'envers.

Bonsoir

Ton capteur n'est à priori pas "mort" ;D puisque tu récupère l'adresse 1wire qui expose que c'est bien un DS1820 (ou DS18S20 ou DS1920 code famille 0x10)

Par contre la quasi totalité des codes T° "arduino" sont prévus pour de la gestion de DS18B20 (code famille 0x28)

J'ai du code dispo pour du 0x10 , mais pas sous la main avant demain soir

finalement si ! 8)
teste çà
ne pas oublier de changer le pin pour le1W

#include <OneWire.h>

// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

OneWire  ds(D8);  // bus 1wire sur pin x ds(x)  (ne pas oublier une resistance de 4.7K entre cette ligne et +5V)

void setup(void) {
  Serial.begin(115200);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;
  byte crc;
  if ( !ds.search(addr)) {

    Serial.println("------------------ FIN DU SCAN ADRESSE---------------");
    Serial.println();
    Serial.println();
    Serial.println("                   DEBUT DU SCAN ADRESSE");
    Serial.println(" FC <--  ADRESSE  --> CK"); // FC Family Code , CK Cheksum

    ds.reset_search();
    delay(250);
    return;
  }

  //Serial.print("ROM =");
  for ( i = 0; i < 8; i++) {
    Serial.write(' ');
    if (addr[i] < 16) Serial.print("0");
    Serial.print(addr[i], HEX);
  }
  Serial.print(" ");

  if (OneWire::crc8(addr, 7) != addr[7]) {
    Serial.println("CRC is not valid!");
    return;
  }


  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.print("  Chip = DS18S20 ");  // or old DS1820 ou ds1920 ibutton
      type_s = 1;
      break;
    case 0x28:
      Serial.print("  Chip = DS18B20 ");
      type_s = 0;
      break;
    case 0x22:
      Serial.print("  Chip = DS1822 ");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end

  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  //ds.depower();
  present = ds.reset();
  ds.select(addr);
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");

  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    if (data[i] < 16) Serial.print("0");
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  //Serial.print(" CRC=");
  crc = OneWire::crc8(data, 8);
  //if (crc<16) Serial.print("0");
  //Serial.print(crc,HEX);
  //Serial.print("  ");

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  }
  else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  //fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("      Temperature = ");
  Serial.print(celsius);

  Serial.println();
  delay(250);
}

Merci pour cette réponse malheureusement j’obtiens cela :

JulTur:
Merci pour cette réponse malheureusement j’obtiens cela :

regle la vitesse de ton monitor à 115200 , le tiens est à 9600 8)

Effectivement ^^ là pour le coup je me sens un peu idiot.

Merci beaucoup votre aide m'a été très utile en plus de rapide et efficace !

Passez une bonne soirée.