Arduino
/**********************************
* name: Humiture Detection
* function:you can see the current value of humidity and temperature displayed on the I2C LCD1602.
*************************************/
#include <dht.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); //set the LCD address to 0x27 for a 16 chars and 2 lines display
dht DHT; //Create a variable type of dht
const int DHT11_PIN = 7;
void setup()
{
Serial.begin(9600);
lcd.init();
lcd.backlight();
}
void loop()
{
//Read data
//Serial.print("DHT11: ");
D: int chk = DHT.read11(DHT11_PIN); //read the value returned from sensor
switch (chk)
{
case DHTLIB_OK:
//Serial.print("OK!");
break;
case DHTLIB_ERROR_CHECKSUM:
//Serial.print("Checksum error, \t");
break;
case DHTLIB_ERROR_TIMEOUT:
goto D;
//Seiral.print("Time out error, \t");
break;
default:
//Serial.print("Unknown error, \t");
break;
}
//Display data
lcd.setCursor(0, 0);
lcd.print("Tem:");
//Serail.print("Tem:");
lcd.print(DHT.temperature, 1);
//Serial.print(DHT.Temperature, 1);
lcd.print(char(223));
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Hum:");
lcd.print(DHT.humidity, 1);
//Serial.println(DHT.humidity, 1);
lcd.print(" %");
//Serial.print(" %");
delay(200); //wait a while
}
树莓派
C
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define MAXTIMINGS 85
#define DHTPIN 0
int dht11_dat[5] = {0,0,0,0,0};
void read_dht11_dat()
{
uint8_t laststate = HIGH;
uint8_t counter = 0;
uint8_t j = 0, i;
float f; // fahrenheit
dht11_dat[0] = dht11_dat[1] = dht11_dat[2] = dht11_dat[3] = dht11_dat[4] = 0;
// pull pin down for 18 milliseconds
pinMode(DHTPIN, OUTPUT);
digitalWrite(DHTPIN, LOW);
delay(18);
// then pull it up for 40 microsencods
digitalWrite(DHTPIN, HIGH);
delayMicroseconds(40);
// prepare to read the pin
pinMode(DHTPIN, INPUT);
// detect change and read data
for (i = 0; i < MAXTIMINGS; i++){
counter = 0;
while (digitalRead(DHTPIN) == laststate){
counter ++;
delayMicroseconds(1);
if (counter == 255){
break;
}
}
laststate = digitalRead(DHTPIN);
if (counter == 255) break;
// ingnore first 3 transitions
if ((i >= 4) && (i%2 == 0)){
// shove each bit into the storage bytes
dht11_dat[j/8] <<= 1;
if (counter > 16)
dht11_dat[j/8] |= 1;
j ++;
}
}
// check we read 40 bits (8bits x 5) + verify checksum in the last byte
// print it out if data is good
if ((j >= 40) &&
(dht11_dat[4] == ((dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xFF)) ){
f = dht11_dat[2] * 9. / 5. + 32;
printf("Humidity = %d.%d %% Temperature = %d.%d *C (%.1f *F)\n",
dht11_dat[0], dht11_dat[1], dht11_dat[2], dht11_dat[3], f);
}
else
{
printf("Data not good, skip\n");
}
}
int main(void)
{
printf("Rasbperry Pi wiringPi DHT11 Temperature test program\n");
if (wiringPiSetup() == -1)
exit(1);
while(1)
{
read_dht11_dat();
delay(1000); // wait 1 sec to refresh
}
return 0;
}
Python
import RPi.GPIO as GPIO
import time
DHTPIN = 17
GPIO.setmode(GPIO.BCM)
MAX_UNCHANGE_COUNT = 100
STATE_INIT_PULL_DOWN = 1
STATE_INIT_PULL_UP = 2
STATE_DATA_FIRST_PULL_DOWN = 3
STATE_DATA_PULL_UP = 4
STATE_DATA_PULL_DOWN = 5
def read_dht11_dat():
GPIO.setup(DHTPIN, GPIO.OUT)
GPIO.output(DHTPIN, GPIO.HIGH)
time.sleep(0.05)
GPIO.output(DHTPIN, GPIO.LOW)
time.sleep(0.02)
GPIO.setup(DHTPIN, GPIO.IN, GPIO.PUD_UP)
unchanged_count = 0
last = -1
data = []
while True:
current = GPIO.input(DHTPIN)
data.append(current)
if last != current:
unchanged_count = 0
last = current
else:
unchanged_count += 1
if unchanged_count > MAX_UNCHANGE_COUNT:
break
state = STATE_INIT_PULL_DOWN
lengths = []
current_length = 0
for current in data:
current_length += 1
if state == STATE_INIT_PULL_DOWN:
if current == GPIO.LOW:
state = STATE_INIT_PULL_UP
else:
continue
if state == STATE_INIT_PULL_UP:
if current == GPIO.HIGH:
state = STATE_DATA_FIRST_PULL_DOWN
else:
continue
if state == STATE_DATA_FIRST_PULL_DOWN:
if current == GPIO.LOW:
state = STATE_DATA_PULL_UP
else:
continue
if state == STATE_DATA_PULL_UP:
if current == GPIO.HIGH:
current_length = 0
state = STATE_DATA_PULL_DOWN
else:
continue
if state == STATE_DATA_PULL_DOWN:
if current == GPIO.LOW:
lengths.append(current_length)
state = STATE_DATA_PULL_UP
else:
continue
if len(lengths) != 40:
print("Data not good, skip")
return False
shortest_pull_up = min(lengths)
longest_pull_up = max(lengths)
halfway = (longest_pull_up + shortest_pull_up) / 2
bits = []
the_bytes = []
byte = 0
for length in lengths:
bit = 0
if length > halfway:
bit = 1
bits.append(bit)
print("bits: %s, length: %d" % (bits, len(bits)))
for i in range(0, len(bits)):
byte = byte << 1
if (bits[i]):
byte = byte | 1
else:
byte = byte | 0
if ((i + 1) % 8 == 0):
the_bytes.append(byte)
byte = 0
print(the_bytes)
checksum = (the_bytes[0] + the_bytes[1] + the_bytes[2] + the_bytes[3]) & 0xFF
if the_bytes[4] != checksum:
print("Data not good, skip")
return False
return the_bytes[0], the_bytes[2]
def main():
print("Rasbperry Pi wiringPi DHT11 Temperature test program\n")
while True:
result = read_dht11_dat()
if result:
humidity,temperature = result
print("Humidity: %s %%, Temperature: %s C" % (humidity, temperature))
time.sleep(1)
def destroy():
GPIO.cleanup()
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
destroy()