ESP32 with Multiple DS18B20 Temperature Sensors

This guide shows how to read temperature from multiple DS18B20 temperature sensors with the ESP32 using Arduino IDE. We’ll show you how to wire the sensors on the same data bus to the ESP32, install the needed libraries, and a sketch example you can use in your own projects. This tutorial is also compatible with the ESP8266 and the Arduino boards.

We have a getting started guide for the DS18B20 temperature sensor that you may find useful: Guide for DS18B20 Temperature Sensor with Arduino.

You might also like reading other DS18B20 guides:

Introducing the DS18B20 Temperature Sensor

The DS18B20 temperature sensor is a 1-wire digital temperature sensor. Each sensor has a unique 64-bit serial number, which means you can use many sensors on the same data bus (this means many sensors connected to the same GPIO). This is specially useful for data logging and temperature control projects. The DS18B20 is a great sensor because it is cheap, accurate and very easy to use.

The following figure shows the DS18B20 temperature.

Note: there’s also a waterproof version of the DS18B20 temperature sensor.

Here’s the main specifications of the DS18B20 temperature sensor:

  • Comunicates over 1-wire bus communication
  • Operating range temperature: -55ºC to 125ºC
  • Accuracy +/-0.5 ºC (between the range -10ºC to 85ºC)

From left to right: the first pin is GND, the second is data, and the rightmost pin is VCC.

Where to Buy the DS18B20 Temperature Sensor?

Check the links below to compare the DS18B20 temperature sensor price on different stores:

Wiring Multiple DS18B20 Sensors

Here’s a list of the parts you need to follow this example:

You can use the preceding links or go directly to MakerAdvisor.com/tools to find all the parts for your projects at the best price!

When wiring the DS18B20 temperature sensor you need to add a 4.7k Ohm resistor between VCC and the data line. The following schematic shows an example for three sensors (you can add more sensors if needed).

In the previous schematic, the round side of the sensor is facing backwards. The flat part is facing forward.

Preparing the Arduino IDE

There’s an add-on for the Arduino IDE that allows you to program the ESP32 using the Arduino IDE and its programming language. Follow one of the next tutorials to prepare your Arduino IDE to work with the ESP32, if you haven’t already.

Installing Libraries

Before uploading the code, you need to install two libraries in your Arduino IDE. The OneWire library by Paul Stoffregen and the Dallas Temperature library. Follow the next steps to install those libraries.

OneWire library

  1. Click here to download the OneWire library. You should have a .zip folder in your Downloads
  2. Unzip the .zip folder and you should get OneWire-master folder
  3. Rename your folder from OneWire-master to OneWire
  4. Move the OneWire folder to your Arduino IDE installation libraries folder
  5. Finally, re-open your Arduino IDE

Dallas Temperature library

  1. Click here to download the DallasTemperature library. You should have a .zip folder in your Downloads
  2. Unzip the .zip folder and you should get Arduino-Temperature-Control-Library-master folder
  3. Rename your folder from Arduino-Temperature-Control-Library-master to DallasTemperature
  4. Move the DallasTemperaturefolder to your Arduino IDE installation libraries folder
  5. Finally, re-open your Arduino IDE

Getting the DS18B20 Sensor Address

Each DS18B20 temperature sensor has a serial number assigned to it. First, you need to find that number to label each sensor accordingly. You need to do this, so that later you know from which sensor you’re reading the temperature from.

Upload the following code to the ESP32. Make sure you have the right board and COM port selected.

/*
 * Rui Santos 
 * Complete Project Details https://randomnerdtutorials.com
 */

#include <OneWire.h>

// Based on the OneWire library example

OneWire ds(15);  //data wire connected to GPIO15

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte addr[8];
  
  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);
  }
}

View raw code

Wire just one sensor at a time to find its address (or successively add a new sensor) so that you’re able to identify each one by its address. Then, you can add a physical label to each sensor. Open the Serial Monitor at a baud rate of 9600 and you should get something as follows (but with different addresses):

Untick the “Autoscroll” option so that you’re able to copy the addresses. In our case we’ve got the following addresses:

  • Sensor 1: 28 FF 77 62 40 17 4 31
  • Sensor 2: 28 FF B4 6 33 17 3 4B
  • Sensor 3: 28 FF A0 11 33 17 3 96

Getting Temperature From Multiple Sensors

Getting the temperature from multiple sensors on the same common data bus is very straightforward.

The example code below reads temperature in Celsius and Fahrenheit from each sensor and prints the results in the Serial Monitor.

/*
 * Rui Santos 
 * Complete Project Details https://randomnerdtutorials.com
 */

// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is connected to GPIO15
#define ONE_WIRE_BUS 15
// Setup a oneWire instance to communicate with a OneWire device
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);

DeviceAddress sensor1 = { 0x28, 0xFF, 0x77, 0x62, 0x40, 0x17, 0x4, 0x31 };
DeviceAddress sensor2 = { 0x28, 0xFF, 0xB4, 0x6, 0x33, 0x17, 0x3, 0x4B };
DeviceAddress sensor3= { 0x28, 0xFF, 0xA0, 0x11, 0x33, 0x17, 0x3, 0x96 };

void setup(void){
  Serial.begin(115200);
  sensors.begin();
}

void loop(void){ 
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  
  Serial.print("Sensor 1(*C): ");
  Serial.print(sensors.getTempC(sensor1)); 
  Serial.print(" Sensor 1(*F): ");
  Serial.println(sensors.getTempF(sensor1)); 
 
  Serial.print("Sensor 2(*C): ");
  Serial.print(sensors.getTempC(sensor2)); 
  Serial.print(" Sensor 2(*F): ");
  Serial.println(sensors.getTempF(sensor2)); 
  
  Serial.print("Sensor 3(*C): ");
  Serial.print(sensors.getTempC(sensor3)); 
  Serial.print(" Sensor 3(*F): ");
  Serial.println(sensors.getTempF(sensor3)); 
  
  delay(2000);
}

View raw code

Open the Serial Monitor at a baud rate of 115200 and you should get something similar.

How the Code Works

First, include the needed libraries:

#include <OneWire.h>
#include <DallasTemperature.h>

Create the instances needed for the temperature sensor. The temperature sensor is connected to GPIO 15.

// Data wire is connected to ESP32 GPIO15
#define ONE_WIRE_BUS 15
// Setup a oneWire instance to communicate with a OneWire device
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);

Start the Dallas temperature library for the DS18B20 sensor.

sensors.begin();

Then, enter the addresses you’ve found previously for each temperature sensor. In our case, we have the following:

DeviceAddress sensor1 = { 0x28, 0xFF, 0x77, 0x62, 0x40, 0x17, 0x4, 0x31 };
DeviceAddress sensor2 = { 0x28, 0xFF, 0xB4, 0x6, 0x33, 0x17, 0x3, 0x4B };
DeviceAddress sensor3= { 0x28, 0xFF, 0xA0, 0x11, 0x33, 0x17, 0x3, 0x96 };

In the setup(), initialize a Serial communication and start the Dallas temperature library for the DS18B20 sensor.

void setup(void){
  Serial.begin(115200);
  sensors.begin();
}

In the loop(), request the temperatures both in Celsius and Fahrenheit and print the results on the Serial Monitor.

First, you need to request the temperatures using the following line of code:

sensors.requestTemperatures(); // Send the command to get temperatures

Then, you can request the temperature by using the sensors address:

  • sensors.getTempC(SENSOR_ADDRESS) – requests the temperature in Celsius
  • sensors.getTempF(SENSOR_ADDRESS) – requests the temperature in Fahrenheit

For example, to request temperature in Celsius for sensor 1, you use:

sensors.getTempC(sensor1)

In which sensor1 is a variable that holds the address of the first sensor.

This is just a simple sketch example to show you how to get temperature from multiple DS18B20 sensors using the ESP32. This code is also compatible with the ESP8266 and Arduino boards.

Taking It Further

Getting temperature from multiple DS18B20 temperature sensors is specially useful in monitoring and temperature control projects and data logging. Learn how to log the collected data to a microSD card:

You can also publish your readings via MQTT to Node-RED and display your data in charts. We have a tutorial about that subject in the link below:

We hope you’ve found this tutorial useful. If you like ESP32 and you want to learn more, we recommend enrolling in Learn ESP32 with Arduino IDE course.

Thanks for reading.


Learn how to program and build projects with the ESP32 and ESP8266 using MicroPython firmware DOWNLOAD »

Learn how to program and build projects with the ESP32 and ESP8266 using MicroPython firmware DOWNLOAD »


Enjoyed this project? Stay updated by subscribing our weekly newsletter!

29 thoughts on “ESP32 with Multiple DS18B20 Temperature Sensors”

  1. Rui,this can better,see examples DallasTemperature sketch Multiple,there is no need to look for the adresses of the sensors.

    • Yes. You are right, you can use that sketch to automatically get the temperature from all the devices.
      But if you have a lot of devices it can be difficult to know which temperature reading corresponds to which sensor.
      Thank you for you comment.
      Regards,
      Sara 🙂

  2. Rui,
    Excellent project, very useful for home automation projects, the only is missing is to add a very cheap transmitter (maybe in 445MHz band) to connect remote sensors if that may be possible. The biggest problem is that the sensors location are different locations and to use one wire to connect the sensors is not always convenient. maybe next project will tackle that IoT home application

    • Hi Ion.
      We don’t have any tutorial like that at the moment.
      As a suggestion, you can use several ESP8266 or ESP32 (each one with different DS18B20 temperature sensors) to send the sensors readings to Node-RED using MQTT. To help you do this, you can take a look at the following tutorial:
      What is MQTT and How it Works?
      (This only works if you have Wi-Fi coverage)
      I hope this helps.
      Thank you for your comment,
      Regards,
      Sara

  3. Great tutorial. I am looking to monitor multiple freezers and this should work well. However, how long can I cable the temp sensors from the ESP? Could I do the same with an Arduino? Also what would be the best way to send an alert if the temp rises above a preset temp?

  4. Hi Rui Santos,
    many, many thanks for your excellent tutorials. These are the best one can find in the internet !! and they solved many problems I had bofore reading !!
    Greetings and thanks also to Sara Santos,
    W. Reitmayr

  5. Thank you for this nice tutorial. I am right now working on a project with several sensors and some questions came up that was all addressed here! Great timing 😉
    I have a question regarding IO pins, is it possible to use any GPIO pin for the 1w sensor? I have an ESP-07 (generic) and I got it to work with GPIO 12 and 15 but not with 4 or 5 .

    • Yes, you are right. Thank you for the suggestion!
      Also, thank you for mentioning our tutorials in your website.
      Regards,
      Sara 🙂

  6. What is maximum (data) cable length for this sensors?
    I wanted to put one sensor outside and one indoor so if outside temp is lower, servo will open one window lever and fan will blow fresh air in.

  7. Hi Rui/Sara, thanks for the explanation. Is it true that you won’t have to connect the Vcc pin ?
    As far as I understand the specs it seems that the sensor would pick the needed power from the dataline (it is called parasite power).
    Second question: is the sensor used with the (default) highest resolution ? I tested the program and I got very precisely 2 decimals in the displayed result.

    • Hi Hans.
      Yes, you can use the sensor in parasite mode. It get derives the power from the dataline.
      You can set the sensor resolution in the code, by using: sensors.setResolution(SENSOR, RESOLUTION)
      Accordingly to the datasheet, it provides a maximum of 12-bit resolution: datasheets.maximintegrated.com/en/ds/DS18B20.pdf
      Regards,
      Sara 🙂

  8. Excelente tutorial, quisiera saber si este mismo metodo me serviria para otros sensores como de humedad o efecto hall, o son exclusivos del sensor de temperatura

  9. Hi,

    When i put this project together it would not give me anything at all.
    I spent hours and hours checking my wiring, re-checking the code, reloading my ESP32 drivers etc.

    In the end i found it was the Baud Rate of the Serial Monitor.
    You said:
    “Open the Serial Monitor at a baud rate of 115200 and…”
    but when i changed the Baud Rate to 9600 baud, it all started to work.

    In your code you have a line which says “Serial.begin(9600)”.
    Doesn’t this suggest that the Serial Monitor should be set to 9600 not 115200 as the text says?

    When i changed your code in the sketch to say “Serial.begin(115200)”
    I found that the Serial Monitor window only showed output when it was set to 115200.

    I am only a beginner, but i would say that the two things are definitely connected?

    Frustrated
    Chris

    • Hi Chris.
      I’m so sorry for that trouble.
      It was my fault while writing the post.
      When you set the Serial.begin(9600) in the code, you need to open the serial monitor at 9600 baud rate.
      When you set Serial.being(115200) in the code, you need to open the serial monitor at a baud rate of 115200.
      The first code is set to 9600 because we’re using an example from the OneWire library, but you can set other baud rate in the code.
      The second code uses 115200.
      I’m so sorry for the typo. It is fixed now.
      Regards,
      Sara

Leave a Reply to Pär Cancel reply

Download our Free eBooks and Resources

Get instant access to our FREE eBooks, Resources, and Exclusive Electronics Projects by entering your email address below.