OneWire Example Code Question

Hi everyone,

I was trying to figure out how the DS18x20_Temperature example sketch in the OneWire library worked. How does this if statement work without any comparison and just a variable in the parenthesis: if (type_s)

Here is the example code from the IDE:

#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!
// http://milesburton.com/Dallas_Temperature_Control_Library

OneWire  ds(2);  // on pin 2 (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[12];
  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");
}

Thanks

Any variable or expression with a non-zero value is true.
Any variable or expression with a zero value is false.

Ah Ok!

So would it be equivalent to writing "if (type_s = 0)"?

Thanks :)

So would it be equivalent to writing "if (type_s = 0)"?

No, that's an assignment, aand because the value of the expression is always zero, it's always false, so the conditional action is never taken. Perhaps you meant

So would it be equivalent to writing "if (type_s != 0)"?

Many people (me included) have stumbled over the assignment vs compare version of that statement. If you use "if (x=1)", that will assign the value of 1 to x, if you write it as "if(x==1)" that will test to see if x has a value of 1 and return the result of that comparison. The big problem is that BOTH are valid C statements and will compile without error - they just don't do the same thing. One way around that trap door is to write it reversed -- "if(1=x)" (when you really meant (1==x)). The advantage to writing it reversed like that is that the compiler will catch you trying to assign the value of x to "1" and flag it as an error.

fghfghdfghtrdhdtrf: I was trying to figure out how the DS18x20_Temperature example sketch in the OneWire library worked.[/code]

Since you are specifically interested in using the DS18B20, you will soon find that that code is useless junk, so you might as well find out now. Even the people that wrote it have a vague admission to that effect, the only lines of value are

// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

and they are not even code, they are just comment.

You will get something of more help here;

http://www.hacktronics.com/Tutorials/arduino-1-wire-tutorial.html

There are other ways, the choice may be just personal, but anything is better than the junk in the IDE.