Skip to content

Commit

Permalink
0.2.5 release
Browse files Browse the repository at this point in the history
  • Loading branch information
RobTillaart committed Jun 30, 2020
1 parent 2cfa3f2 commit d4477fa
Show file tree
Hide file tree
Showing 8 changed files with 537 additions and 0 deletions.
179 changes: 179 additions & 0 deletions dht.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
//
// FILE: dht.cpp
// AUTHOR: Rob Tillaart
// VERSION: 0.2.5
// PURPOSE: DHT Temperature & Humidity Sensor library for Arduino
// URL: https://github.com/RobTillaart/Arduino/tree/master/libraries/DHTstable
//
// HISTORY:
// 0.2.5 2020-06-30 move to own repository; update headers mainly.
// 0.2.4 2018-04-03 add get-/setDisableIRQ(bool b)
// 0.2.3 2018-02-21 change #defines in const int to enforce return types.
// https://github.com/RobTillaart/Arduino/issues/94
// 0.2.2 2017-12-12 add support for AM23XX types more explicitly
// 0.2.1 2017-09-20 fix https://github.com/RobTillaart/Arduino/issues/80
// 0.2.0 2017-07-24 fix https://github.com/RobTillaart/Arduino/issues/31 + 33
// 0.1.13 fix negative temperature
// 0.1.12 support DHT33 and DHT44 initial version
// 0.1.11 renamed DHTLIB_TIMEOUT
// 0.1.10 optimized faster WAKEUP + TIMEOUT
// 0.1.09 optimize size: timeout check + use of mask
// 0.1.08 added formula for timeout based upon clockspeed
// 0.1.07 added support for DHT21
// 0.1.06 minimize footprint (2012-12-27)
// 0.1.05 fixed negative temperature bug (thanks to Roseman)
// 0.1.04 improved readability of code using DHTLIB_OK in code
// 0.1.03 added error values for temp and humidity when read failed
// 0.1.02 added error codes
// 0.1.01 added support for Arduino 1.0, fixed typos (31/12/2011)
// 0.1.0 by Rob Tillaart (01/04/2011)
//
// inspired by DHT11 library
//

#include "dht.h"

/////////////////////////////////////////////////////
//
// PUBLIC
//

// return values:
// DHTLIB_OK
// DHTLIB_ERROR_CHECKSUM
// DHTLIB_ERROR_TIMEOUT
int dht::read11(uint8_t pin)
{
// READ VALUES
if (_disableIRQ) noInterrupts();
int rv = _readSensor(pin, DHTLIB_DHT11_WAKEUP);
if (_disableIRQ) interrupts();
if (rv != DHTLIB_OK)
{
humidity = DHTLIB_INVALID_VALUE; // invalid value, or is NaN prefered?
temperature = DHTLIB_INVALID_VALUE; // invalid value
return rv;
}

// CONVERT AND STORE
humidity = bits[0] + bits[1] * 0.1;
temperature = (bits[2] & 0x7F) + bits[3] * 0.1;
if (bits[2] & 0x80) // negative temperature
{
temperature = -temperature;
}

// TEST CHECKSUM
uint8_t sum = bits[0] + bits[1] + bits[2] + bits[3];
if (bits[4] != sum)
{
return DHTLIB_ERROR_CHECKSUM;
}
return DHTLIB_OK;
}

// return values:
// DHTLIB_OK
// DHTLIB_ERROR_CHECKSUM
// DHTLIB_ERROR_TIMEOUT
int dht::read(uint8_t pin)
{
// READ VALUES
if (_disableIRQ) noInterrupts();
int rv = _readSensor(pin, DHTLIB_DHT_WAKEUP);
if (_disableIRQ) interrupts();
if (rv != DHTLIB_OK)
{
humidity = DHTLIB_INVALID_VALUE; // NaN prefered?
temperature = DHTLIB_INVALID_VALUE; // NaN prefered?
return rv; // propagate error value
}

// CONVERT AND STORE
humidity = word(bits[0], bits[1]) * 0.1;
temperature = word(bits[2] & 0x7F, bits[3]) * 0.1;
if (bits[2] & 0x80) // negative temperature
{
temperature = -temperature;
}

// TEST CHECKSUM
uint8_t sum = bits[0] + bits[1] + bits[2] + bits[3];
if (bits[4] != sum)
{
return DHTLIB_ERROR_CHECKSUM;
}
return DHTLIB_OK;
}

/////////////////////////////////////////////////////
//
// PRIVATE
//

// return values:
// DHTLIB_OK
// DHTLIB_ERROR_TIMEOUT
int dht::_readSensor(uint8_t pin, uint8_t wakeupDelay)
{
// INIT BUFFERVAR TO RECEIVE DATA
uint8_t mask = 128;
uint8_t idx = 0;

// EMPTY BUFFER
for (uint8_t i = 0; i < 5; i++) bits[i] = 0;

// REQUEST SAMPLE
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
delay(wakeupDelay);
pinMode(pin, INPUT);
delayMicroseconds(40);

// GET ACKNOWLEDGE or TIMEOUT
uint16_t loopCnt = DHTLIB_TIMEOUT;
while(digitalRead(pin) == LOW)
{
if (--loopCnt == 0) return DHTLIB_ERROR_TIMEOUT;
}

loopCnt = DHTLIB_TIMEOUT;
while(digitalRead(pin) == HIGH)
{
if (--loopCnt == 0) return DHTLIB_ERROR_TIMEOUT;
}

// READ THE OUTPUT - 40 BITS => 5 BYTES
for (uint8_t i = 40; i != 0; i--)
{
loopCnt = DHTLIB_TIMEOUT;
while(digitalRead(pin) == LOW)
{
if (--loopCnt == 0) return DHTLIB_ERROR_TIMEOUT;
}

uint32_t t = micros();

loopCnt = DHTLIB_TIMEOUT;
while(digitalRead(pin) == HIGH)
{
if (--loopCnt == 0) return DHTLIB_ERROR_TIMEOUT;
}

if ((micros() - t) > 40)
{
bits[idx] |= mask;
}
mask >>= 1;
if (mask == 0) // next byte?
{
mask = 128;
idx++;
}
}

return DHTLIB_OK;
}
//
// END OF FILE
//
72 changes: 72 additions & 0 deletions dht.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
//
// FILE: dht.h
// AUTHOR: Rob Tillaart
// VERSION: 0.2.5
// PURPOSE: DHT Temperature & Humidity Sensor library for Arduino
// URL: https://github.com/RobTillaart/DHTstable
//
// HISTORY:
// see dht.cpp file
//

#ifndef dht_h
#define dht_h

#if ARDUINO < 100
#include <WProgram.h>
#else
#include <Arduino.h>
#endif

#define DHT_LIB_VERSION "0.2.5 - dhtstable"

const int DHTLIB_OK = 0;
const int DHTLIB_ERROR_CHECKSUM = -1;
const int DHTLIB_ERROR_TIMEOUT = -2;
const int DHTLIB_INVALID_VALUE = -999;

const int DHTLIB_DHT11_WAKEUP = 18;
const int DHTLIB_DHT_WAKEUP = 1;

// max timeout is 100usec.
// For a 16Mhz proc that is max 1600 clock cycles
// loops using TIMEOUT use at least 4 clock cycli
// so 100 us takes max 400 loops
// so by dividing F_CPU by 40000 we "fail" as fast as possible
const int DHTLIB_TIMEOUT = (F_CPU/40000);

class dht
{
public:
// return values:
// DHTLIB_OK
// DHTLIB_ERROR_CHECKSUM
// DHTLIB_ERROR_TIMEOUT
int read11(uint8_t pin); // DHT11 & DHT12
int read(uint8_t pin); // DHT22

inline int read12(uint8_t pin) { return read11(pin); }; // ok
inline int read21(uint8_t pin) { return read(pin); }; // ok
inline int read22(uint8_t pin) { return read(pin); }; // ok
inline int read33(uint8_t pin) { return read(pin); }; // ok
inline int read44(uint8_t pin) { return read(pin); }; // ok
inline int read2301(uint8_t pin) { return read(pin); }; // ok
inline int read2302(uint8_t pin) { return read(pin); }; // ok
inline int read2320(uint8_t pin) { return read(pin); }; //.ok
inline int read2322(uint8_t pin) { return read(pin); }; // ok

float humidity;
float temperature;

bool getDisableIRQ() { return _disableIRQ; };
void setDisableIRQ(bool b ) { _disableIRQ = b; };

private:
uint8_t bits[5]; // buffer to receive data
int _readSensor(uint8_t pin, uint8_t wakeupDelay);
bool _disableIRQ = false;
};
#endif
//
// END OF FILE
//
56 changes: 56 additions & 0 deletions examples/dht11_test/dht11_test.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
//
// FILE: dht11_test.ino
// AUTHOR: Rob Tillaart
// VERSION: 0.1.2
// PURPOSE: DHT library test sketch for DHT11 && Arduino
// URL: https://github.com/RobTillaart/DHTstable
//
// HISTORY:
// 0.1.2 add URL in header

#include <dht.h>

dht DHT;

#define DHT11_PIN 5

void setup()
{
Serial.begin(115200);
Serial.println("DHT TEST PROGRAM ");
Serial.print("LIBRARY VERSION: ");
Serial.println(DHT_LIB_VERSION);
Serial.println();
Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
}

void loop()
{
// READ DATA
Serial.print("DHT11, \t");
int chk = DHT.read11(DHT11_PIN);
switch (chk)
{
case DHTLIB_OK:
Serial.print("OK,\t");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.print("Checksum error,\t");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.print("Time out error,\t");
break;
default:
Serial.print("Unknown error,\t");
break;
}
// DISPLAY DATA
Serial.print(DHT.humidity, 1);
Serial.print(",\t");
Serial.println(DHT.temperature, 1);

delay(2000);
}
//
// END OF FILE
//
56 changes: 56 additions & 0 deletions examples/dht12_test/dht12_test.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
//
// FILE: dht12_test.ino
// AUTHOR: Rob Tillaart
// VERSION: 0.1.1
// PURPOSE: DHT library test sketch for DHT12 && Arduino
// URL: https://github.com/RobTillaart/DHTstable
//
// HISTORY:
// 0.1.1 add URL in header

#include <dht.h>

dht DHT;

#define DHT12_PIN 5

void setup()
{
Serial.begin(115200);
Serial.println("DHT TEST PROGRAM ");
Serial.print("LIBRARY VERSION: ");
Serial.println(DHT_LIB_VERSION);
Serial.println();
Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
}

void loop()
{
// READ DATA
Serial.print("DHT12, \t");
int chk = DHT.read12(DHT12_PIN);
switch (chk)
{
case DHTLIB_OK:
Serial.print("OK,\t");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.print("Checksum error,\t");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.print("Time out error,\t");
break;
default:
Serial.print("Unknown error,\t");
break;
}
// DISPLAY DATA
Serial.print(DHT.humidity, 1);
Serial.print(",\t");
Serial.println(DHT.temperature, 1);

delay(2000);
}
//
// END OF FILE
//
Loading

0 comments on commit d4477fa

Please sign in to comment.