Maxim DS18B20 OneWire comman

I have a question about this commonly referenced snippet of Arduino code (below). Specifically, what does the ds.reset() return? I realize that this command must be issued before communication with a specific device on the bus, but in this code there is the line

present = ds.reset();

What is the purpose of the variable “present?” In my application the value appears to always be 1. Does anyone have an explanation of the details of this function, what it returns, etc?

Thank you!


I can’t find a description of this function. I understand ds.reset() resets the bus and prepares for communication, but what is this “1” it is returning?

#include <OneWire.h>

// DS18S20 Temperature chip i/o
OneWire ds(10); // on pin 10

void setup(void) {
// initialize inputs/outputs
// start serial port
Serial.begin(9600);
}

void loop(void) {
byte i;
byte present = 0;
byte data[12];
byte addr[8];

if ( !ds.search(addr)) {
Serial.print(“No more addresses.\n”);
ds.reset_search();
return;
}

Serial.print(“R=”);
for( i = 0; i < 8; i++) {
Serial.print(addr*, HEX);*

  • Serial.print(" ");*
  • }*
  • if ( OneWire::crc8( addr, 7) != addr[7]) {*
  • Serial.print(“CRC is not valid!\n”);*
  • return;*
  • }*
  • if ( addr[0] != 0x10) {*
  • Serial.print(“Device is not a DS18S20 family device.\n”);*
  • 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(“P=”);*
  • Serial.print(present,HEX);*
  • Serial.print(" ");*
  • for ( i = 0; i < 9; i++) { // we need 9 bytes*
    _ data = ds.read();_
    _ Serial.print(data*, HEX);
    Serial.print(" “);
    }
    Serial.print(” CRC=");
    Serial.print( OneWire::crc8( data, 8), HEX);
    Serial.println();
    }*_

the comments in the onewire library are quite useful :)

//
// Perform the onewire reset function.  We will wait up to 250uS for
// the bus to come high, if it doesn't then it is broken or shorted
// and we return a 0;
//
// Returns 1 if a device asserted a presence pulse, 0 otherwise.
//
uint8_t OneWire::reset() {
    uint8_t r;
    uint8_t retries = 125;

    // wait until the wire is high... just in case
    pinMode(pin,INPUT);
    do {
      if ( retries-- == 0) return 0;
      delayMicroseconds(2); 
    } while( !digitalRead( pin));
    
    digitalWrite(pin,0);   // pull low for 500uS
    pinMode(pin,OUTPUT);
    delayMicroseconds(500);
    pinMode(pin,INPUT);
    delayMicroseconds(65);
    r = !digitalRead(pin);
    delayMicroseconds(490);
    return r;
}

Thanks, Beige. Those comments do explain it. I will look at those comments in the future.