[RESOLU]DS18S20 et 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();  
}

have a look at

merci beaucoup sa ma bien aidé :wink: