Saturday, August 17, 2019

How it works: DS18B20 and Arduino

by / Monday, 05 August 2013 / Published in Arduino

DS18B20There are many Arduinods18b20 sketches on the Web that provide sample code how to work with MAXIM’s (formerly DALLAS) DS18B20\DS18S20 digital temperature sensors. However, most of them do not describe the process in details. In this article, I’m going to show the gears that make the whole thing work.

As you should know, DS18x20 family members are relatively accurate digital temperature sensors. They use MAXIM’s 1-wire bus protocol, which requires only 1 wire for receiving and transmitting data (A ground line is also required). Moreover, DS18x20 support so-called parasite power mode, when they drain energy from data bus when it’s high – to charge sensor’s integrated capacitors that will be used as a power source. Sure, they also support normal power scheme, with external supply (and this scheme is used in this article).



You can have up to 127 devices on 1-Wire line. To use one of them, a master device initiates a reset pulse, and them receives presence pulse from slave devices. Then he searches ROMs (each produced device has a unique 64-bit ROM code, like serial number. Tiny first part of it defines a family of device, like 0x10 for DS18S20, 0x28 for DS18B20, 0x01 for iButton-DS1990A etc., and all remaining bits are a unique item number. Finally, master device selects the necessary slave device with MATCH ROM [55h] command. (Or transmits broadcast commands).

By the way: to us all data transfer on 1-wire bus seems to be organized in bytes. Since OneWire library for Arduino takes charge of all low-level operations, we just send and receive bytes.

All data and commands are transmitted least significant bit first over the 1-Wire bus.

To get a temperature measurement, we need to issue CONVERT [44h] command. When our sensors receive it, they will initiate data conversion process  - to produce 2 bytes with the measurement. This is relatively slow process, and it can take up to 750 milliseconds, so we have to wait for some time after issuing the command.

All that measurements are stored in a so-called scratchpad – a piece of sensor’s RAM. We can read it – to get the data, and we can also write to it – to set alarm thresholds, to specify sensor resolution (but it’s more advanced topic, and it will not be discussed in this article).


To read a scratchpad, we issue a READ SCRATCHPAD [BEh] command. After that, we should receive 9 bytes of data (see figure above).

Then we can get a temperature according to the following formulae:

Temp =  ((HighByte << 8) + LowByte ) *0.0625

temprg temp

A multiplier of 0.0625 is a conversion coefficient between sensor’s internal values and real temperature – according to 12-bit resolution, each “tick” on sensor’s scale stands for 0.0625 °C.

(do not forget that Temp should be float variable)

To sum up all above, let us write a function that stores the temperature in a global variable, and return true of false depending whether measurement was successful or not:

#define DS18S20_ID 0x10
 #define DS18B20_ID 0x28
 float temp;
 boolean getTemperature(){
 byte i;
 byte present = 0;
 byte data[12];
 byte addr[8];
 //find a device
 if (! {
 return false;
 if (OneWire::crc8( addr, 7) != addr[7]) {
 return false;
 if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID) {
 return false;
 // Start conversion
 ds.write(0x44, 1);
 // Wait some time...
 present = ds.reset();;
 // Issue Read scratchpad command
 // Receive 9 bytes
 for ( i = 0; i < 9; i++) {
 data[i] =;
 // Calculate temperature value
 temp = ( (data[1] << 8) + data[0] )*0.0625;
 return true;


If there are several sensors in the scheme, this function will give values from each of them in cycles.

Do not forget also to create OneWire object at the beginning of the program:

#include <OneWire.h>
OneWire ds(pin_number);

(And do not forget to download the library and put it to necessary folder)

And here is small circuit schematic for getting started with digital temperature sensors:

ds18b20 bb

Useful info:


Read 29727 times Last modified on Saturday, 21 March 2015 12:06

Do you like this? Please share!

Simon Tushev

Simon is IT professional with interests in web design, electronics, photography and astronomy. He writes about PHP, Yii, Joomla!, Arduino and several other topics.


Here I publish articles related to my areas of interest, my brief notes that may save some time to others, as well as some of my works.

This site is a work in progress. I will add more sections in the future, such as

  • More photos to photogallery
  • More Joomla!-related articles
  • ...



New Posts

Spam/Forgery Notice

If you've received a spam email from, please know that this emails are...

07-03-2019 in Blog


Using dynamic GeoIP module with nginx (CentOS)

nginx introduced dynamic module support in v. 1.9.11. This brief article provides step-by-step procedure...

13-04-2016 in Linux, BSD, Unix


Visual difference between pseudo and true random data

This is is "random" image generated using PHP rand() function: And this is an image...

20-11-2015 in Blog

Scroll to top

We use cookies, just to track visits to our website, we store no personal details Privacy policy