dht11温湿度传感器库文件

每次要用到dht11给学弟学妹演示arduino及基础用法时最常用的就是dht11了,常见而且便宜,测的温湿度还能立即感受变化,可是dht11arduino自身是没有这个库的,每次都得在网上找半天,所以写篇记录下

首先简历一个dht11文件夹,保存在arduino安装目录的libraries路径下
里面包括两个文件,一个是头文件,一个是c++文件
代码如下

dht11.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;
}
//
// END OF FILE
//
dht11.h
// 
//    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
//
// END OF FILE
//

实例

    double Fahrenheit(double celsius)   
    {  
            return 1.8 * celsius + 32;  
    }    //摄氏温度度转化为华氏温度  
      
    double Kelvin(double celsius)  
    {  
            return celsius + 273.15;  
    }     //摄氏温度转化为开氏温度  
      
    // 露点(点在此温度时,空气饱和并产生露珠)  
    // 参考: 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);  
    }  
      
    // 快速计算露点,速度是5倍dewPoint()  
    // 参考: 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;  
    }  
      
    #include <dht11.h>  
      
    dht11 DHT11;  
      
    #define DHT11PIN 2  
    void setup()  
    {  
      Serial.begin(9600);  
      Serial.println("DHT11 TEST PROGRAM ");  
      Serial.print("LIBRARY VERSION: ");  
      Serial.println(DHT11LIB_VERSION);  
      Serial.println();   
    }  
      
    void loop()  
    {  
      Serial.println("\n");  
      
      int chk = DHT11.read(DHT11PIN);  
      
      Serial.print("Read sensor: ");  
      switch (chk)  
      {  
        case DHTLIB_OK:   
                    Serial.println("OK");   
                    break;  
        case DHTLIB_ERROR_CHECKSUM:   
                    Serial.println("Checksum error");   
                    break;  
        case DHTLIB_ERROR_TIMEOUT:   
                    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));  
      
      delay(2000);  
    }  
  • 15
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值