//
//文件:dht11.cpp
//版本:0.4.1
//目的:用于Arduino的DHT11温度和湿度传感器库
// LICENSE:GPL v3(http://www.gnu.org/licenses/gpl.html)
//
//数据表:http://www.micro4you.com/files/sensor/DHT11.pdf
//
//历史:
// George Hadjikyriacou - 原始版本(??)
// Mod by SimKard - 版本0.2(24/11/2010)
// Rob Tillaart的Mod - 版本0.3(28/03/2011)
// +添加了评论
// +删除了所有非DHT11特定代码
// +添加了引用
// Rob Tillaart的Mod - 版本0.4(17/03/2012)
// +添加1.0支持
// Rob Tillaart的Mod - 版本0.4.1(19/05/2012)
// +添加了错误代码
//
#include“dht11.h”
//返回值:
// DHTLIB_OK
// DHTLIB_ERROR_CHECKSUM
// DHTLIB_ERROR_TIMEOUT
int dht11 :: read(int pin)
{
// BUFFER TO RECEIVE
uint8_t位[5];
uint8_t cnt = 7;
uint8_t idx = 0;
// EMPTY BUFFER
for(int i = 0; i <5; i ++)bits [i] = 0;
//请求样本
pinMode(引脚,OUTPUT);
digitalWrite(pin,LOW);
延迟(18);
digitalWrite(pin,HIGH);
delayMicroseconds(40);
pinMode(引脚,INPUT);
//确认或超时
unsigned int loopCnt = 10000;
while(digitalRead(pin)== LOW)
if(loopCnt-- == 0)返回DHTLIB_ERROR_TIMEOUT;
loopCnt = 10000;
while(digitalRead(pin)== HIGH)
if(loopCnt-- == 0)返回DHTLIB_ERROR_TIMEOUT;
// READ OUTPUT - 40 BITS => 5 BYTES或TIMEOUT
for(int i = 0; i <40; i ++)
{
loopCnt = 10000;
while(digitalRead(pin)== LOW)
if(loopCnt-- == 0)返回DHTLIB_ERROR_TIMEOUT;
unsigned long t = micros();
loopCnt = 10000;
while(digitalRead(pin)== HIGH)
if(loopCnt-- == 0)返回DHTLIB_ERROR_TIMEOUT;
if((micros() - t)> 40)bits [idx] | =(1 << cnt);
if(cnt == 0)//下一个字节?
{
cnt = 7; //在MSB重新启动
IDX ++; //下一个字节!
}
别的cnt--;
}
//写入正确的VARS
//作为位[1]和位[3]总是为零,它们在公式中被省略。
湿度=位[0];
温度=位[2];
uint8_t sum = bits [0] + bits [2];
if(bits [4]!= sum)返回DHTLIB_ERROR_CHECKSUM;
返回DHTLIB_OK;
}
//
//文件结尾
//