DHT11 数字温湿度传感器

来自Jack's Lab
(版本间的差异)
跳转到: 导航, 搜索
(参考)
第1行: 第1行:
 
== 概述 ==
 
== 概述 ==
 +
 +
<br><br>
 +
 +
== 库 ==
 +
 +
<source lang=cpp>
 +
//
 +
// FILE: dht11.cpp
 +
// VERSION: 0.4.1
 +
// 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
 +
// Mod by Rob Tillaart - Version 0.4 (17/03/2012)
 +
// + added 1.0 support
 +
// Mod by Rob Tillaart - Version 0.4.1 (19/05/2012)
 +
// + added error codes
 +
//
 +
 +
#include "dht11.h"
 +
 +
// Return values:
 +
// DHTLIB_OK
 +
// DHTLIB_ERROR_CHECKSUM
 +
// DHTLIB_ERROR_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 DHTLIB_ERROR_TIMEOUT;
 +
 +
loopCnt = 10000;
 +
while(digitalRead(pin) == HIGH)
 +
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;
 +
 +
// 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 DHTLIB_ERROR_TIMEOUT;
 +
 +
unsigned long t = micros();
 +
 +
loopCnt = 10000;
 +
while(digitalRead(pin) == HIGH)
 +
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;
 +
 +
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 DHTLIB_ERROR_CHECKSUM;
 +
return DHTLIB_OK;
 +
}
 +
 +
 +
//
 +
// FILE: dht11.h
 +
// VERSION: 0.4.1
 +
// 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://playground.arduino.cc/Main/DHT11Lib
 +
//
 +
// HISTORY:
 +
// George Hadjikyriacou - Original version
 +
// see dht.cpp file
 +
//
 +
 +
#ifndef dht11_h
 +
#define dht11_h
 +
 +
#if defined(ARDUINO) && (ARDUINO >= 100)
 +
#include <Arduino.h>
 +
#else
 +
#include <WProgram.h>
 +
#endif
 +
 +
#define DHT11LIB_VERSION "0.4.1"
 +
 +
#define DHTLIB_OK 0
 +
#define DHTLIB_ERROR_CHECKSUM -1
 +
#define DHTLIB_ERROR_TIMEOUT -2
 +
 +
class dht11
 +
{
 +
public:
 +
    int read(int pin);
 +
int humidity;
 +
int temperature;
 +
};
 +
#endif
 +
</source>
  
 
<br><br>
 
<br><br>

2015年7月17日 (五) 17:15的版本

1 概述



2 库

//
// FILE: dht11.cpp
// VERSION: 0.4.1
// 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
// Mod by Rob Tillaart - Version 0.4 (17/03/2012)
// + added 1.0 support
// Mod by Rob Tillaart - Version 0.4.1 (19/05/2012)
// + added error codes
//

#include "dht11.h"

// Return values:
// DHTLIB_OK
// DHTLIB_ERROR_CHECKSUM
// DHTLIB_ERROR_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 DHTLIB_ERROR_TIMEOUT;

	loopCnt = 10000;
	while(digitalRead(pin) == HIGH)
		if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;

	// 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 DHTLIB_ERROR_TIMEOUT;

		unsigned long t = micros();

		loopCnt = 10000;
		while(digitalRead(pin) == HIGH)
			if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;

		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 DHTLIB_ERROR_CHECKSUM;
	return DHTLIB_OK;
}


// 
// FILE: dht11.h
// VERSION: 0.4.1
// 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://playground.arduino.cc/Main/DHT11Lib
//
// HISTORY:
// George Hadjikyriacou - Original version
// see dht.cpp file
// 

#ifndef dht11_h
#define dht11_h

#if defined(ARDUINO) && (ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endif

#define DHT11LIB_VERSION "0.4.1"

#define DHTLIB_OK				0
#define DHTLIB_ERROR_CHECKSUM	-1
#define DHTLIB_ERROR_TIMEOUT	-2

class dht11
{
public:
    int read(int pin);
	int humidity;
	int temperature;
};
#endif



3 参考

























个人工具
名字空间

变换
操作
导航
工具箱