summaryrefslogtreecommitdiffstats
path: root/lib/DHT_sensor_library
diff options
context:
space:
mode:
Diffstat (limited to 'lib/DHT_sensor_library')
-rw-r--r--lib/DHT_sensor_library/DHT.cpp161
-rw-r--r--lib/DHT_sensor_library/DHT.h39
-rw-r--r--lib/DHT_sensor_library/README.txt3
-rw-r--r--lib/DHT_sensor_library/examples/DHTtester/DHTtester.pde44
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");
+ }
+}