Works for me...
Here's some code that uses it to get the readings from a DHT11 sensor.
/*
* temphumid.c:
* Read Temperature / Humidity from DHT11 sensor
* -iGNUiCould
*/
#include <wiringPi.h>
#include <stdio.h>
#define MAX_TIMINGS 85
#define DHTPIN 7 // GPIO pin for DHT11 data
int data[5] = {0, 0, 0, 0, 0};
// Function to read data from DHT11
void readDHT11() {
uint8_t lastState = HIGH;
uint8_t counter = 0;
uint8_t j = 0, i;
data[0] = data[1] = data[2] = data[3] = data[4] = 0;
// Send start signal to DHT11
pinMode(DHTPIN, OUTPUT);
digitalWrite(DHTPIN, LOW);
delay(18);
digitalWrite(DHTPIN, HIGH);
delayMicroseconds(40);
pinMode(DHTPIN, INPUT);
// Read data from DHT11
for (i = 0; i < MAX_TIMINGS; i++) {
counter = 0;
while (digitalRead(DHTPIN) == lastState) {
counter++;
delayMicroseconds(1);
if (counter == 255) {
break;
}
}
lastState = digitalRead(DHTPIN);
if (counter == 255) {
break;
}
// Ignore first 3 transitions
if ((i >= 4) && (i % 2 == 0)) {
data[j / 8] <<= 1;
if (counter > 16) {
data[j / 8] |= 1;
}
j++;
}
}
// Verify checksum and print data if valid
if ((j >= 40) &&
(data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF))) {
float humidity = data[0] + data[1] / 10.0;
float tempC = data[2] + data[3] / 10.0;
float tempF = tempC * 9.0 / 5.0 + 32;
printf("Temperature = %.1f°F\n", tempF);
printf("Humidity = %.1f%%\n", humidity);
} else {
printf("Data not valid\n");
}
}
int main() {
if (wiringPiSetup() == -1) {
printf("WiringPi setup failed\n");
return -1;
}
while (1) {
readDHT11();
delay(2000); // Wait 2 seconds before reading again
}
return 0;
}