[resolu] capteur ds18b20

polotche:

bricofoy:
j'avais trouvé un "scanner de bus 1Wire" qui listait tout ce qui répondait sur le bus, il te faudrait essayer un programme dans ce genre. Je crois d'ailleurs que dans les exemples de la lib que j'ai posté il y a un truc dans ce genre.
Après, pour ce que j'en ai vu, ls DS18b20 sont assez résistants, tu peux inverser data et +5 pour tester sans trop de risque de les cramer. Si ça se trouve data est sur le rouge... j'ai cherché les miens hier pour vérifier, et je ne les ai pas retrouvés :confused:

Ok,je teste cela ce soir et vous tiens au courant :wink:

Bonjour
Il serait étonnant que tes 2 sondes soient HS
Je penche plutôt pour un "pb" de cablage
si j'en crois la photo

le cable sort sur 4 conducteurs : tresse,noir,rouge,jaune
tu a cablé comment ? tresse et noir sont reliés en interne ?
les ds18b20 n'ont besoin que de 2 fils (au moins pour test)
fait un test en parasitic power avec le code dessous, je viens de tester en IDE 1.02 , 18b20 en TO92, 1920 en ibutton
tu relie tresse,noir,rouge sur GND arduino (je sais ça surprend mais c'est prevu pour :grin: ( voir datasheet ds18b20)
et jaune sur 8 arduino (j'ai testé sur 2,8,10)
bien verifier la 4.7K entre +5V et 8 arduino

#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(8);  // on pin 8
void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  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.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

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

  // convert the data to actual temperature

  unsigned int 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);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 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.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
}