Faux DS18B20 ?

Bonjour,
J'ai acheté sur Ebay des DS18B20 chez un vendeur français.
J'ai toujours une température mesurée proche de -40 ou -39.50 degrés au lieu de 20 degrés, quelque soit les sketch exemples des librairies OneWire ou DallasTemperature.

Est-ce que quelqu'un peut me confirmer que les exemples fonctionnent bien ?
Serais-je tomber sur des contrefacons ?

Dans le doute, je viens de demander des samples directement chez Maxim-IC.
Merci

Bonjour,

Il faudrait savoir de quel exemple tu parles, mais oui en général les exemples fonctionnent bien. Tu es sur du cablage?

Le cablage est bon, je suis sur la broche 2, et si je pose le doigt sur un capteur la valeur change.
Il est bien reconnu comme DS18B20.

Le fichier exemple est Multiple.ino de la librairie Dallastemperature.

J'ai fais un programme qui logue sur SD la valeur de 4 capteurs, et j'ai les mêmes températures:

Time(s),BattTemp(deg),MotorTemp(deg),ESCTemp(deg),AmbientTemp(deg)
1,-40.00,-40.50,-39.50,-39.50
2,-40.00,-40.50,-39.50,-39.50
3,-40.00,-40.50,-39.50,-39.50
4,-40.00,-40.50,-39.50,-39.50
5,-40.00,-40.50,-39.50,-39.50
6,-40.00,-40.50,-39.50,-39.50
7,-40.00,-40.50,-39.50,-39.50

Mon code est

/*
  Temperature and SD card datalogger

  This example shows how to log data from four DS18B20 sensors
  to an SD card using the SD library.

  The circuit:
   four DS18B20 on pin 2
   SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS/SS - pin 4 on UNO, 10 on MINI PRO

*/

#include <SPI.h>
#include <SD.h>
#include <OneWire.h>
#include <DallasTemperature.h>

const byte CS_SD = 4;
const char filename[] = "datalog.csv";

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 9

const byte NUMBER_ONE_WIRE_DEVICES = 4;

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// arrays to hold device addresses
DeviceAddress BattTemp, MotorTemp, ESCTemp, AmbientTemp;

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;        // will store last time data was updated

// constants won't change :
const long interval = 1000;           // interval at which to measure (milliseconds)

// Enable debug prints to serial monitor
#define MY_DEBUG

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);

  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

#ifdef MY_DEBUG
  Serial.println(F("Initialisation of DS18B20 sensors"));
#endif
  // Start up the library
  sensors.begin();

#ifdef MY_DEBUG
  // locate devices on the bus
  Serial.print(F("Locating devices..."));
  Serial.print(F("Found "));
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(F(" devices."));
#endif
  // Search for devices on the bus and assign based on an index. Ideally,
  // you would do this to initially discover addresses on the bus and then
  // use those addresses and manually assign them (see above) once you know
  // the devices on your bus (and assuming they don't change).
  //
  // method 1: by index
  if (!sensors.getAddress(BattTemp, 0)) {
    Serial.println(F("Unable to find address for Device 0"));
  }
  if (!sensors.getAddress(MotorTemp, 1)) {
    Serial.println(F("Unable to find address for Device 1"));
  }
  if (!sensors.getAddress(ESCTemp, 2)) {
    Serial.println(F("Unable to find address for Device 2"));
  }
  if (!sensors.getAddress(AmbientTemp, 3)) {
    Serial.println(F("Unable to find address for Device 3"));
  }

#ifdef MY_DEBUG
  // show the addresses we found on the bus
  Serial.print(F("Device 0 Address: "));
  printAddress(BattTemp);
  Serial.print(F(", Resolution: "));
  Serial.print(sensors.getResolution(BattTemp));
  Serial.print(F(","));
  switch (BattTemp[0]) {
    case 0x10:
      Serial.println(F("DS18S20"));
      break;
    case 0x28:
      Serial.println(F("DS18B20"));
      break;
    case 0x22:
      Serial.println(F("DS1822"));
      break;
    case 0x3B:
      Serial.println(F("DS1825"));
      break;
  }

  Serial.print(F("Device 1 Address: "));
  printAddress(MotorTemp);
  Serial.print(F(", Resolution: "));
  Serial.println(sensors.getResolution(MotorTemp));
  Serial.print(F(","));
  switch (MotorTemp[0]) {
    case 0x10:
      Serial.println(F("DS18S20"));
      break;
    case 0x28:
      Serial.println(F("DS18B20"));
      break;
    case 0x22:
      Serial.println(F("DS1822"));
      break;
    case 0x3B:
      Serial.println(F("DS1825"));
      break;
  }

  Serial.print(F("Device 2 Address: "));
  printAddress(ESCTemp);
  Serial.print(F(", Resolution: "));
  Serial.println(sensors.getResolution(ESCTemp));
  Serial.print(F(","));
  switch (ESCTemp[0]) {
    case 0x10:
      Serial.println(F("DS18S20"));
      break;
    case 0x28:
      Serial.println(F("DS18B20"));
      break;
    case 0x22:
      Serial.println(F("DS1822"));
      break;
    case 0x3B:
      Serial.println(F("DS1825"));
      break;
  }

  Serial.print(F("Device 3 Address: "));
  printAddress(AmbientTemp);
  Serial.print(F(", Resolution: "));
  Serial.println(sensors.getResolution(AmbientTemp));
  Serial.print(F(","));
  switch (AmbientTemp[0]) {
    case 0x10:
      Serial.println(F("DS18S20"));
      break;
    case 0x28:
      Serial.println(F("DS18B20"));
      break;
    case 0x22:
      Serial.println(F("DS1822"));
      break;
    case 0x3B:
      Serial.println(F("DS1825"));
      break;
  }
#endif

#ifdef MY_DEBUG
  Serial.println(F("Initializing SD card..."));
#endif

  // see if the card is present and can be initialized:
  if (!SD.begin(CS_SD)) {
    Serial.println(F("Card failed, or not present"));
    // don't do anything more:
    return;
  }

  // Check to see if the file exists and delete it:
  if (SD.exists(filename)) {
#ifdef MY_DEBUG
    Serial.print(filename);
    Serial.println(F(" File found, delete it"));
#endif
    SD.remove(filename);
  }

  const char firstline[] = "Time(s),BattTemp(deg),MotorTemp(deg),ESCTemp(deg),AmbientTemp(deg)";
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File myFile = SD.open(filename, FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    myFile.println(firstline);
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.print(F("Error opening "));
    Serial.println(filename);
  }

#ifdef MY_DEBUG
  Serial.println(F("SD card initialized."));
  Serial.println(F("======================="));
#endif
  //Print the first line
  Serial.println(firstline);
}

#ifdef MY_DEBUG
// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    // zero pad the address if necessary
    if (deviceAddress[i] < 16) Serial.print(F("0"));
    Serial.print(deviceAddress[i], HEX);
  }
}
#endif

// Main loop
void loop() {
  unsigned long currentMillis = millis();

  digitalWrite(LED_BUILTIN, LOW);

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    digitalWrite(LED_BUILTIN, HIGH);

    // call sensors.requestTemperatures() to issue a global temperature
    // request to all devices on the bus
    sensors.requestTemperatures();

#ifdef MY_DEBUG
    Serial.println(sensors.getTempC(BattTemp));
    Serial.println(sensors.getTempC(MotorTemp));
    Serial.println(sensors.getTempC(ESCTemp));
    Serial.println(sensors.getTempC(AmbientTemp));
#endif

    // make a string for assembling the data to log:
    String dataString = "";

    //store the timestamp
    dataString += String(currentMillis / 1000);
    dataString += ",";

    // read three sensors and append to the string:
    for (int sensor_number = 0; sensor_number < NUMBER_ONE_WIRE_DEVICES; sensor_number++) {
      float temperature = sensors.getTempCByIndex(sensor_number);
#ifdef MY_DEBUG
      Serial.println(temperature);
#endif
      if (temperature == -127) {
        dataString += "N/A";
      } else {
        dataString += String(temperature);
      }
      if (sensor_number < (NUMBER_ONE_WIRE_DEVICES - 1)) {
        dataString += ",";
      }
    }


    // open the file. note that only one file can be open at a time,
    // so you have to close this one before opening another.
    File myFile = SD.open(filename, FILE_WRITE);

    // if the file is available, write to it:
    if (myFile) {
      myFile.println(dataString);
      myFile.close();

      // print to the serial port too:
      Serial.println(dataString);

    }
    // if the file isn't open, pop up an error:
    else {
      Serial.print(F("Error opening "));
      Serial.println(filename);
    }
  }
}

datalog_multiple_DS18B20.ino (7.67 KB)

et si tu executes simplement l'exemple simple ou multiple ?

Si j’exécute n'importe quel exemple, j'ai la même température de -40 degré qui est reportée.
Si je déconnecte le capteur, j'ai bien -127 en valeur, qui montre que le capteur n'est plus détecté.

Alors là aucune idée, chez moi ces programmes ont toujours fonctionné sans problème.

Ca me confirme alors mon idée : mes capteurs doivent avoir des soucis.
Tu les achètes où tes capteurs ?

Ce qui est étonnant, c'est qu'ils soient bien reconnus, mais que la température soit complètement fausse

Je les avais achetés sur Aliexpress

Je suis alimenté par l'USB actuellement, avec une pull-up de 3.3K.
Je vais refaire un essai avec une alim externe et une pull-up de 4.7k pour voir.

A mon avis, ça ne va rien changer. Ca fonctionne bien alimenté par l'usb et la valeur du pullup n'est pas critique.
Tu as essayé de n'en connecter qu'un seul? peut être qu'il y en a un qui perturbe.

T'as testé avec cette librairie OneWire Arduino Library, connecting 1-wire devices (DS18S20, etc) to Teensy
Source
avec l'exemple DS18x20_Temperature

kamill:
A mon avis, ça ne va rien changer. Ca fonctionne bien alimenté par l'usb et la valeur du pullup n'est pas critique.
Tu as essayé de n'en connecter qu'un seul? peut être qu'il y en a un qui perturbe.

oui j'ai essyé avec 1 seul et c'est pareil.

bonjour
ils sont alimentés comment les ds18b20 ?
en normal ou en parasitic power ?

Artouste:
bonjour
ils sont alimentés comment les ds18b20 ?
en normal ou en parasitic power ?

En normal.

bonjour,
je viens d'en monter 2 pour ma couveuse
as tu bien un branchement avec un R 4.7K

gnd-------->gnd
vcc-----|--->5v
|R
sign----|--->pin X

pipersw:
En normal.

fais un test en parasitic

Oui, elle est bien présente. Je l'ai même remplacée par un potentiomètre 4.7k, et j'ai fais varier la valeur, j'ai toujours la même température.

Je vais essayé sur un raspberry pi pour voir si j'ai la même température.

j'utilise l'exemple "tester" de la librairie Dallas-temperature lors de la livraison, je les passe un a un pour identifier leur adresse
sans rien toucher a cet exemple est ce qu'il te remonte l'adresse et la température ?

Oui il remonte l'adresse et la température qui donne -40 degrés.
Ce soir je recharge les dernières versions de OneWire et DallasTemperature pour voir.

J'ai désinstallé Arduino 1.6.7, installé la 1.6.8, téléchargé les dernieres versions des lib OneWire et Dallastemperature, changer l'alim (maintenant j'ai Vmin 4.64V et Vmoy 4.75V).

Je n'ai mis qu'1 seul capteur.

Si je prends le sketch Onewire/DS18x20_Temperature:

ROM = 28 B1 24 D0 3 0 0 2C
  Chip = DS18B20
  Data = 1 88 FD 0 0 1F FF 8 10 5F  CRC=5F
  Temperature = -39.50 Celsius, -39.10 Fahrenheit
No more addresses.

Si je prends le sketch DallasTemperature/Tester:

Dallas Temperature IC Control Library Demo
Locating devices...Found 1 devices.
Parasite power is: OFF
Found device 0 with address: 28B124D00300002C
Setting resolution to 9
Resolution actually set to: 9
Requesting temperatures...DONE
Temperature for device: 0
Temp C: -39.50 Temp F: -39.10
Requesting temperatures...DONE
Temperature for device: 0
Temp C: -39.50 Temp F: -39.10
Requesting temperatures...DONE
Temperature for device: 0
Temp C: -39.50 Temp F: -39.10