1-wire / DS18B20 sketch error

Hi,
I'm attempting to use a DS18B20 temperature sensor Waterproof 1-Wire DS18B20 Digital temperature sensor : ID 381 : $9.95 : Adafruit Industries, Unique & fun DIY electronics and kits on an Nano rp2040 Connect. As a test - Blink uploads and runs OK, on COM3.

After uploading the Arduino -> Examples -> OneWire -> DS18x20_Temperature sketch, I get serial monitor error message: Board at COM3 is not available. The ANC green light is on and the orange light continuously blinks 3 times (~1 second each) and then 4 fast blinks (~twice as fast).

I have to reset the board jumping REC& GND together in orders to get coms back to the ANC. Can then run blink again, but not the 1 wire sketch.

Arduino Mbed OS Nano Boards ver 3.2.0 is installed. ... Nano RP2040 Connect is the selected board.

DS18B20 wiring:
Red connects to 3V3 pin
Blue connects to GND pin
Yellow connects to pin D10
~4.7K resistor connected between red and yellow leads.

Sketch used:

#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");
}

Your code is unlikely to be the problem, but the above is the only useful bit in it and it is only a comment not a command. I urge you to take the hint, as the rest is antiquated junk. You will find the associated library useful.

It is common practice to run the sensor on 5v. The 4.7k pullup might not be appropriate for 3.3v.

I have never heard of an ANC, but things sound like an installation problem.

This error message occurs when you select a wrong COM port. At first, please check from your device manager in which COM port your arduino has been detected. Then come back to the Arduino IDE. Select the same COM port from the 'Tools' option.

As stated by Nick_Pyner you need to change the 4.7K to something in the 3.1K range. This will not fix your windows problem in finding the port.

In order to restore comms from computer to board, I must reset the board via the on-board reset button (In the IDE, "Port" is greyed out at this point and Ports does not show in Device Manager). I can then I upload and run blink. COM3 is the port that automatically appears in Device Manager once the upload is complete. I don't have to select or specify anything. After blink is running, I'm unable to upload the 1 wire sketch - message: "Board at COM3 is not available", and the LED flash sequence

starts again. In Device Manager, Ports section & COM3 disappear.

When I reset the board via the button, and upload the 1 wire sketch I get the same LED flash sequence, no ports show in device Manager, and Serial Monitor error "Board at COM3 is not available".

I've changed it to a resistance of 3.18K (2 in series). Thanks for giving me a value to shoot for. Don't think I'll know its affect until the comms wrinkle is sorted.

People says that OneWire library is reported as working unstable at Nano Every and Nano iot 33 boards. Perhaps the Rp2040 is the case too?

Right value but not in series. One end should go to VCC (red) the other end to the data line (yellow). The probe data connects directly to the port pin as does the pull up resistor.

Got it. Is wired as you state. What I meant was that I had to put two resistors in series (ones I had on hand) to get the desired 3.1K resistance. Thanks.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.