DSB18B20 Digital Temperature - Disconnected/Not working (?)

Hi, I bought a DS18B20 waterproofed temperature sensor recently (actually, it’s 2, but more on this later). The code I have… just doesn’t work.

The first sensor also comes with a DFR24, practically replacing the 4k7 pull-up resistor. The code is found here DS18B20 Temperature Sensor (Arduino Compatible) wiki-DFRobot
The code mentioned is:

#include <OneWire.h>

int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2

//Temperature chip i/o
OneWire ds(DS18S20_Pin);  // on digital pin 2

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

void loop(void) {
  float temperature = getTemp();
  Serial.println(temperature);

  delay(100); //just here to slow down the output so it is easier to read

}


float getTemp(){
  //returns the temperature from one DS18S20 in DEG Celsius

  byte data[12];
  byte addr[8];

  if ( !ds.search(addr)) {
      //no more sensors on chain, reset search
      ds.reset_search();
      return -1000;
  }

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

  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }

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

  byte present = ds.reset();
  ds.select(addr);
  ds.write(0xBE); // Read Scratchpad


  for (int i = 0; i < 9;  i++  ) { // we need 9 bytes
    data[i] = ds.read();
  }

  ds.reset_search();

  byte MSB = data[1];
  byte LSB = data[0];

  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;

  return TemperatureSum;

}

However, instead of returning “25C” or something like that, I have -1000.

This prompts me to remove the board, and plug the sensor directly into the breadboard (with the help of more wires and a pull-up resistor).

// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

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

// 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);


void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
}

void loop(void)
{ 
  delay(500);
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0));  
  delay(2500);
}

This one returns -127, which stands for “DEVICE_DISCONNECTED_C”

This makes me (briefly) thinking that the first sensor is defected. However, the second sensor I bought also has the (precisely) the same issue.

I also try the DS18B20.h library this afternoon, the code (at least, with the idea of getting the temperature) is

#include <DS18B20.h>

DS18B20 ds(2);

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

void loop() {
  while (ds.selectNext()) {
    Serial.println(ds.getTempC());
  }
}

It returns 0.00

Also, I have also try to find the address of these sensors (independently, with the one-wire address finder script)

// This sketch looks for 1-wire devices and
// prints their addresses (serial number) to
// the UART, in a format that is useful in Arduino sketches
// Tutorial: 
// http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html

#include <OneWire.h>

OneWire  ds(2);  // Connect your 1-wire device to pin 2

void setup(void) {
  Serial.begin(9600);
  discoverOneWireDevices();
}

void discoverOneWireDevices(void) {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  
  Serial.print("Looking for 1-Wire devices...\n\r");
  while(ds.search(addr)) {
    Serial.print("\n\rFound \'1-Wire\' device with address:\n\r");
    for( i = 0; i < 8; i++) {
      Serial.print("0x");
      if (addr[i] < 16) {
        Serial.print('0');
      }
      Serial.print(addr[i], HEX);
      if (i < 7) {
        Serial.print(", ");
      }
    }
    if ( OneWire::crc8( addr, 7) != addr[7]) {
        Serial.print("CRC is not valid!\n");
        return;
    }
  }
  Serial.print("\n\r\n\rThat's it.\r\n");
  ds.reset_search();
  return;
}

void loop(void) {
  // nothing to see here
}

This shows nothing for the address, further strengthening the idea that my sensors are, somehow, “not connected” or “disconnected”. I’m pretty much at my wit’s end. Especially that other people, using the very same code, are able to get the temperature.

Do you guys have any idea? Thanks.

Not familiar with Arduino libraries but it seems like you normally start with

.begin() to initialize the sensors

In your case, it would be

ds.begin()

Or something of that nature

Yes. You already have the hacktronics tutorial. Stick with it rigorously and also check the wiring. While there are a lot of fakes out there, the -127 suggests it is OK.

When you mention water proof - they are not ; the connection end will let water in and the sensor quickly fails .