DS18B20 Sensor & 1-Wire

The w1-therm module will output the sensor readings to a file. For example,

4b 01 4b 46 7f ff 05 10 d8 : crc=d8 YES
4b 01 4b 46 7f ff 05 10 d8 t=20687

This file is derived from an area of the sensor’s memory called the “scratchpad”. The scratchpad is addressed using the following byte table.

Position Description
Byte 0 Temperature (least significant byte)
Byte 1 Temperature (most significant byte)
Byte 2 TH register on user byte 1 (alarm high)
Byte 3 TL register on user byte 2 (alarm low)
Byte 4 Configuration register
Byte 5 Reserved
Byte 6 Reserved
Byte 7 Reserved
Byte 8 CRC (e.g. d8 in the example above)

The file format has some additional information as it pulls out the result of the CRC check (YES/NO) and does the temperature calculation for you. If you’re interested, you can calculate the temperature from the bytes yourself by rearranging the first two bytes with least significant at the front;

01 4b

then treating it as a single hex value, divide by 16.

scala> 0x014b / 16.0
res: Double = 20.6875

This is how the tempreature-machine software goes about it.

Sensor Precision

Byte 4 of the scratchpad is a configuration byte, you can use it to set the conversion resolution; the number of decimal places the temperature will show as. The DS18B20 is supposed to be set at the most accurate (12 bit) at the factory but I’ve had units that were set to record temperatures at 0.5 °C steps (9 bit).

Byte 4 Hex Precision Example
1F 9 bit 23.5
3F 10 bit 23.45
5F 11 bit 23.445
7F 12 bit 23.4445

So if you see something like this in your scratchpad.

59 01 4b 01 1f ff 0c 10 39 : crc=39 YES
59 01 4b 01 1f ff 0c 10 39 t=23500

the 1f shows the sensor is set to 9 bit resolution.

If your sensor shipped with low resolution you can change it straight from the Pi using configDS18B20.c from Dan Perron.

$ curl https://raw.githubusercontent.com/danjperron/BitBangingDS18B20/master/configDS18B20.c -O
$ gcc -lrt -o configDS18B20 configDS18B20.c
$ sudo ./configDS18B20

It’ll output something like the following and prompt you to enter a new resolution.

GPIO 4
BCM GPIO BASE= 20000000
....78 01 4B 46 1F FF 0C 10 FA
09 bits  Temperature:  23.50 +/- 0.500000 Celsius
DS18B20 Resolution (9,10,11 or 12) ?12
Try to set 12 bits  config=7F

Now the scratchpad shows the updated value (7f below)

$ cat /sys/bus/w1/devices/28-0115910f5eff/w1_slave
75 01 4b 46 7f ff 7f 10 f5 : crc=f5 YES
75 01 4b 46 7f ff 7f 10 f5 t=23312