Professional Documents
Culture Documents
Sign in
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.
1 de 7 01/06/2016 12:19
GpioOneWire - Windows IoT https://developer.microsoft.com/en-us/windows/iot/win10/samples/gpi...
Requirements
Hardware Setup
2 de 7 01/06/2016 12:19
GpioOneWire - Windows IoT https://developer.microsoft.com/en-us/windows/iot/win10/samples/gpi...
2. Right click on the project in the solution explorer, and click Properties .
6. 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.
3 de 7 01/06/2016 12:19
GpioOneWire - Windows IoT https://developer.microsoft.com/en-us/windows/iot/win10/samples/gpi...
LARGE_INTEGER qpf;
QueryPerformanceFrequency(&qpf);
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.
4 de 7 01/06/2016 12:19
GpioOneWire - Windows IoT https://developer.microsoft.com/en-us/windows/iot/win10/samples/gpi...
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.
LARGE_INTEGER prevTime = { 0 };
5 de 7 01/06/2016 12:19
GpioOneWire - Windows IoT https://developer.microsoft.com/en-us/windows/iot/win10/samples/gpi...
GpioPinValue::Low)) {
// A falling edge was detected
LARGE_INTEGER now;
QueryPerformanceCounter(&now);
if (i != 0) {
unsigned int difference = static_cast<unsigned
int>(
now.QuadPart - prevTime.QuadPart);
Reading.bits[Reading.bits.size() - i] =
difference > oneThreshold;
}
prevTime = now;
++i;
}
previousValue = value;
}
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 parameter.
if (!Reading.IsValid()) {
// checksum mismatch
return HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
}
return S_OK;
}
Questions/Suggestions
6 de 7 01/06/2016 12:19
GpioOneWire - Windows IoT https://developer.microsoft.com/en-us/windows/iot/win10/samples/gpi...
Programs
Get a dev account
App Developer Agreement
7 de 7 01/06/2016 12:19