[RESOLU]Problème de programme DS18S20 avec led

Salut à tous alors voila je suis novice dans l'électronique et j'ai besoin d'aide.

J'ai un projet pour automatisé un terrarium, je fait tout étape par étape. j'ai l'attention de contrôler la température avec un DS18S20 étanche. Pour l'instant je voudrais qu'une led clignote quand c'est trop chaud et une autre quand c'est trop froid. j'ai déja un code pour vérifier la température de plusieurs sonde. Mon problème c'est que je sait pas comment tourné le code (pour une sonde) pour m'indiqué d'une led bleu t°C inférieur à 23°C, une led rouge t°C supérieur à 26°C et une led verte pour une température comprise entre 23°C et 26°C.

Merci d'avance pour votre aide.

Voici mon code :

#include <OneWire.h>

/* DS18S20 Celcius degrees */
#define TEMP_LSB 0
#define TEMP_MSB 1
//#define CONFIG_REG 4
OneWire  ds(11);  // on pin 11
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
byte i;
byte data[12];
byte addr[8];
byte present = 0;
int set_bit;
int resolution_floor = 1;   //for setting resolution 0 = High-resolution , 3 = Low resolution
int msb,lsb,T;
int temp_c_int;
int test_bit;
float expon;
float temp_c_frac;
float temp_c;
float temp_f;
if ( !ds.search(addr)) {
    Serial.print("No more addresses.\n");
    ds.reset_search();
    return;
}
Serial.print("R=");
for( i = 0; i < 8; i++) {
  Serial.print(addr[i], HEX);
  Serial.print(" ");
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
    Serial.print("CRC is not valid!\n");
    return;
}
if ( addr[0] != 0x28) {
    Serial.print("Device is not a DS18B20 family device.\n");
    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.
present = ds.reset();
ds.select(addr);    
ds.write(0xBE);         // Read Scratchpad
for ( i = 0; i < 12; i++) {           // we need 9 bytes
  data[i] = ds.read();
}

 /* compute the degrees in celcius / integer part */
/* The measured temp is spread across two bytes of the returned data.
 *  The integer part of the temp value is spread across the least 3 significant
 *  bits of the most significant byte (MSB) and the most significant 4 of 
 *  the LSB.  Here we shift those 7 bits into their proper place in our
 *  result byte. 
 * note: could do this with 2 bit-shift / mask operations, alternatively
 */
  temp_c_int = 0;
  set_bit = 6;
for (test_bit = 2; test_bit >= 0; test_bit--) {
  temp_c_int |= ( ((data[TEMP_MSB] & (1 << test_bit)) >> test_bit) << set_bit );
  set_bit--;
}
for (test_bit = 7; test_bit >= 4; test_bit--) {
  temp_c_int |= ( ((data[TEMP_LSB] & (1 << test_bit)) >> test_bit) << set_bit );
  set_bit--;
}
/* compute the fractional part */
/*  first figure out what resolution we're measuring in - varies between 1 and 4 bits
 *    after the decimal (based on the contents of the CONFIG_REG byte):
 *        bit 6 == 0 && bit 5 == 0 --> 9-bit resolution (ignore 3 least sig bits)
 *        bit 6 == 0 && bit 5 == 1 --> 10-bit resolution (ignore 2 least sig bits)
 *        bit 6 == 1 && bit 5 == 0 --> 11-bit resolution (ignore 1 least sig bits)
 *        bit 6 == 1 && bit 5 == 1 --> 12-bit resolution   
if ((data[CONFIG_REG] & (1 << 5)) > 0) {        
if ((data[CONFIG_REG] & (1 << 4)) > 0) {      // bits 6 and 5 are set
    resolution_floor = 3;
  } else {                                      // bit 6 is set, 5 is clear
    resolution_floor = 2;
  }
  } else {
  if ((data[CONFIG_REG] & (1 << 4)) > 0) {      // bits 6 is clear, 5 is set
    resolution_floor = 1;
  } else {                                      // bit 6 and 5 are clear
    resolution_floor = 0;
  }
}    */
temp_c_frac = 0;
for (test_bit = 3; test_bit >= resolution_floor; test_bit--) {
  if ((data[TEMP_LSB] & (1 << test_bit)) > 0) {
    expon = test_bit - 4; // will be negative
    temp_c_frac += pow(2,expon);
  }
}
/* put it all together */
temp_c = (float)temp_c_int + temp_c_frac;  
if ((data[TEMP_MSB] & (1 << 7)) > 0) {   // the temp is negative
  temp_c *= -1;
}
Serial.print("   Temp en C= ");
Serial.print(temp_c_int,DEC);
Serial.print(".");
Serial.print(temp_c_frac * 10000,DEC);
Serial.println();  
}

modifiez votre post car le code n'est pas mis...

j'ai un petit projet dont j'ai posté le code qui pourrait aussi vous servir pour vous donner des idées

le post que vous m'avais envoyé et très intéressant. :slight_smile: Je pense l'utilisé dans le même but et aussi sur un autre projet. Je vais le lire attentivement et voir si je m'en sort :wink:

AdriXx:
le post que vous m'avais envoyé et très intéressant. :slight_smile: Je pense l'utilisé dans le même but et aussi sur un autre projet. Je vais le lire attentivement et voir si je m'en sort :wink:

bonjour
tu es certain que c'est bien un DS18S20 et pas "autre chose ?
çà donne qoui avec le prog ci-dessous ?

#include <OneWire.h>
// Onewire lib is here http://www.pjrc.com/teensy/td_libs_OneWire.html

OneWire  ds(8);  //  don't forget 4.7K resistor between +5V and DQ pin
void setup(void) {
  Serial.begin(9600);
  
}

void loop(void) {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];

  if ( !ds.search(addr)) {
    Serial.println("--------------");
    Serial.println(".");
    Serial.println(".");
    Serial.println("END OF SCAN.");


    Serial.println(".");
    Serial.println();

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

  Serial.println("--------------");



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

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


  Serial.print("CHIP FAMILY ");
  Serial.print(addr[0],HEX);
  // the first ROM byte indicates which chip
  Serial.print(" =  ");
  switch (addr[0]) {

  case 0x01:
    Serial.println(" DS1990 DS2401");  // 
    break;
  case 0x02:
    Serial.println(" DS1991");  // 
    break;
  case 0x04:
    Serial.println(" DS1994");  // 
    break;
  case 0x05:
    Serial.println(" DS2405");  // 
    break;
  case 0x06:
    Serial.println(" DS1992");  // 
    break;
  case 0x08:
    Serial.println(" DS1993");  // 
    break;
  case 0x0B:
    Serial.println(" DS1985");  
    break;
  case 0x10:
    Serial.println(" DS1820 DS18S20 DS1920");  
    break;
  case 0x12:
    Serial.println(" DS2406");  
    break;
  case 0x21:
    Serial.println(" DS1921");
    break;
  case 0x22:
    Serial.println(" DS1822");
    break;
    case 0x23:
    Serial.println(" DS2433");
    break;
  case 0x24:
    Serial.println(" DS1904");
    break;
  case 0x28:
    Serial.println(" DS18B20");
    break;
  case 0x29:
    Serial.println(" DS2408");  
    break;
    case 0x2C:
    Serial.println(" DS2890");  
    break;
  case 0x36:
    Serial.println(" DS2740");  
    break;
  case 0x3B:
    Serial.println(" DS1825");  
    break;
  case 0x41:
    Serial.println(" DS1923");  
    break;

case 0xB3:
    Serial.println(" CHIP cartouche laser");  
    break;
  default:
    Serial.println(" is not listed.");

    return;
  } 

}

bon jai vérifier ton code Shannon Member il m'indique que c'est un DS18B20 et non un DS18S20 par contre ton code marche bien mais sa me dit pas la T°C. Sinon le mien oui les 2 sondes me donne la T°C.

Bonjour,

AdriXx:
bon jai vérifier ton code Shannon Member il m'indique que c'est un DS18B20 et non un DS18S20 par contre ton code marche bien mais sa me dit pas la T°C. Sinon le mien oui les 2 sondes me donne la T°C.

Si tu regardes un peu, tu verras qu'il n'est pas fait pour indiquer la température mais pour détecter le composant oneWire présent.
:wink:

re a tous !!!

c'est bon j'ai enfin trouvé ce que je cherché merci pour votre aide !

je vous donne mon code qui fonctionne parfaitement pour moi :grinning:

#include <OneWire.h> // Inclusion de la librairie OneWire
 
#define DS18B20 0x28     // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 7 // Broche utilisée pour le bus 1-Wire
 
OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
 
// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp){
  byte data[9], addr[8];
  // data : Données lues depuis le scratchpad
  // addr : adresse du module 1-Wire détecté
 
  if (!ds.search(addr)) { // Recherche un module 1-Wire
    ds.reset_search();    // Réinitialise la recherche de module
    return false;         // Retourne une erreur
  }
   
  if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
    return false;                        // Si le message est corrompu on retourne une erreur
 
  if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
    return false;         // Si ce n'est pas le cas on retourne une erreur
 
  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20
   
  ds.write(0x44, 1);      // On lance une prise de mesure de température
  delay(800);             // Et on attend la fin de la mesure
   
  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20
  ds.write(0xBE);         // On envoie une demande de lecture du scratchpad
 
  for (byte i = 0; i < 9; i++) // On lit le scratchpad
    data[i] = ds.read();       // Et on stock les octets reçus
   
  // Calcul de la température en degré Celsius
  *temp = ((data[1] << 8) | data[0]) * 0.0625;
   
  // Pas d'erreur
  return true;
}
 
// setup()
void setup() {

  pinMode (2, OUTPUT);
  pinMode (3, OUTPUT);
  pinMode (4, OUTPUT);
  pinMode (5, OUTPUT);
  Serial.begin(9600); // Initialisation du port série
}
 
// loop()
void loop() {
  float temp;
   
  // Lit la température ambiante à ~1Hz
  if(getTemperature(&temp)) {
     
    // Affiche la température
    Serial.print("Temperature : ");
    Serial.print(temp);
    Serial.write(176); // caractère °
    Serial.write('C');
    Serial.println();
    }
  
 else if ((temp)<= 20){
    digitalWrite(2,LOW);
    digitalWrite(3,HIGH);
    digitalWrite(4,LOW);
    digitalWrite(5,LOW);
    }
  else if ((((temp)> 20))&& (temp)<22){
    digitalWrite(2,LOW);
    digitalWrite(3,LOW);
    digitalWrite(4,LOW);
     digitalWrite(5,HIGH);
  }
  else if ((((temp)>=22))&& (temp)<25){
    digitalWrite(2,HIGH);
    digitalWrite(3,LOW);
    digitalWrite(4,LOW);
     digitalWrite(5,LOW);
  }
 else if ((temp)>= 25){
    digitalWrite(2,LOW);
    digitalWrite(3,LOW);
    digitalWrite(4,HIGH);
    digitalWrite(5,LOW);
  }
delay(10);  
}