update dht.

Optimize DHT11 code
This commit is contained in:
Suhayl
2020-10-16 17:56:30 +08:00
parent 965a18dbb3
commit 3d71851846
6 changed files with 199 additions and 153 deletions
+38 -3
View File
@@ -4,10 +4,14 @@
Used for Raspberry Pi.
* Program transplantation by Freenove.
* Author : freenove
* modification: 2019/12/28
* modification: 2020/10/16
* Reference : https://github.com/RobTillaart/Arduino/tree/master/libraries/DHTlib
**********************************************************************/
#include "DHT.hpp"
DHT::DHT(){
wiringPiSetup();
}
//Function: Read DHT sensor, store the original data in bits[]
// return values:DHTLIB_OK DHTLIB_ERROR_CHECKSUM DHTLIB_ERROR_TIMEOUT
int DHT::readSensor(int pin,int wakeupDelay){
@@ -18,22 +22,41 @@ int DHT::readSensor(int pin,int wakeupDelay){
for (i=0;i<5;i++){
bits[i] = 0;
}
// Clear sda
pinMode(pin,OUTPUT);
digitalWrite(pin,HIGH);
delay(500);
// Start signal
digitalWrite(pin,LOW);
delay(wakeupDelay);
digitalWrite(pin,HIGH);
delayMicroseconds(40);
// delayMicroseconds(40);
pinMode(pin,INPUT);
int32_t loopCnt = DHTLIB_TIMEOUT;
t = micros();
// Waiting echo
while(1){
if(digitalRead(pin)==LOW){
break;
}
if((micros() - t) > loopCnt){
return DHTLIB_ERROR_TIMEOUT;
}
}
loopCnt = DHTLIB_TIMEOUT;
t = micros();
// Waiting echo low level end
while(digitalRead(pin)==LOW){
if((micros() - t) > loopCnt){
return DHTLIB_ERROR_TIMEOUT;
}
}
loopCnt = DHTLIB_TIMEOUT;
t = micros();
// Waiting echo high level end
while(digitalRead(pin)==HIGH){
if((micros() - t) > loopCnt){
return DHTLIB_ERROR_TIMEOUT;
@@ -69,7 +92,7 @@ int DHT::readSensor(int pin,int wakeupDelay){
}
//FunctionRead DHT sensor, analyze the data of temperature and humidity
//returnDHTLIB_OK DHTLIB_ERROR_CHECKSUM DHTLIB_ERROR_TIMEOUT
int DHT::readDHT11(int pin){
int DHT::readDHT11Once(int pin){
int rv ;
uint8_t sum;
rv = readSensor(pin,DHTLIB_DHT11_WAKEUP);
@@ -86,5 +109,17 @@ int DHT::readDHT11(int pin){
return DHTLIB_OK;
}
int DHT::readDHT11(int pin){
int chk = DHTLIB_INVALID_VALUE;
for (int i = 0; i < 15; i++){
chk = readDHT11Once(pin); //read DHT11 and get a return value. Then determine whether data read is normal according to the return value.
if(chk == DHTLIB_OK){
return DHTLIB_OK;
}
delay(100);
}
return chk;
}
+5 -3
View File
@@ -2,9 +2,9 @@
* Filename : DHT.hpp
* Description : DHT Temperature & Humidity Sensor library for Raspberry.
Used for Raspberry Pi.
* Program transplantation by Freenove.
* Program transplantation by Freenove.
* Author : freenove
* modification: 2019/12/28
* modification: 2020/10/16
* Reference : https://github.com/RobTillaart/Arduino/tree/master/libraries/DHTlib
**********************************************************************/
#ifndef _DHT_H_
@@ -20,14 +20,16 @@
#define DHTLIB_ERROR_TIMEOUT -2
#define DHTLIB_INVALID_VALUE -999
#define DHTLIB_DHT11_WAKEUP 18
#define DHTLIB_DHT11_WAKEUP 20
#define DHTLIB_DHT_WAKEUP 1
#define DHTLIB_TIMEOUT 100
class DHT{
public:
DHT();
double humidity,temperature; //use to store temperature and humidity data read
int readDHT11Once(int pin); //read DHT11
int readDHT11(int pin); //read DHT11
private:
uint8_t bits[5]; //Buffer to receiver data
+18 -27
View File
@@ -1,45 +1,36 @@
/**********************************************************************
* Filename : DHT11.cpp
* Description : Read the temperature and humidity data of DHT11
* Author : www.freenove.com
* modification: 2019/12/27
* modification: 2020/10/16
**********************************************************************/
#include <wiringPi.h>
#include <stdio.h>
#include <stdint.h>
#include "DHT.hpp"
#define DHT11_Pin 0 //define the pin of sensor
#define DHT11_Pin 0 //define the pin of sensor
int main(){
DHT dht; //create a DHT class object
int chk,sumCnt;//chk:read the return value of sensor; sumCnt:times of reading sensor
DHT dht; //create a DHT class object
int chk, counts; //chk:read the return value of sensor; sumCnt:times of reading sensor
printf("Program is starting ...\n");
wiringPiSetup();
while(1){
chk = dht.readDHT11(DHT11_Pin); //read DHT11 and get a return value. Then determine whether data read is normal according to the return value.
sumCnt++; //counting number of reading times
printf("The sumCnt is : %d \n",sumCnt);
switch(chk){
case DHTLIB_OK: //if the return value is DHTLIB_OK, the data is normal.
printf("DHT11,OK! \n");
break;
case DHTLIB_ERROR_CHECKSUM: //data check has errors
printf("DHTLIB_ERROR_CHECKSUM! \n");
break;
case DHTLIB_ERROR_TIMEOUT: //reading DHT times out
printf("DHTLIB_ERROR_TIMEOUT! \n");
break;
case DHTLIB_INVALID_VALUE: //other errors
printf("DHTLIB_INVALID_VALUE! \n");
while (1){
counts++; //counting number of reading times
printf("Measurement counts : %d \n", counts);
for (int i = 0; i < 15; i++){
chk = dht.readDHT11(DHT11_Pin); //read DHT11 and get a return value. Then determine whether data read is normal according to the return value.
if(chk == DHTLIB_OK){
printf("DHT11,OK! \n");
break;
}
delay(100);
}
printf("Humidity is %.2f %%, \t Temperature is %.2f *C\n\n",dht.humidity,dht.temperature);
printf("Humidity is %.2f %%, \t Temperature is %.2f *C\n\n",dht.humidity, dht.temperature);
delay(2000);
}
}
return 1;
}
+10 -14
View File
@@ -3,7 +3,7 @@
# Filename : DHT11.py
# Description : read the temperature and humidity data of DHT11
# Author : freenove
# modification: 2018/08/03
# modification: 2020/10/16
########################################################################
import RPi.GPIO as GPIO
import time
@@ -12,20 +12,16 @@ DHTPin = 11 #define the pin of DHT11
def loop():
dht = DHT.DHT(DHTPin) #create a DHT class object
sumCnt = 0 #number of reading times
counts = 0 # Measurement counts
while(True):
sumCnt += 1 #counting number of reading times
chk = dht.readDHT11() #read DHT11 and get a return value. Then determine whether data read is normal according to the return value.
print ("The sumCnt is : %d, \t chk : %d"%(sumCnt,chk))
if (chk is dht.DHTLIB_OK): #read DHT11 and get a return value. Then determine whether data read is normal according to the return value.
print("DHT11,OK!")
elif(chk is dht.DHTLIB_ERROR_CHECKSUM): #data check has errors
print("DHTLIB_ERROR_CHECKSUM!!")
elif(chk is dht.DHTLIB_ERROR_TIMEOUT): #reading DHT times out
print("DHTLIB_ERROR_TIMEOUT!")
else: #other errors
print("Other error!")
counts += 1
print("Measurement counts: ", counts)
for i in range(0,15):
chk = dht.readDHT11() #read DHT11 and get a return value. Then determine whether data read is normal according to the return value.
if (chk is dht.DHTLIB_OK): #read DHT11 and get a return value. Then determine whether data read is normal according to the return value.
print("DHT11,OK!")
break
time.sleep(0.1)
print("Humidity : %.2f, \t Temperature : %.2f \n"%(dht.humidity,dht.temperature))
time.sleep(2)
+119 -97
View File
@@ -1,108 +1,130 @@
#!/usr/bin/env python3
#############################################################################
# Filename : Freenove_DHT.py
# Description : DHT Temperature & Humidity Sensor library for Raspberry
# Description : DHT Temperature & Humidity Sensor library for Raspberry
# Author : freenove
# modification: 2018/08/03
# modification: 2020/10/16
########################################################################
import RPi.GPIO as GPIO
import time
class DHT(object):
DHTLIB_OK = 0
DHTLIB_ERROR_CHECKSUM = -1
DHTLIB_ERROR_TIMEOUT = -2
DHTLIB_INVALID_VALUE = -999
DHTLIB_DHT11_WAKEUP = 0.020#0.018 #18ms
DHTLIB_TIMEOUT = 0.0001 #100us
humidity = 0
temperature = 0
def __init__(self,pin):
self.pin = pin
self.bits = [0,0,0,0,0]
GPIO.setmode(GPIO.BOARD)
#Read DHT sensor, store the original data in bits[]
def readSensor(self,pin,wakeupDelay):
mask = 0x80
idx = 0
self.bits = [0,0,0,0,0]
GPIO.setup(pin,GPIO.OUT)
GPIO.output(pin,GPIO.LOW)
time.sleep(wakeupDelay)
GPIO.output(pin,GPIO.HIGH)
#time.sleep(40*0.000001)
GPIO.setup(pin,GPIO.IN)
loopCnt = self.DHTLIB_TIMEOUT
t = time.time()
while(GPIO.input(pin) == GPIO.LOW):
if((time.time() - t) > loopCnt):
#print ("Echo LOW")
return self.DHTLIB_ERROR_TIMEOUT
t = time.time()
while(GPIO.input(pin) == GPIO.HIGH):
if((time.time() - t) > loopCnt):
#print ("Echo HIGH")
return self.DHTLIB_ERROR_TIMEOUT
for i in range(0,40,1):
t = time.time()
while(GPIO.input(pin) == GPIO.LOW):
if((time.time() - t) > loopCnt):
#print ("Data Low %d"%(i))
return self.DHTLIB_ERROR_TIMEOUT
t = time.time()
while(GPIO.input(pin) == GPIO.HIGH):
if((time.time() - t) > loopCnt):
#print ("Data HIGH %d"%(i))
return self.DHTLIB_ERROR_TIMEOUT
if((time.time() - t) > 0.00005):
self.bits[idx] |= mask
#print("t : %f"%(time.time()-t))
mask >>= 1
if(mask == 0):
mask = 0x80
idx += 1
#print (self.bits)
GPIO.setup(pin,GPIO.OUT)
GPIO.output(pin,GPIO.HIGH)
return self.DHTLIB_OK
#Read DHT sensor, analyze the data of temperature and humidity
def readDHT11(self):
rv = self.readSensor(self.pin,self.DHTLIB_DHT11_WAKEUP)
if (rv is not self.DHTLIB_OK):
self.humidity = self.DHTLIB_INVALID_VALUE
self.temperature = self.DHTLIB_INVALID_VALUE
return rv
self.humidity = self.bits[0]
self.temperature = self.bits[2] + self.bits[3]*0.1
sumChk = ((self.bits[0] + self.bits[1] + self.bits[2] + self.bits[3]) & 0xFF)
if(self.bits[4] is not sumChk):
return self.DHTLIB_ERROR_CHECKSUM
return self.DHTLIB_OK
DHTLIB_OK = 0
DHTLIB_ERROR_CHECKSUM = -1
DHTLIB_ERROR_TIMEOUT = -2
DHTLIB_INVALID_VALUE = -999
DHTLIB_DHT11_WAKEUP = 0.020#0.018 #18ms
DHTLIB_TIMEOUT = 0.0001 #100us
humidity = 0
temperature = 0
def __init__(self,pin):
self.pin = pin
self.bits = [0,0,0,0,0]
GPIO.setmode(GPIO.BOARD)
#Read DHT sensor, store the original data in bits[]
def readSensor(self,pin,wakeupDelay):
mask = 0x80
idx = 0
self.bits = [0,0,0,0,0]
# Clear sda
GPIO.setup(pin,GPIO.OUT)
GPIO.output(pin,GPIO.HIGH)
time.sleep(0.5)
# start signal
GPIO.output(pin,GPIO.LOW)
time.sleep(wakeupDelay)
GPIO.output(pin,GPIO.HIGH)
# time.sleep(0.000001)
GPIO.setup(pin,GPIO.IN)
loopCnt = self.DHTLIB_TIMEOUT
# Waiting echo
t = time.time()
while True:
if (GPIO.input(pin) == GPIO.LOW):
break
if((time.time() - t) > loopCnt):
return self.DHTLIB_ERROR_TIMEOUT
# Waiting echo low level end
t = time.time()
while(GPIO.input(pin) == GPIO.LOW):
if((time.time() - t) > loopCnt):
#print ("Echo LOW")
return self.DHTLIB_ERROR_TIMEOUT
# Waiting echo high level end
t = time.time()
while(GPIO.input(pin) == GPIO.HIGH):
if((time.time() - t) > loopCnt):
#print ("Echo HIGH")
return self.DHTLIB_ERROR_TIMEOUT
for i in range(0,40,1):
t = time.time()
while(GPIO.input(pin) == GPIO.LOW):
if((time.time() - t) > loopCnt):
#print ("Data Low %d"%(i))
return self.DHTLIB_ERROR_TIMEOUT
t = time.time()
while(GPIO.input(pin) == GPIO.HIGH):
if((time.time() - t) > loopCnt):
#print ("Data HIGH %d"%(i))
return self.DHTLIB_ERROR_TIMEOUT
if((time.time() - t) > 0.00005):
self.bits[idx] |= mask
#print("t : %f"%(time.time()-t))
mask >>= 1
if(mask == 0):
mask = 0x80
idx += 1
#print (self.bits)
GPIO.setup(pin,GPIO.OUT)
GPIO.output(pin,GPIO.HIGH)
return self.DHTLIB_OK
#Read DHT sensor, analyze the data of temperature and humidity
def readDHT11Once(self):
rv = self.readSensor(self.pin,self.DHTLIB_DHT11_WAKEUP)
if (rv is not self.DHTLIB_OK):
self.humidity = self.DHTLIB_INVALID_VALUE
self.temperature = self.DHTLIB_INVALID_VALUE
return rv
self.humidity = self.bits[0]
self.temperature = self.bits[2] + self.bits[3]*0.1
sumChk = ((self.bits[0] + self.bits[1] + self.bits[2] + self.bits[3]) & 0xFF)
if(self.bits[4] is not sumChk):
return self.DHTLIB_ERROR_CHECKSUM
return self.DHTLIB_OK
def readDHT11(self):
result = self.DHTLIB_INVALID_VALUE
for i in range(0,15):
result = self.readDHT11Once()
if result == self.DHTLIB_OK:
return self.DHTLIB_OK
time.sleep(0.1)
return result
def loop():
dht = DHT(11)
sumCnt = 0
okCnt = 0
while(True):
sumCnt += 1
chk = dht.readDHT11()
if (chk is 0):
okCnt += 1
okRate = 100.0*okCnt/sumCnt;
print("sumCnt : %d, \t okRate : %.2f%% "%(sumCnt,okRate))
print("chk : %d, \t Humidity : %.2f, \t Temperature : %.2f "%(chk,dht.humidity,dht.temperature))
time.sleep(3)
dht = DHT(11)
sumCnt = 0
okCnt = 0
while(True):
sumCnt += 1
chk = dht.readDHT11()
if (chk is 0):
okCnt += 1
okRate = 100.0*okCnt/sumCnt;
print("sumCnt : %d, \t okRate : %.2f%% "%(sumCnt,okRate))
print("chk : %d, \t Humidity : %.2f, \t Temperature : %.2f "%(chk,dht.humidity,dht.temperature))
time.sleep(3)
if __name__ == '__main__':
print ('Program is starting ... ')
try:
loop()
except KeyboardInterrupt:
pass
exit()
print ('Program is starting ... ')
try:
loop()
except KeyboardInterrupt:
pass
exit()
+9 -9
View File
@@ -2,12 +2,12 @@
from setuptools import setup,find_packages
setup(
name = "Freenove_DHT",
version = "V1.0.0",
description = "Read DHT Sensor",
author = "Freenove",
url = "http://www.freenove.com",
license = " ",
packages = find_packages(),
scripts = ["Freenove_DHT.py"],
)
name = "Freenove_DHT",
version = "V1.0.1",
description = "Read DHT Sensor",
author = "Freenove",
url = "http://www.freenove.com",
license = " ",
packages = find_packages(),
scripts = ["Freenove_DHT.py"],
)