float readTemp() {
  byte data[12];
  byte addr[8];
  int16_t raw;
  
  if(!ds.search(addr)) {
    ds.reset_search();
    return -1000;
  }

  if(OneWire::crc8(addr, 7) != addr[7]) {
    return -1000;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);

  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);

  for(byte i = 0; i < 9; i++) {
    data[i] = ds.read();
  }

  ds.reset_search();
  
  raw = (data[1] << 8) | data[0];

  return (float)raw / 16;
}
