Raspberry Pi Humidity Sensor using the DHT22

In this Raspberry Pi humidity sensor tutorial, we will show you how to connect the DHT22 sensor to the Raspberry Pi and how you can use Python to read data from the sensor.

Raspberry Pi Humidity Sensor

The DHT22 is a versatile and low-cost humidity sensor that can also calculate the temperature of an area.

This sensor has a relatively long transmission distance, allowing the sensor to transmit data through wires up to 20m away from the Raspberry Pi.

As a bonus, the DHT22 is a digital sensor with an inbuilt analog to digital converter. The converter makes it a lot easier to connect the sensor to the Raspberry Pi as you do not need to deal with any additional chips.

The biggest downside to the DHT11 and DHT22 sensors is that they are quite slow sensors. They have a sampling rate of once every second for the DHT11 and once every 2 seconds for the DHT22.

You can also use the DHT22 with the Arduino, so be sure to check that tutorial if you would rather use an Arduino board.

While this tutorial covers connecting the DHT22 to the Raspberry Pi, it will also work with the DHT11 and AM2302 humidity sensors as they all use the same pinouts.

Equipment

Below is all the equipment that you will need for connect the DHT22 Humidity Sensor to your Raspberry Pi.

Recommended

Optional

Video

The video below will take you through the steps to assembling the humidity circuit and how to connect it to your Raspberry Pi. It also covers the steps on how to write a simple Python script to talk with the DHT22 sensor.

If you prefer a written tutorial. then you can find that right underneath the video.

Adblock removing the video? Subscribe to premium for no-ads.

Raspberry Pi Humidity Sensor Hardware Setup

In this section of the tutorial, we will show you the process on how to connect your DHT22 humidity sensor to the Raspberry Pi.

Thanks to the DHT22 being a digital sensor, it is incredibly straightforward to connect to the Raspberry Pi. The single data pin is able to connect directly to the Raspberry Pi’s GPIO pins.

You can follow our guide below to see how to connect the DHT22 to your Raspberry Pi.

DHT22 Pinout

To make things easier when assembling the humidity sensor circuit we have included the pinout of the DHT22 sensor.

This diagram should help you work out where each pin needs to go on the Raspberry Pi.

  • Pin 1 is VCC (Power Supply)
  • Pin 2 is DATA (The data signal)
  • Pin 3 is NULL (Do not connect)
  • Pin 4 is GND (Ground)
DHT22 Temperature Sensor with numbering

Raspberry Pi DHT22 Circuit

Here we have included a couple of ways you can put the Raspberry Pi Humidity sensor circuit together.

You can either rely on our two diagrams below to see what pins need to go to what or use our written steps below.

  • Place a 10k resistor between Pin 1 and Pin 2 of the DHT22
  • Wire Pin 1 of the DHT22 to Physical Pin 1 (3v3) on the Pi
  • Wire Pin 2 of the DHT22 to Physical Pin 7 (GPIO4) on the Pi
  • Wire Pin 4 of the DHT22 to Physical Pin 6 (GND) on the Pi
Raspberry Pi Humidity Sensor DHT22 Wiring Schematic
Raspberry Pi Humidity Sensor DHT22 GPIO Pins

Preparing the Raspberry Pi to talk with the Humidity Sensor

In this section we will be preparing your Raspberry Pi to talk with the DHT22 humidity sensor.

Mainly we need to install Python 3 to the Pi and also set up a Python Virtual Environment.

Setting up your Raspberry Pi

1. Before we get started with programming a script for the Raspberry Pi humidity sensor, we must first ensure that we have the latest updates on our Raspberry Pi.

We can do this by running the following two commands to update both the package list and installed packages.

sudo apt update
sudo apt upgrade

2. With our package list now up to date, we need to go ahead and install both python 3 and pip. We will be using both of these packages to interact with our humidity sensor.

Install both “python3-dev” and “python3-pip” by running the command below.

sudo apt install python3-dev python3-pip

Setting up a Python Virtual Environment for the DHT22 Humidity Sensor

3. Our first step is to create a directory where we will store the Python virtual environment for the DHT22 humidity sensor.

You can create a directory called “dht22” in your users home directory by running the following command.

mkdir ~/dht22

4. After creating the directory, you must now change to it by using the cd command.

cd ~/dht22

5. We now need to use Python to generate the virtual environment. All of the libraries that we will be using will be installed to this environment.

Generate the Python virtual environment by typing in the following command.

python3 -m venv env

6. Once the virtual environment has been generated, we will need to tell the terminal to utilize it as its source.

You will need to run this command every time you want to interact with your DHT22 humidity sensor script. The reason for this is the Python library we are using will be installed only to this environment.

source env/bin/activate

7. Now using pip, we will go ahead and install Adafruit’s DHT library to the Raspberry Pi.

We will be using this Python library to interact with our DHT22 Humidity/Temperature sensor.

As a bonus, the library also supports the DHT11 and AM2302 humidity/temperature sensors making it a great library to learn how to utilize.

Run the following command to install the DHT library to your Raspberry Pi.

python3 -m pip install adafruit-circuitpython-dht

Programming for the Raspberry Pi humidity sensor

1. Now that we have installed the Adafruit DHT library to our Raspberry Pi we can now proceed to program with it.

First, we must make a Python script in which we will store all our code. To begin writing this file, you can enter the following command into your Raspberry Pi.

nano ~/dht22/humidity.py

2. Within this file, we need to enter the following lines of code. We will explain each section of the code as we go along.

a. The first library we will be importing in this script allows us to sleep the script between readings. This stops the script from constantly reading from the sensor when it doesn’t need to.

import time

b. This line imports the “Adafruit_DHT” library that we obtained using pip in the previous section.

We will be using this library to talk and interact with the DHT22 sensor. The library allows us to very easily retrieve the temperature and humidity from the sensor with a few lines of python code.

import adafruit_dht

c. The Adafruit DHT22 Library also required us to import the “board” library.

This library is used internally by Adafruit for selecting the pins your humidity sensor is attached to.

import board

d. Our next step is to create our “dht_device” variable that points to Adafruit DHT22 library. Into this function call we pass in the pin our DHT22 sensor is connected to on our Raspberry Pi.

We use this object to get the current temperature and humidity from the sensor.

Since we are using the GPIO4 pin we need to use the “D4” option from the board library.

dht_device = adafruit_dht.DHT22(board.D4)

e. Since we want our Python script to constantly get readings from the humidity sensor we will need to start an infinite loop. This loop makes the script continually run until you terminate it.

All code that is within this loop must be indented.

while True:

f. One problem with the DHT22 library is that it can commonly throw errors. This isn’t necesserally a problem with the DHT22 library or your Raspberry Pi but more with how the sensor itself works.

To prevent an error from stopping the script we must run our code within a “try” block.

Indent the code by another four spaces after this block.

    try:

g. Finally within our try block we can finally get our first temperature value from our sensor. Reading a value from the sensor is simple as grabbing the “temperature” value from the “dht_device” object.

Since the DHT22 reports temperature in Celsius we will store the value in a variable called “temperature_c“.

        temperature_c = dht_device.temperature

h. While the DHT22 humidity sensor might not give us the value in Fahrenheit, luckily it is very easy to convert the value.

The following line of code converts our Celsius temperature to Fahrenheit and stores it in a variable called “temperature_f“.

        temperature_f = temperature_c * (9 / 5) + 32

i. Luckily, the humidity reading is super simple and is returned as a percentage that we store within the “humidity” variable.

        humidity = dht_device.humidity

j. Finally, once we have gotten the temperature and humidity values from our DHT22 sensor we can print the to the terminal by making use of the “print()” function.

        print("Temp:{:.1f} C / {:.1f} C    Humidity: {}%".format(temperature_c, temperature_f, humidity)

k. Now that we are finished with our try block we must end it with the following block of code.

This code catches any errors that might be caused by the DHT22 library on our Raspberry Pi and prints the error to the terminal. By catching the error the script will continue to run.

    except RuntimeError as error:
        print(err.args[0])

l. Finally, we end every loop by running a short 2 second sleep of the script. This gives us time between recordings and reduces the chance of running into errors.

    time.sleep(2.0)

3. Once you have finished entering the code, it should look like what we have displayed below.

import time
import adafruit_dht
import board

dht_device = adafruit_dht.DHT22(board.D4)

while True:
    try:
        temperature_c = dht_device.temperature
        temperature_f = temperature_c * (9 / 5) + 32

        humidity = dht_device.humidity

        print("Temp:{:.1f} C / {:.1f} F    Humidity: {}%".format(temperature_c, temperature_f, humidity))
    except RuntimeError as err:
        print(err.args[0])

    time.sleep(2.0)

4. When you are happy that all the code you entered is correct you can then save the file by pressing CTRL + X, then Y followed by ENTER.

5. With the script now saved, let’s go ahead and run it so that we can start to see the data from the humidity sensor.

You can run this script by running the following command.

python3 ~/dht22/humidity.py

6. From this command, you should start seeing results like what we have below. The temperature and the humidity should be displayed through the command line.

Temp:24.0 C / 75.2 F    Humidity: 47%
Temp:24.0 C / 75.2 F    Humidity: 48%
Temp:24.0 C / 75.2 F    Humidity: 49%
Temp:24.0 C / 75.2 F    Humidity: 52%

7. In the next section of the tutorial, we will show you how you can modify this script so that it logs the data to a file. The file will be able to be read by a program such as Microsoft Excel or Google Spreadsheets.

Logging the Data from the Raspberry Pi Humidity Sensor

1. Let’s start by creating a new script. This script will be somewhat similar to our previous script but with a few changes made so that we can write to a file.

Start by running the following command to begin writing our new script.

nano ~/dht22/humidity_logger.py

2. Within this file enter the following lines. We will only be explaining the new additions to the script in this section.

a. Here we add the import for both the “os” and “time” libraries. We utilize the “os” library so we can check if our CSV file exists before we try to write to it.

We use the “time” library so that we can timestamp each new row with the current date and time.

import os
import time
import adafruit_dht
import board

b. There is no difference with this line, keep it as you had in the previous script.

dht_device = adafruit_dht.DHT22(board.D4)

c. Here we wrap everything within a try statement to handle any potential errors.

We open up a handle to our “/home/pi/humidity.csv” file with the “a+” tag applied. The a+ tag means that any data written to the file will be appended to the end of it.

Next, we use the “os” library to see if we have ever written to this file before. If the size returns as 0 we then write an initial line to the file. This line will contain our column headers so you can understand the data easier.

try:
    f = open('/home/pi/humidity.csv', 'a+')
    if os.stat('/home/pi/humidity.csv').st_size == 0:
            f.write('Date,Time,Temperature C, Temperature F,Humidity\r\n')
except:
    pass

d. Here we have our while loop again. We utilize the DHT Library to read data from our DHT22 humidity sensor again.

This function will store the data it reads from the sensors into our “humidity” and “temperature” variables.

while True:
        temperature_c = dht_device.temperature
        temperature_f = temperature_c * (9 / 5) + 32

        humidity = dht_device.humidity

e. Our big change to this section of code is that instead of printing the temperature and humidity to the console, we write it to our “humidity.csv” file. We do this by using the file handle we opened earlier.

We format the text written to the file to include both the current date, current time, our formatted temperature and humidity.

At the end of the loop, we sleep the script for 30 seconds, if you want to make it sleep longer or poll more often, then modify this number.

        f.write('{0},{1},{2:0.1f}*C,{2:0.1f}*F,{3:0.1f}%\r\n'.format(time.strftime('%m/%d/%y'), time.strftime('%H:%M'), temperature_c, temperature_f, humidity))
    except RuntimeError as err:
        print(err.args[0])

    time.sleep(30)

3. Once you have finished entering the code, it should look like what we have displayed below.

Ensure that you replace “pi” with your own username.

import os
import time
import adafruit_dht
import board

dht_device = adafruit_dht.DHT22(board.D4)

try:
    f = open('/home/pi/dht22/humidity.csv', 'a+')
    if os.stat('/home/pi/dht22/humidity.csv').st_size == 0:
            f.write('Date,Time,Temperature C, Temperature F,Humidity\r\n')
except:
    pass

while True:
    try:
        temperature_c = dht_device.temperature
        temperature_f = temperature_c * (9 / 5) + 32

        humidity = dht_device.humidity

        f.write('{0},{1},{2:0.1f}*C,{2:0.1f}*F,{3:0.1f}%\r\n'.format(time.strftime('%m/%d/%y'), time.strftime('%H:%M'), temperature_c, temperature_f, humidity))
    except RuntimeError as err:
        print(err.args[0])

    time.sleep(30)

4. Once done, save the file by pressing CTRL + X, then Y followed by ENTER.

5. Now like our last script lets go ahead and now run it by entering the following command.

python3 ~/dht22/humidity_logger.py

6. Once you exit out of the script, you will now be able to check out the “humidity.csv” file to see all the results that you have logged over time.

If you run the following command, you should see the contents of the file.

nano ~/dht22/humidity.csv

7. Below is an example of the contents that you should see within this file.

Date,Time,Temperature,Humidity
05/04/19,05:47,22.3*C,50.6%
05/04/19,05:48,22.2*C,50.4%
05/04/19,05:48,22.2*C,50.6%
05/04/19,05:49,22.2*C,50.4%
05/04/19,05:49,22.2*C,50.4%
05/04/19,05:50,22.2*C,50.3%
05/04/19,05:50,22.2*C,50.3%
05/04/19,05:51,22.2*C,50.2%

Once you have verified that the file is successfully being written, then you are finally done with programming your Raspberry Pi humidity sensor.

If you need a waterproof temperature sensor, then be sure to check out our DS18B20 temperature sensor tutorial. It covers everything you need to know, and it works perfectly alongside this sensor.

I hope that everything has worked correctly for you and you’re not collecting the humidity and temperature without issues. If you want to leave some feedback, then please don’t hesitate to leave a comment below.

41 Comments

  1. Avatar for Rob Ramsey
    Rob Ramsey on

    If you want to run this code at startup using rc.local or systemd, you need to add the following syntax after the f.print statement:

    f.flush()
    os.fsync(f.fileno())

    By default, Python doesn’t flush data down to a file until it exits, which it’ll never do if it’s started at boot and running forever…

  2. Avatar for Eric
    Eric on

    sudo pip3 install Adafruit_DHT
    keeps telling me i cannot install it, as it cannot detect whether it is a pi or BBB. i am using a raspberry pi 3+.

    1. Avatar for Emmet
      Emmet on
      Editor

      Hi Eric,

      Can you please try using the following command instead.

      sudo pip3 install --install-option="--force-pi" Adafruit_DHT

      The changes here will pass an option to the package, bypassing its device detection and forcing the Raspberry Pi.

      Cheers,
      Emmet

  3. Avatar for Robert Mandl
    Robert Mandl on

    It works really fine, thanks a lot.
    One remark: using the AM2302 the introduction to the Python script should change from “Adafruit_DHT_AM2302” to “Adafruit_DHT.AM2302. With a full stop instead of the underscore.

    “If you are following this guide but are using either the DHT11 or the AM2302 you can use either “Adafruit_DHT.DH11” or “Adafruit_DHT_AM2302” respectively.”

    1. Avatar for Emmet
      Emmet on
      Editor

      Hi Robert,

      Thank you for pointing out this mistake, I have made a correction to the tutorial so it references the current name.

      Cheers,
      Emmet

  4. Avatar for Eskil
    Eskil on

    Nice tutorial, taught me a lot in a short while, getting me on the right track, many thanks!

  5. Avatar for B
    B on

    Hi.

    i think theres a typo in this:
    Adafruit_DHT_AM2302

    It should be this:
    Adafruit_DHT.AM2302

    Btw great article i managed to set a test rpi very quickly with it.

  6. Avatar for Bob
    Bob on

    Humidity.py works no problem, humidity logging appears to be working, csv file created but no data stored or readable.

    Checked program more than once can’t find anything wrong or missing, any ideas?

    REGARDS

    1. Avatar for Emmet
      Emmet on
      Editor

      Hi Bob,

      I quickly tested this and it appears to be working fine for me.

      Are you seeing the error “Failed to retrieve data from humidity sensor” appear at all when running the CSV version of the script?

      Cheers,
      Emmet

    2. Avatar for Bob
      Bob on

      Hi Emmet
      Thanks for reply. No data is present in csv file, when checked. Going to re-type code and see if this sorts out the hiccup. Could be I need to run update again in case file is corrupt. Watch this space for be cheer if successful.

      Regards

    3. Avatar for Jesus
      Jesus on

      Add an f. flush() command (to force flushing the data into the file) after the f.write(‘{0},{1},{2:0.1f}*C,{3:0.1f}%\r\n’.format(time.strftime(‘%m/%d/%y’), time.strftime(‘%H:%M’), temperature, humidity))

  7. Avatar for Andrew&Son
    Andrew&Son on

    Thank you for the guide, it’s really easy to follow. Me and my son are learning together! Would it be possible to create a new CSV file everyday?

    1. Avatar for Gus
      Gus on
      Editor

      Yes, you can write the date into the csv name so it’s unique every day.

      Something like this will get the date.
      date = datetime.today().strftime('%Y-%m-%d')

      Next, you will need to add it to your file name.
      f = open('/home/pi/'+date+'humidity.csv', 'a+')
      if os.stat('/home/pi/'+date+'humidity.csv').st_size == 0:
      f.write('Date,Time,Temperature,Humidity\r\n')

      I haven’t tested these blocks of code, but in theory it should work.

    2. Avatar for nance
      nance on

      To add to Gus’s comment.

      You would probably want to nest the code inside of a loop which first checks to see if the date has changed. An outline would be something like the following:
      if the date is the same – run the code in the article with the changes shown in his comments.
      Else – the date is different call `f.close` to close the current file.
      when the code loops it will create a new file with the new date.

      you also might want to consider changing the sleep time to something more reasonable like every 10 min instead of every 30s. 30s is nice for testing purposes, but for logging you’re going to end up with upwards of 2800 lines per day. Depending on what you’re checking you probably wont see much fluctuation between every 30s. say if you are checking your home’s temp for example.

  8. Avatar for Lisa
    Lisa on

    My readings are so wonky any idea on this? it is a new sensor DHT11 , might it just be bad?
    readings…
    Temp=512.1*C Humidity=1612.8%

    1. Avatar for Gus
      Gus on
      Editor

      Hi Lisa,

      It could be dodgy, a lose connection, or a mistake in the circuit.

      Also, just want to check that you updated the code to reference DHT11 and not DHT22?

    2. Avatar for Adam
      Adam on

      After replacing a DHT22 that had gone bad by a brandnew one I got values like you have. A 2nd new one produced reasonable values for a short time then showed faulty ones like yours… Any clues yet??

  9. Avatar for Clo
    Clo on

    Hi Emmet,
    pretty cool article, thanks!
    Could I use a 4,7 kΩ resistor instead of a 10 kΩ one? (Because I have some…)
    Will it works fine?
    Thank you.

    1. Avatar for Emmet
      Emmet on
      Editor

      Hi Clo,

      From memory you should be fine using a a 4.7k ohm resistors.

      Cheers,
      Emmet

    2. Avatar for Jay Kanta
      Jay Kanta on

      Just a tip, the smaller the resistor on your pull-up (it pulls the signal level up from a weak output) the more current the part will have to sink. This could make it heat up, but I doubt it. It might, over time, cause electrical wear. If you’re trying to use battery power it will drain your battery faster, etc.

  10. Avatar for sllimj
    sllimj on

    doing this seems so strait forward and then this………………..

    python3 ~/humidity.py
    File “/home/pi/humidity.py”, line 5
    if humidity is not None and temperature is not None:
    ^
    IndentationError: unindent does not match any outer indentation level
    pi@raspberrypi:~ $

    ….chkl……. Thank you
    p.s. and how would one modify or delete and retry?”

    1. Avatar for Emmet
      Emmet on
      Editor

      Hi sllimj,

      Make sure that all of your code is properly indented as shown within the tutorial.

      Python is sensitive to whitespace.

      Cheers,
      Emmet

  11. Avatar for Gabriel
    Gabriel on

    Hello. New to electronics here, had a question about the resistor. Seeing that the DHT22 works with a voltage of 3.3 – 6V, why would you need the 10k resistor? Shouldn’t it safely work by itself?

    1. Avatar for Emmet
      Emmet on
      Editor

      Hi Gabriel,

      In this case we aren’t using the resistor to bring down the voltage.

      Instead we are using it to “pull-up” the input to HIGH to ensure that we have a defined valid logic level for when the pin is switching from input to output.

      While you could exclude the resistor you will likely start to get unreliable measurements from the sensor.

      Cheers,
      Emmet

  12. Avatar for N
    N on

    Hi so for some reason the “sudo apt-get install python3-dev python3-pip” command won’t work on my raspberry pi.

    I tried to follow all the other steps in this tutorial but my raspberry pi powers off every time I run this code and I’m not sure why… Any recommendations? I have tried this on 2 different Raspberry Pis and it happens for both of them.

    Thanks

    1. Avatar for Emmet
      Emmet on
      Editor

      Hi,

      That does not sound right at all, make sure that you have a stable power supply to your Raspberry Pi and that the OS is not currupted.

      There is no reason those install commands would cause a power off of your Raspberry Pi.

      Cheers,
      Emmet

    2. Avatar for DrDox
      DrDox on

      This occurs when you have the positive and gnd pins reversed on the DHT; in this case the outer 2 pins, connected to pins 1 and 4, are reversed.

  13. Avatar for Logan Mitsu
    Logan Mitsu on

    the python3 ~/humidity_logger.py command is taking a significant amount of time to run. Is this normal?

    1. Avatar for Gus
      Gus on
      Editor

      No, this isn’t normal. The script should respond immediately then every thirty seconds. Alter the time.sleep() value to read the sensor more often.

      If the file creation fails, then this could be causing issues as well. Do you have any errors?

  14. Avatar for Matt Nance
    Matt Nance on

    How do I convert C to Fahrenheit?

    1. Avatar for Gus
      Gus on
      Editor

      Add this line to the code.

      temperature = temperature * 9/5.0 + 32

      Make sure you place it after this line.

      humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
  15. Avatar for Romeo St-Cyr
    Romeo St-Cyr on

    Hello, How can I get 30 seconds between reading using the code.

    Thank you for your help.

    1. Avatar for Gus
      Gus on
      Editor

      Hi,

      To add a 30 second gap between readings you will need to import the time library and sleep the script for 30 seconds.

      Add time with the other import.

      import time

      At the end of the while loop add.

      time.sleep(30)

      I hope that helps!

      Cheers,
      Gus

    2. Avatar for Stephen Bond
      Stephen Bond on

      It seems the csv file only updates once the program is stopped. Is that’s correct? Or is there a way of updating the csv within the code?

    3. Avatar for Emmet
      Emmet on
      Editor

      Hi Stephen,

      Can you try updating the following line.

      f = open('/home/pi/humidity.csv', 'a+')

      To

      f = open('/home/pi/humidity.csv', 'a+', 0)

      This should tell Python not to buffer writes so every write should be applied instantly to the file.

      Alternatively you can f.flush() on every loop.

      Cheers,
      Emmet

  16. Avatar for sanodin san
    sanodin san on

    amt1001 I tried to connect this sensor, it does not work. Do you have experience connecting and working with it? on python

    1. Avatar for Gus
      Gus on
      Editor

      This tutorial is for digital sensors such as the DHT22, DHT11, and the AM2302. The amt1001 appears to be analog sensor so it will require a bit more work to get it working with the Raspberry Pi. You will likely need to use a analog to digital converter.

  17. Avatar for Gavin
    Gavin on

    Hi,

    I have got the sensor to return data in the terminal but it isn’t writing to the file although it has generated a csv. After a while it did return a failed to return data from the sensor error. Is there any reason why it would work with one script and not the other?

    1. Avatar for Gus
      Gus on
      Editor

      There shouldn’t be any reason why it would work in one but not the other. I will look into the error and see if I can recreate it locally.

  18. Avatar for chris
    chris on

    hello

    when I run the code an import error shows up “importError: No module named Adafruit_DHT”

    1. Avatar for Gus
      Gus on
      Editor

      This means the module isn’t installed. Have you run the install command? If so, did it error?

      sudo pip3 install Adafruit_DHT

Leave a Reply

Your email address will not be published. Required fields are marked *