I have found a possible bug in the OneWire library where some or all of the DS18B20 sensor would randomly give a reading of 85°C. I am using six sensors in parasitic power on a single pin. I am only allowing one sensor to do temperature conversion at a time.
After studying the datasheet and forums, I noticed that 85°C is the power up value. Also stated in the datasheet (which I did not notice for a long time) is that under parasite power, a reset pulse of more than ~1ms can cause a power on reset. So I had a look in the OneWire library, and noticed that interrupts are being enabled for the duration of the reset. I changed the ::reset function to disable interrupts for the 480us delay and gone are my 85°C measurements.
I must also add that my Arduino is working under quite a load (it is an Ethernet Arduino based swimming pool temperature controller with a heatpump, solar panels, 4 digit display, etc.)
I am not sure whether this can cause ill aftereffects, maybe the experts out there can comment.
uint8_t OneWire::reset(void)
{
IO_REG_TYPE mask = bitmask;
volatile IO_REG_TYPE *reg IO_REG_ASM = baseReg;
uint8_t r;
uint8_t retries = 125;
noInterrupts();
DIRECT_MODE_INPUT(reg, mask);
interrupts();
// wait until the wire is high... just in case
do {
if (--retries == 0) return 0;
delayMicroseconds(2);
} while ( !DIRECT_READ(reg, mask));
noInterrupts();
DIRECT_WRITE_LOW(reg, mask);
DIRECT_MODE_OUTPUT(reg, mask); // drive output low
//interrupts();
delayMicroseconds(480);
//noInterrupts();
DIRECT_MODE_INPUT(reg, mask); // allow it to float
delayMicroseconds(70);
r = !DIRECT_READ(reg, mask);
interrupts();
delayMicroseconds(410);
return r;
}