Raspberry Pi Pico · DS18B20

Raspberry Pi Pico DS18B20 Simulator: Wiring, Code and a Live Circuit

This is a DS18B20 digital temperature sensor wired to a Raspberry Pi Pico with its 4.7 k pull-up, read live with the OneWire and DallasTemperature libraries: one reading a second, to a hundredth of a degree.

Three legs and one resistor: VDD to 3V3(OUT), GND, and DQ to GP15 (physical pin 20) with the pull-up from DQ to 3V3(OUT). In the editor, drag the sensor’s temperature slider and the next reading follows.

  • 3.3 V logic
  • Library: DallasTemperature.h
  • DQ on GP15 (physical pin 20)
  • 4.7 k pull-up
Raspberry Pi Pico · DS18B20live0.000 s 0.00x
Click to open it in the editor
The circuit itself, running on the simulator with the sketch below. Press what can be pressed; click anything else to open it in the editor.

Wiring the DS18B20 to the Raspberry Pi Pico

Every connection in the circuit above, with the board’s own pin names.

DS18B20 pinRaspberry Pi Pico pinWhy
VDD (right leg)3V3(OUT)The DS18B20 runs from 3.0 to 5.5 V.
DQ (middle leg)GP15 (physical pin 20)The one data wire, shared by every sensor on the bus.
GND (left leg)GNDGround, with the flat face toward you.
4.7 k resistorDQ to 3V3(OUT)The pull-up the bus needs: the sensor only ever pulls the line low.

On the Raspberry Pi Pico the sensor and its pull-up go to 3V3, so the data line idles at 3.3 V. With a long cable, drop the pull-up to 2.2 k.

Pins to leave alone on the Raspberry Pi Pico

The numbers in the code are GP numbers, not the physical pin numbers printed beside the header: GP15 is pin 20. GP23 to GP25 are used on the board itself, and GP25 is the LED.

On a real bench

Solder headers on the Pico and press it into the breadboard across the center channel; the DS18B20 goes in beside it. GND pins sit every fifth pin down both sides (pins 3, 8, 13, 18 and so on), so there is always one close. The first upload needs BOOTSEL held while plugging in.

The code

The sketch the circuit above runs. Open it in the editor, change a line and press Run: it compiles in your browser.

DS18B20 on Raspberry Pi Pico GP15 (physical pin 20)
#include <OneWire.h>
#include <DallasTemperature.h>

const int ONE_WIRE_PIN = 15;   // DQ, GP15 (physical pin 20), with 4.7 k to 3V3(OUT)

OneWire oneWire(ONE_WIRE_PIN);
DallasTemperature sensors(&oneWire);

void setup() {
  Serial.begin(115200);
  sensors.begin();
  Serial.print("Sensors found: ");
  Serial.println(sensors.getDeviceCount());
}

void loop() {
  sensors.requestTemperatures();          // start a conversion on every sensor
  float celsius = sensors.getTempCByIndex(0);
  if (celsius == DEVICE_DISCONNECTED_C) {
    Serial.println("Sensor not found");
  } else {
    Serial.print("Temperature: ");
    Serial.print(celsius, 2);
    Serial.println(" C");
  }
  delay(1000);
}

OneWire oneWire(ONE_WIRE_PIN) runs the 1-Wire protocol on the pin, and DallasTemperature sensors(&oneWire) speaks to DS18B20s over it. sensors.begin() searches the bus, and getDeviceCount() says how many sensors answered.

requestTemperatures() starts a conversion on every sensor at once and waits for it: 750 ms at the default 12 bits. getTempCByIndex(0) then reads the first sensor found. DEVICE_DISCONNECTED_C, -127, means no sensor answered.

Each DS18B20 has a unique 64-bit address, so several can share this one pin. Serial.begin(115200) opens the serial monitor. Serial is the USB port at 115200 baud in this sketch; on a real Pico it appears once the board has enumerated.

Common mistakes with the DS18B20 on the Raspberry Pi Pico

No pull-up resistor

Without the 4.7 k from DQ to the supply, the line never goes high, sensors.begin() finds nothing and every reading is -127. In the simulator, delete the resistor and you get exactly that.

The sensor in backwards

With the flat side facing you, the legs are GND, DQ, VDD from left to right. Reversed, a real DS18B20 gets hot fast. Waterproof probes use red for VDD, black for GND and yellow or white for DQ.

Counting physical pins instead of GP numbers

The sketch says 15, which means GP15, and that is physical pin 20 on the header. Counting 15 pins down the side lands on a different GPIO, and the part never answers.

Questions and answers

Can I simulate a DS18B20 with a Raspberry Pi Pico?

Yes. The circuit at the top of this page is a Raspberry Pi Pico with a DS18B20, running in your browser on a simulated RP2040. The simulated sensor speaks real 1-Wire, timing and addresses included, so the libraries run unchanged. Press Run it in the editor to change the wiring or the code; it is free and needs no account.

Why do I get -127?

That is DEVICE_DISCONNECTED_C: no sensor answered. The pull-up is missing, DQ is on a different pin from the sketch, or the sensor is wired backwards.

Can I connect several DS18B20s to one pin?

Yes. Wire them all in parallel to GP15 (physical pin 20), with one pull-up for the bus, and read each with getTempCByIndex(0), (1) and so on, or by its address.

What is parasite power?

A mode where VDD is tied to GND and the sensor draws power from the data line through the pull-up. It saves a wire but needs a strong pull-up during conversions; three wires, as here, is more reliable.

Build your own DS18B20 project

Open this circuit in the editor, change the wiring or the code, and keep your version in a free account.