Last active
August 29, 2015 14:23
-
-
Save volca/757cf0f787449cc1d1ce to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* YourDuino.com Example Software Sketch | |
DHT11 Humidity and Temperature Sensor test | |
Credits: Rob Tillaart | |
http://arduino-direct.com/sunshop/index.php?l=product_detail&p=162 | |
terry@yourduino.com */ | |
/*-----( Import needed libraries )-----*/ | |
#include <dht11.h> | |
/*-----( Declare objects )-----*/ | |
dht11 DHT11; | |
/*-----( Declare Constants, Pin Numbers )-----*/ | |
#define DHT11PIN 2 | |
// GROUP | |
#define MAJOR 100 | |
#define MINOR 1 | |
int flag = 0; | |
void setup() /*----( SETUP: RUNS ONCE )----*/ | |
{ | |
Serial.begin(9600); | |
Serial1.begin(9600); | |
//while(!Serial); | |
Serial.println("DHT11 TEST PROGRAM "); | |
Serial.print("LIBRARY VERSION: "); | |
Serial.println(DHT11LIB_VERSION); | |
Serial.println(); | |
Serial1.println("AT+ROLE0"); | |
delay(100); | |
// Set proximity UUID for sensors | |
Serial1.println("AT+PUID06742A694C2C4359BBFE122D05B6DCBF"); | |
delay(100); | |
// Set sensor id | |
Serial1.print("AT+MAJR"); | |
Serial1.print(MAJOR); | |
delay(100); | |
Serial1.print("AT+MINR"); | |
Serial1.print(MINOR); | |
delay(100); | |
Serial1.println("AT+RESET"); | |
}/*--(end setup )---*/ | |
void loop() /*----( LOOP: RUNS CONSTANTLY )----*/ | |
{ | |
Serial.println("\n"); | |
int chk = DHT11.read(DHT11PIN); | |
Serial.print("Read sensor: "); | |
switch (chk) | |
{ | |
case 0: Serial.println("OK"); break; | |
case -1: Serial.println("Checksum error"); break; | |
case -2: Serial.println("Time out error"); break; | |
default: Serial.println("Unknown error"); break; | |
} | |
Serial.print("Humidity (%): "); | |
Serial.println((float)DHT11.humidity, 2); | |
Serial.print("Temperature (oC): "); | |
Serial.println((float)DHT11.temperature, 2); | |
Serial.print("Temperature (oF): "); | |
Serial.println(Fahrenheit(DHT11.temperature), 2); | |
Serial.print("Temperature (K): "); | |
Serial.println(Kelvin(DHT11.temperature), 2); | |
Serial.print("Dew Point (oC): "); | |
Serial.println(dewPoint(DHT11.temperature, DHT11.humidity)); | |
Serial.print("Dew PointFast (oC): "); | |
Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity)); | |
flag = !flag; | |
if (flag) { | |
int minor = DHT11.humidity; | |
minor = (minor << 8) + DHT11.temperature; | |
Serial1.print("AT+MINR"); | |
Serial1.println(minor, DEC); | |
delay(100); | |
Serial1.println("AT+PUIDE2C56DB5DFFB48D2B060D0F5A71096E1"); | |
} else { | |
Serial1.println("AT+PUID06742A694C2C4359BBFE122D05B6DCBF"); | |
// Set sensor id | |
delay(100); | |
Serial1.print("AT+MINR"); | |
Serial1.print(MINOR); | |
} | |
delay(100); | |
Serial1.println("AT+RESET"); | |
delay(2000); | |
}/* --(end main loop )-- */ | |
/*-----( Declare User-written Functions )-----*/ | |
// | |
//Celsius to Fahrenheit conversion | |
double Fahrenheit(double celsius) | |
{ | |
return 1.8 * celsius + 32; | |
} | |
//Celsius to Kelvin conversion | |
double Kelvin(double celsius) | |
{ | |
return celsius + 273.15; | |
} | |
// dewPoint function NOAA | |
// reference: http://wahiduddin.net/calc/density_algorithms.htm | |
double dewPoint(double celsius, double humidity) | |
{ | |
double A0= 373.15/(273.15 + celsius); | |
double SUM = -7.90298 * (A0-1); | |
SUM += 5.02808 * log10(A0); | |
SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ; | |
SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ; | |
SUM += log10(1013.246); | |
double VP = pow(10, SUM-3) * humidity; | |
double T = log(VP/0.61078); // temp var | |
return (241.88 * T) / (17.558-T); | |
} | |
// delta max = 0.6544 wrt dewPoint() | |
// 5x faster than dewPoint() | |
// reference: http://en.wikipedia.org/wiki/Dew_point | |
double dewPointFast(double celsius, double humidity) | |
{ | |
double a = 17.271; | |
double b = 237.7; | |
double temp = (a * celsius) / (b + celsius) + log(humidity/100); | |
double Td = (b * temp) / (a - temp); | |
return Td; | |
} | |
/* ( THE END ) */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// FILE: dht11.cpp | |
// VERSION: 0.3.2 | |
// PURPOSE: DHT11 Temperature & Humidity Sensor library for Arduino | |
// LICENSE: GPL v3 (http://www.gnu.org/licenses/gpl.html) | |
// | |
// DATASHEET: http://www.micro4you.com/files/sensor/DHT11.pdf | |
// | |
// HISTORY: | |
// George Hadjikyriacou - Original version (??) | |
// Mod by SimKard - Version 0.2 (24/11/2010) | |
// Mod by Rob Tillaart - Version 0.3 (28/03/2011) | |
// + added comments | |
// + removed all non DHT11 specific code | |
// + added references | |
// | |
#include "dht11.h" | |
// returnvalues: | |
// 0 : OK | |
// -1 : checksum error | |
// -2 : timeout | |
int dht11::read(int pin) | |
{ | |
// BUFFER TO RECEIVE | |
uint8_t bits[5]; | |
uint8_t cnt = 7; | |
uint8_t idx = 0; | |
// EMPTY BUFFER | |
for (int i=0; i< 5; i++) bits[i] = 0; | |
// REQUEST SAMPLE | |
pinMode(pin, OUTPUT); | |
digitalWrite(pin, LOW); | |
delay(18); | |
digitalWrite(pin, HIGH); | |
delayMicroseconds(40); | |
pinMode(pin, INPUT); | |
// ACKNOWLEDGE or TIMEOUT | |
unsigned int loopCnt = 10000; | |
while(digitalRead(pin) == LOW) | |
if (loopCnt-- == 0) return -2; | |
loopCnt = 10000; | |
while(digitalRead(pin) == HIGH) | |
if (loopCnt-- == 0) return -2; | |
// READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT | |
for (int i=0; i<40; i++) | |
{ | |
loopCnt = 10000; | |
while(digitalRead(pin) == LOW) | |
if (loopCnt-- == 0) return -2; | |
unsigned long t = micros(); | |
loopCnt = 10000; | |
while(digitalRead(pin) == HIGH) | |
if (loopCnt-- == 0) return -2; | |
if ((micros() - t) > 40) bits[idx] |= (1 << cnt); | |
if (cnt == 0) // next byte? | |
{ | |
cnt = 7; // restart at MSB | |
idx++; // next byte! | |
} | |
else cnt--; | |
} | |
// WRITE TO RIGHT VARS | |
// as bits[1] and bits[3] are allways zero they are omitted in formulas. | |
humidity = bits[0]; | |
temperature = bits[2]; | |
uint8_t sum = bits[0] + bits[2]; | |
if (bits[4] != sum) return -1; | |
return 0; | |
} | |
// | |
// END OF FILE | |
// |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// FILE: dht11.h | |
// VERSION: 0.3.2 | |
// PURPOSE: DHT11 Temperature & Humidity Sensor library for Arduino | |
// LICENSE: GPL v3 (http://www.gnu.org/licenses/gpl.html) | |
// | |
// DATASHEET: http://www.micro4you.com/files/sensor/DHT11.pdf | |
// | |
// URL: http://arduino.cc/playground/Main/DHT11Lib | |
// | |
// HISTORY: | |
// George Hadjikyriacou - Original version | |
// see dht.cpp file | |
// *** Terry King: Changed include Arduino.h for 1.0x | |
// include core Wiring API and now Arduino | |
#if defined(ARDUINO) && ARDUINO >= 100 | |
#include "Arduino.h" | |
#else | |
#include "WProgram.h" | |
#endif | |
#ifndef dht11_h | |
#define dht11_h | |
#define DHT11LIB_VERSION "0.3.2" | |
class dht11 | |
{ | |
public: | |
int read(int pin); | |
int humidity; | |
int temperature; | |
}; | |
#endif | |
// | |
// END OF FILE | |
// |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment