This sample shows how to read from the DHT11
from a Universal Windows Application. The DHT11 is a low cost temperature and
humidity sensor that uses a single wire to interface to the host controller.
This wire is used by the host to request a sample from the DHT11 and
by the DHT11 to transmit data back to the host.
The DHT11 is right on the edge performance-wise of what the GPIO APIs can
handle. If there is background activity such as network, USB, filesystem, or
graphics activity, it can prevent the sample from successfully sampling
from the DHT11.
For a description of the protocol used by the DHT11, see
this article. The datasheet is here.
Minimum supported build
Raspberry Pi 2 or 3 Dragonboard 410C
You will need the following hardware to run this demo:
Right click on the project in the solution explorer, and click Properties.
In the project properties dialog, select the Debugging tab.
Enter the IP address of your device in the Machine Name field.
Set Authentication Type to Universal (Unencrypted Protocol)
Hit F5 to build, deploy, and debug the project. You should see temperature
and humidity samples updated on the screen every 2 seconds.
How it works
The logic that interacts with the DHT11 is contained in the Dht11::Sample()
method. Since the 1s and 0s that the DHT11 sends back are encoded as pulse
widths, we need a way to precisely measure the time difference between
falling edges. We use QueryPerformanceCounter()
for this purpose. The units of QueryPerformanceCounter are platform-dependent,
so we must call QueryPerformanceFrequency()
to determine the resolution of the counter.
A difference of 76 microseconds between falling edges denotes a ‘0’, while a
difference of 120 microseconds between falling edges denotes a ‘1’.
We choose 110 microseconds as a reasonable threshold above which we will
consider bits to be 1s, while we will consider pulses shorter
than this threshold to be 0s. We convert 110 microseconds to
QueryPerformanceCounter (QPC) units to be used later.
Next, we send the sequence required to activate the sensor. The GPIO signal
is normally pulled high while the device is idle, and we must pull it low
for 18 milliseconds to request a sample. We latch a low value to the pin
and set it as an output, driving the GPIO pin low.
We then revert the pin to an input which causes it to go high, and wait for
the DHT11 to pull the pin low, then high again.
After receiving the first rising edge, we catch all of the falling edges
and measure the time difference between them to determine whether the bit
is a 0 or 1.
After all bits have been received, we validate the checksum to make sure the
received data is valid. The data is returned through the Reading reference