XIAO nRF52840 with DS18B20 sensor (Mbed)

Hi !

Has anyone managed to run the DS18B20 temperature sensor on XIAO nRF52840 on Mbed (v2.9.2) ?

I tried all the recommendations I found on this forum, the sensor is not visible. I tried several sensors on different legs, a 4.7 kohm resistor is installed.

What are some tips ?
Maybe someone has a working example, please share

Best Regards

  1. IDE v 2.2.1
  2. Mbed v2.9.2
  3. OneWire library v2.3.7 (OneWire - Arduino Reference)
  4. Pin D10 (P1.15)

my code

#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!
// https://github.com/milesburton/Arduino-Temperature-Control-Library

OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)

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

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[9];
  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
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t 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);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 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");
}

variant № 2

  1. IDE v 2.2.1
  2. Mbed v2.9.2
  3. MaximWire ( GitHub - adameat/MaximWire: MaximWire library for Arduino 33 BLE and DS18B20 sensor)
  4. Pin D10 (P1.15)

my code


#define MAXIMWIRE_EXTERNAL_PULLUP
#include <MaximWire.h>  

#define PIN_BUS 10                          // ( P1.15)
MaximWire::Bus bus(PIN_BUS);
MaximWire::DS18B20 device;

void setup() {

  Serial.begin(9600);
  while (!Serial) delay(10);
  Serial.println("Serial OK");
}


void loop() {

  if (device.IsValid()) {
    float temp = device.GetTemperature<float>(bus);
    Serial.println(temp);
    device.Update(bus);
  } else {
    Serial.println(device.ToString());
    device.Reset();
  }
delay(1000);
}

Hi there,
If I may… Have you tried rolling back to , Let’s say 2.9.1 , I would try a basic address scan first, then I would proceed. that is a 3.3v Sensor Y/N ? Parasitic power setup or you Powering it with 3.3v?
my 02.
HTH
GL :slight_smile: PJ

maybe try this?

/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com  
  Based on the Dallas Temperature Library example
*********/

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

// Data wire is conntec to the Arduino digital pin 4
#define ONE_WIRE_BUS 4

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

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

void setup(void)
{
  // Start serial communication for debugging purposes
  Serial.begin(9600);
  // Start up the library
  sensors.begin();
}

void loop(void){ 
  // Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus
  sensors.requestTemperatures(); 
  
  Serial.print("Celsius temperature: ");
  // Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
  Serial.print(sensors.getTempCByIndex(0)); 
  Serial.print(" - Fahrenheit temperature: ");
  Serial.println(sensors.getTempFByIndex(0));
  delay(1000);
}

edit in your pin #…
GL
here’s the important part from the data sheet.

Hello !

I rolled back the mbed version to 2.9.1 and checked your code.
He gets hung up on the sensors.begin() command;
I added 2 more operators and only the line “Test 1” comes to the terminal and then the board no longer responds

/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com  
  Based on the Dallas Temperature Library example
*********/

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

// Data wire is conntec to the Arduino digital pin 4
#define ONE_WIRE_BUS 10

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

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

void setup(void) {
  // Start serial communication for debugging purposes
  Serial.begin(9600);
  delay(5000);
  // Start up the library
  Serial.print("Test 1");
  delay(5000);
  sensors.begin();
  Serial.print("Test 2");
}

void loop(void) {
  // Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus
  sensors.requestTemperatures();

  Serial.print("Celsius temperature: ");
  // Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
  Serial.print(sensors.getTempCByIndex(0));
  Serial.print(" - Fahrenheit temperature: ");
  Serial.println(sensors.getTempFByIndex(0));
  delay(1000);
}

I connect the sensor according to this scheme

Does anyone have a chance to check this or any other advice?

Hi there,
that’s good. Where are you getting the 3.3v for the Sensor?
Can you try this configuration?


are you using this onewire LIB? https://github.com/PaulStoffregen/OneWire.git
and this Dallas LIB? https://github.com/milesburton/Arduino-Temperature-Control-Library.git
HTH
Gl :slight_smile: PJ
I would hook it up and try it but I have No clue where the Sensor I have is… LOL
I look after breakfast.

Yes, these are the libraries I use!
It is unclear why the program is fixated on the sensors.begin() command;

It is necessary to overcome this somehow, otherwise the program is not executed

Have you tried this?
https://forum.seeedstudio.com/t/xiao-with-ds18b20-sensor/265458/8?u=pj_glasso

board package 1.0.0 from the Board Manager’s “Seeed nRF52 mbed-enabled Boards”

I would try the maximWire LIb…

Matsutei
Nov '22
I had the same problem. XIAO nRF52840 jammed every time I tried to use OneWire.h library.
Found today MaximWire that doesn’t need OneWire library. Got it via Library Manager
Example DiscoveryDevices.ino worked right a way.
MaximWire can also be found here in Github with examples: GitHub - adameat/MaximWire: MaximWire library for Arduino 33 BLE and DS18B20 sensor 5
Adding this line to other examples, they also started to work for me:
#define MAXIMWIRE_EXTERNAL_PULLUP
Without the line it looked like the bus pin stayd in input status, as it wasn’t able to pull the line down. Adding the line, the pin was able to drive the one wire bus.
Many thanks to ADAMEAT.

HTH
GL :slight_smile: PJ :v:

Hi !
Yes, I specified this example in my second post (variant № 2).
The string #define MAXIMWIRE_EXTERNAL_PULL UP is also present.
But that doesn’t work either (