diff options
author | Florian Pritz <bluewind@xinu.at> | 2014-06-18 11:48:46 +0200 |
---|---|---|
committer | Florian Pritz <bluewind@xinu.at> | 2014-06-18 11:48:46 +0200 |
commit | 4c6444650da3a0aa1e2e9b00f42cc4e2af057fe6 (patch) | |
tree | d245d54eec7575d06d69d9a54598ef828779a2ed /lib/DHT_sensor_library | |
download | templogger-v2-4c6444650da3a0aa1e2e9b00f42cc4e2af057fe6.tar.gz templogger-v2-4c6444650da3a0aa1e2e9b00f42cc4e2af057fe6.tar.xz |
initial commit
Signed-off-by: Florian Pritz <bluewind@xinu.at>
Diffstat (limited to 'lib/DHT_sensor_library')
-rw-r--r-- | lib/DHT_sensor_library/DHT.cpp | 161 | ||||
-rw-r--r-- | lib/DHT_sensor_library/DHT.h | 39 | ||||
-rw-r--r-- | lib/DHT_sensor_library/README.txt | 3 | ||||
-rw-r--r-- | lib/DHT_sensor_library/examples/DHTtester/DHTtester.pde | 44 |
4 files changed, 247 insertions, 0 deletions
diff --git a/lib/DHT_sensor_library/DHT.cpp b/lib/DHT_sensor_library/DHT.cpp new file mode 100644 index 0000000..efa1d39 --- /dev/null +++ b/lib/DHT_sensor_library/DHT.cpp @@ -0,0 +1,161 @@ +/* DHT library + +MIT license +written by Adafruit Industries +*/ + +#include "DHT.h" + +DHT::DHT(uint8_t pin, uint8_t type, uint8_t count) { + _pin = pin; + _type = type; + _count = count; + firstreading = true; +} + +void DHT::begin(void) { + // set up the pins! + pinMode(_pin, INPUT); + digitalWrite(_pin, HIGH); + _lastreadtime = 0; +} + +//boolean S == Scale. True == Farenheit; False == Celcius +float DHT::readTemperature(bool S) { + float f; + + if (read()) { + switch (_type) { + case DHT11: + f = data[2]; + if(S) + f = convertCtoF(f); + + return f; + case DHT22: + case DHT21: + f = data[2] & 0x7F; + f *= 256; + f += data[3]; + f /= 10; + if (data[2] & 0x80) + f *= -1; + if(S) + f = convertCtoF(f); + + return f; + } + } + Serial.print("Read fail"); + return NAN; +} + +float DHT::convertCtoF(float c) { + return c * 9 / 5 + 32; +} + +float DHT::readHumidity(void) { + float f; + if (read()) { + switch (_type) { + case DHT11: + f = data[0]; + return f; + case DHT22: + case DHT21: + f = data[0]; + f *= 256; + f += data[1]; + f /= 10; + return f; + } + } + Serial.print("Read fail"); + return NAN; +} + + +boolean DHT::read(void) { + uint8_t laststate = HIGH; + uint8_t counter = 0; + uint8_t j = 0, i; + unsigned long currenttime; + + // pull the pin high and wait 250 milliseconds + digitalWrite(_pin, HIGH); + delay(250); + + currenttime = millis(); + if (currenttime < _lastreadtime) { + // ie there was a rollover + _lastreadtime = 0; + } + if (!firstreading && ((currenttime - _lastreadtime) < 2000)) { + return true; // return last correct measurement + //delay(2000 - (currenttime - _lastreadtime)); + } + firstreading = false; + /* + Serial.print("Currtime: "); Serial.print(currenttime); + Serial.print(" Lasttime: "); Serial.print(_lastreadtime); + */ + _lastreadtime = millis(); + + data[0] = data[1] = data[2] = data[3] = data[4] = 0; + + // now pull it low for ~20 milliseconds + pinMode(_pin, OUTPUT); + digitalWrite(_pin, LOW); + delay(20); + cli(); + digitalWrite(_pin, HIGH); + delayMicroseconds(40); + pinMode(_pin, INPUT); + + // read in timings + for ( i=0; i< MAXTIMINGS; i++) { + counter = 0; + while (digitalRead(_pin) == laststate) { + counter++; + delayMicroseconds(1); + if (counter == 255) { + break; + } + } + laststate = digitalRead(_pin); + + if (counter == 255) break; + + // ignore first 3 transitions + if ((i >= 4) && (i%2 == 0)) { + // shove each bit into the storage bytes + data[j/8] <<= 1; + if (counter > _count) + data[j/8] |= 1; + j++; + } + + } + + sei(); + + /* + Serial.println(j, DEC); + Serial.print(data[0], HEX); Serial.print(", "); + Serial.print(data[1], HEX); Serial.print(", "); + Serial.print(data[2], HEX); Serial.print(", "); + Serial.print(data[3], HEX); Serial.print(", "); + Serial.print(data[4], HEX); Serial.print(" =? "); + Serial.println(data[0] + data[1] + data[2] + data[3], HEX); + */ + + // check we read 40 bits and that the checksum matches + if ((j >= 40) && + (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) ) { + return true; + } + + + return false; + +} diff --git a/lib/DHT_sensor_library/DHT.h b/lib/DHT_sensor_library/DHT.h new file mode 100644 index 0000000..1c78c87 --- /dev/null +++ b/lib/DHT_sensor_library/DHT.h @@ -0,0 +1,39 @@ +#ifndef DHT_H
+#define DHT_H
+#if ARDUINO >= 100
+ #include "Arduino.h"
+#else
+ #include "WProgram.h"
+#endif
+
+/* DHT library
+
+MIT license
+written by Adafruit Industries
+*/
+
+// how many timing transitions we need to keep track of. 2 * number bits + extra
+#define MAXTIMINGS 85
+
+#define DHT11 11
+#define DHT22 22
+#define DHT21 21
+#define AM2301 21
+
+class DHT {
+ private:
+ uint8_t data[6];
+ uint8_t _pin, _type, _count;
+ boolean read(void);
+ unsigned long _lastreadtime;
+ boolean firstreading;
+
+ public:
+ DHT(uint8_t pin, uint8_t type, uint8_t count=6);
+ void begin(void);
+ float readTemperature(bool S=false);
+ float convertCtoF(float);
+ float readHumidity(void);
+
+};
+#endif
diff --git a/lib/DHT_sensor_library/README.txt b/lib/DHT_sensor_library/README.txt new file mode 100644 index 0000000..4dfcbab --- /dev/null +++ b/lib/DHT_sensor_library/README.txt @@ -0,0 +1,3 @@ +This is an Arduino library for the DHT series of low cost temperature/humidity sensors. + +To download. click the DOWNLOADS button in the top right corner, rename the uncompressed folder DHT. Check that the DHT folder contains DHT.cpp and DHT.h. Place the DHT library folder your <arduinosketchfolder>/libraries/ folder. You may need to create the libraries subfolder if its your first library. Restart the IDE.
\ No newline at end of file diff --git a/lib/DHT_sensor_library/examples/DHTtester/DHTtester.pde b/lib/DHT_sensor_library/examples/DHTtester/DHTtester.pde new file mode 100644 index 0000000..8f40790 --- /dev/null +++ b/lib/DHT_sensor_library/examples/DHTtester/DHTtester.pde @@ -0,0 +1,44 @@ +// Example testing sketch for various DHT humidity/temperature sensors +// Written by ladyada, public domain + +#include "DHT.h" + +#define DHTPIN 2 // what pin we're connected to + +// Uncomment whatever type you're using! +//#define DHTTYPE DHT11 // DHT 11 +#define DHTTYPE DHT22 // DHT 22 (AM2302) +//#define DHTTYPE DHT21 // DHT 21 (AM2301) + +// Connect pin 1 (on the left) of the sensor to +5V +// Connect pin 2 of the sensor to whatever your DHTPIN is +// Connect pin 4 (on the right) of the sensor to GROUND +// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor + +DHT dht(DHTPIN, DHTTYPE); + +void setup() { + Serial.begin(9600); + Serial.println("DHTxx test!"); + + dht.begin(); +} + +void loop() { + // Reading temperature or humidity takes about 250 milliseconds! + // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) + float h = dht.readHumidity(); + float t = dht.readTemperature(); + + // check if returns are valid, if they are NaN (not a number) then something went wrong! + if (isnan(t) || isnan(h)) { + Serial.println("Failed to read from DHT"); + } else { + Serial.print("Humidity: "); + Serial.print(h); + Serial.print(" %\t"); + Serial.print("Temperature: "); + Serial.print(t); + Serial.println(" *C"); + } +} |