This guide shows how to read temperature and humidity from the DHT11 or DHT22 sensors using the Raspberry Pi Pico board with Arduino IDE.
Do you want to program using MicroPython instead? Check the following tutorial: Raspberry Pi Pico: DHT11/DHT22 Temperature and Humidity Sensor (MicroPython).
Table of Contents
- Prerequisites
- Introducing the DHT11 and DHT22 Sensors
- Wiring the DHT Sensor to the Raspberry Pi Pico
- Raspberry Pi Pico Getting Temperature and Humidity from DHT Sensor
Prerequisites
You need to install the Raspberry Pi Pico boards on Arduino IDE and you must know how to upload code to the board. Check out the following tutorial first if you haven’t already:
Introducing the DHT11 and DHT22 Sensors
The DHT11 and DHT22 sensors are used to measure temperature and relative humidity. These are very popular among makers and electronics hobbyists.
These sensors contain a chip that does analog to digital conversion and spit out a digital signal with the temperature and humidity. This makes them very easy to use with any microcontroller.
DHT11 vs DHT22
The DHT11 and DHT22 are very similar but differ in their specifications. The following table compares some of the most important specifications of the DHT11 and DHT22 temperature and humidity sensors. For a more in-depth analysis of these sensors, please check the sensors’ datasheet.
Temperature range | 0 to 50 ºC +/-2 ºC | -40 to 80 ºC +/-0.5ºC |
Humidity range | 20 to 90% +/-5% | 0 to 100% +/-2% |
Resolution | Humidity: 1% Temperature: 1ºC | Humidity: 0.1% Temperature: 0.1ºC |
Operating voltage | 3 – 5.5 V DC | 3 – 6 V DC |
Current supply | 0.5 – 2.5 mA | 1 – 1.5 mA |
Sampling period | 1 second | 2 seconds |
Price | $1 to $5 | $4 to $10 |
Where to buy | Check prices | Check prices |
The DHT22 sensor has a better resolution and a wider temperature and humidity measurement range. However, it is a bit more expensive, and you can only request readings with 2 seconds interval.
The DHT11 has a smaller range and it’s less accurate. However, you can request sensor readings every second. It’s also a bit cheaper.
Despite their differences, they work in a similar way, and you can use the same code to read temperature and humidity. You just need to select in the code the sensor type you’re using.
DHT Pinout
DHT sensors have four pins as shown in the following figure. However, if you get your DHT sensor in a breakout board, it comes with only three pins and with an internal pull-up resistor on pin 2.
The following table shows the DHT22 and DHT11 pinout. When the sensor is facing you, pin numbering starts at 1 from left to right
DHT pin | Connect to |
1 | 3.3V |
2 | Any digital GPIO; also connect a 4.7k Ohm pull-up resistor |
3 | Don’t connect |
4 | GND |
DHT Sensor Breakout Board
If you got a DHT11 or DHT22 sensor on a breakout board, they only come with three pins and have an internal pull-up resistor on the data pin.
In this case, wiring is even simpler and you don’t need to wire an external resistor. The DHT breakout boards usually have labels on the pins: GND, VCC, and DATA.
DHT pin | Connect to |
GND | GND |
VCC | 3V3(OUT) |
DAT | GPIO 22 (or any other digital pin) |
Parts Required
Here’s a list of parts you need to build the circuit (if you don’t have a DHT breakout board, you need a 4.7kOhm resistor):
- Raspberry Pi Pico
- DHT11 or DHT22 temperature and humidity sensor
- 4.7k Ohm resistor or similar value (not needed if you have a DHT breakout board)
- Breadboard
- Jumper wires
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!
Wiring the DHT11/DHT22 to the Raspberry Pi Pico
Wire the DHT22 or DHT11 sensor to the Raspberry Pi Pico as shown in the following schematic diagram. If you have a DHT breakout board, ignore the resistor.
In this example, we’re connecting the DHT data pin to GPIO 22. However, you can use any other suitable digital pin.
You might also like reading: Raspberry Pi Pico and Pico W Pinout Guide: GPIOs Explained.
Installing Libraries
To read from the DHT sensor, we’ll use the DHT library from Adafruit. To use this library you also need to install the Adafruit Unified Sensor library. Follow the next steps to install those libraries.
Open your Arduino IDE and go to Sketch > Include Library > Manage Libraries. The Library Manager should open.
Search for “DHT” in the Search box and install the DHT library from Adafruit.
It will prompt a message to also install the “Adafruit Unified Sensor” library. Install that library. If you don’t get that message, install the library manually. Type “Adafruit Unified Sensor” in the search box. Scroll all the way down to find the library and install it.
After installing the libraries, restart your Arduino IDE.
Raspberry Pi Pico with DHT Sensor – Code
Open a new file in the Arduino IDE and copy the following code.
/*********
Rui Santos
Complete project details at https://RandomNerdTutorials.com/raspberry-pi-pico-dht11-dht22-arduino/
Example testing sketch for various DHT humidity/temperature sensors - Adapted from the Adafruit DHT examples written by ladyada
REQUIRES the following Arduino libraries:
- DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
- Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor
*********/
#include "DHT.h"
#define DHTPIN 22 // Digital pin connected to the DHT sensor
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
Serial.print("Testing DHT sensor");
dht.begin();
}
void loop() {
// Wait a few seconds between measurements.
delay(2000);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(f);
Serial.print(F("°F Heat index: "));
Serial.print(hic);
Serial.print(F("°C "));
Serial.print(hif);
Serial.println(F("°F"));
}
Continue reading to learn how the code works, or skip to the Demonstration section.
How the Code Works
First, you need to import the DHT library:
#include "DHT.h"
Then, define the digital pin that the DHT sensor data pin is connected to. In this case, it’s connected to GPIO 22.
#define DHTPIN 22 // Digital pin connected to the DHT sensor
Then, you need to select the DHT sensor type you’re using. The library supports DHT11, DHT22, and DHT21. Uncomment the sensor type you’re using and comment all the others. In this case, we’re using the DHT22 sensor.
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
Create a DHT object called dht on the pin and with the sensor type you specified previously.
DHT dht(DHTPIN, DHTTYPE);
In the setup(), initialize the Serial debugging at a baud rate of 115200, and print a message in the Serial Monitor.
Serial.begin(115200);
Serial.println(F("DHTxx test!"));
Finally, initialize the DHT sensor.
dht.begin();
The loop() starts with a 2000 ms (2 seconds) delay, because the DHT22 maximum sampling period is 2 seconds. So, we can only get readings every two seconds.
delay(2000);
The temperature and humidity are returned in float format. We create float variables h, t, and f to save the humidity, temperature in Celsius, and temperature in Fahrenheit, respectively.
Getting the humidity and temperature is as easy as using the readHumidity() and readTemperature() methods on the dht object, as shown below:
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
If you want to get the temperature in Fahrenheit degrees, you need to pass the true parameter as an argument to the readTemperature() method.
float f = dht.readTemperature(true);
There’s also an if statement that checks if the sensor returned valid temperature and humidity readings.
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
After getting the humidity and temperature, the library has a method that computes the heat index. You can get the heat index both in Celsius and Fahrenheit as shown below:
// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahrenheit = false)
float hic = dht.computeHeatIndex(t, h, false);
Finally, print all the readings on the Serial Monitor with the following commands:
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(f);
Serial.print(F("°F Heat index: "));
Serial.print(hic);
Serial.print(F("°C "));
Serial.print(hif);
Serial.println(F("°F"));
Uploading the Code to the Raspberry Pi Pico
For you to be able to upload code to the Raspberry Pi Pico, it needs to be in bootloader mode.
If the Raspberry Pi is currently running MicroPython firmware, you need to manually put it into bootloader mode. For that, connect the Raspberry Pi Pico to your computer while holding the BOOTSEL button at the same time.
For future uploads using Arduino IDE, the board should go automatically into bootloader mode without the need to press the BOOTSEL button.
Now, select your COM port in Tools > Port. It may be the case that the COM port is grayed out. If that’s the case, don’t worry it will automatically find the port once you hit the upload button.
Upload the code.
You should get a success message.
Demonstration
Open the Serial Monitor at a baud rate of 115200. You should get new temperature and humidity readings as well as the heat index every two seconds.
Troubleshooting
If your DHT sensor fails to get the readings, read our DHT Troubleshooting Guide to help you fix the issue.
Wrapping Up
In this tutorial, you learned how to interface the DHT11 and DHT22 temperature sensors with the Raspberry Pi Pico and how to get temperature and humidity readings using Arduino IDE.
We’ve shown you how to use the Adafruit DHT library to get temperature, humidity, and heat index readings—you just need to use the readTemperature(), readHumidity(), and computeHeatIndex() on a DHT object.
We have other Raspberry Pi Pico basic tutorials that you might like reading:
- Raspberry Pi Pico and Pico W Pinout Guide: GPIOs Explained
- Raspberry Pi Pico: Control Digital Outputs and Read Digital Inputs (Arduino IDE)
- Raspberry Pi Pico: Fading an LED using PWM (Arduino IDE)
- Raspberry Pi Pico: Read Analog Inputs (Arduino IDE)
Check out all our Raspberry Pi Pico Guides »
Thanks for reading.
Thank you for an excellent guide to using this device and the Arduino IDE – for me its easietr than micro python.