nilxy 发表于 2010-7-19 21:00:35

温湿度传感器DHT11程序+试用情况

注册好几天了,都没有审核通过,难道要先发个帖子才行?

最近在做温湿度采集系统方面的东西,别的不说,就说说温湿度传感器这块,测温度想必不用多说了,坛子里的人_大部分都用过18B20,可以精确到0.1度,而要测湿度就没那么容易了,18B20之所以好用,是因为它是数字器件,不需要配合测量电路就可以完成测量任务,而现在市场上的大部分湿度传感器要么是湿敏电阻、半导体湿敏传感器,要么就是电容式的湿度传感器,这些都要和外围电路配合使用。

国产的DHT11温湿度传感器是数字式器件,测量范围:湿度20-90%RH,温度0-50℃,精度:湿度±5%RH,温度±2℃,分辨率:1,可见,对于一般性的应用领域还是可以满足要求的,最主要的是价格才7元左右。

下面是我调通的DHT11代码,用的是Mega8,供大家参考

DHT11.h

#ifndef __DHT11_h__
#define __DHT11_h__


unsigned char get_DHT11_value(void);
//get_DHT11_value()的返回值为0表示出错(DHT11未连接或损坏)
//temperature存储温度,高8位为温度整数部分,低8位保留为0
//humidity存储湿度,高8位为湿度整数部分,低8位保留为0

#endif







DHT11.c

#include "DHT11.h"
#include <iom16v.h>
#include <macros.h>
#include "delay.h"


#define DATA_DIR_OUTPUT                DDRC|=BIT(PC0)
#define DATA_DIR_INPUT                DDRC&=~BIT(PC0)
#define DATA_H                        PORTC|=BIT(PC0)
#define DATA_L                        PORTC&=~BIT(PC0)
#define DATA_IN                        ((PINC & BIT(PC0)) >> PC0)


#define delay_30_ms()                delay_ms(30)
#define delay_30_us()                delay_10us(3)
#define delay_10_us()                delay_10us(1)


unsigned int temperature;
unsigned int humidity;


unsigned char get_DHT11_value(void)
{       
        unsigned int bit;
        unsigned char p=0,time_count;
       
        temperature=0x0000;
        humidity=0x0000;
        bit=0x8000;
       
        DATA_L;
        DATA_DIR_OUTPUT;
        delay_30_ms();
       
        DATA_H;
        DATA_DIR_INPUT;
        delay_30_us();
        delay_30_us();
       
        //无应答信号,退出
        if(DATA_IN!=0)                              return 0;
       
        //等待电平变高,设置200us超时控制
        time_count=0;
        while(DATA_IN==0)
        {       
                delay_10_us();
                if(++time_count==20)        return 0;
        }
       
        //等待电平变低,设置150us超时控制
        time_count=0;
        while(DATA_IN==1)
        {       
                delay_10_us();
                if(++time_count==15)        return 0;
        }
       
        //数据开始
        while(p!=2)
        {       
                //低电平宽度50us
                //等待电平变高,设置100us超时控制
                time_count=0;
                while(DATA_IN==0)
                {       
                        delay_10_us();
                        if(++time_count==10) return 0;
                }
               
                time_count=0;
                do
                {        
                        delay_10_us();
                        time_count++;
                        if(time_count==10)       return 0;
                }while(DATA_IN==1);
               
                //若高电平超过50us,说明数据位为1,否则为0
                if(time_count>=5)
                {       
                        if(p==0)        humidity|=bit;
                        if(p==1)        temperature|=bit;
                }
               
                bit>>=1;
                //1字节结束
                if(bit==0x0000)
                {       
                        p++;
                        bit=0x8000;
                }
        }
       
        return 1;
}


使用的时候只要修改DHT11.c里面的有关接口DATA的宏定义,以及3个delay函数就可以了。

nilxy 发表于 2010-7-19 21:24:04

总体感觉还不错,价位低、好用,厂商说的温度测量范围是0-60度,我用风枪对着它吹,发现读到的温度达到60度就不动了,湿度被我吹到了1%,但发现,等了近一个小时,湿度才慢慢回到室内的60%

这张图是刚刚这十几分钟采集到的数据,2s采集一次,传感器放在室外,用无线电传送的数据,今天徐州的天气烈日当空而后是小雨绵绵,所以现在的湿度很高。

http://cache.amobbs.com/bbs_upload782111/files_31/ourdev_569260.jpg
2010.7.19 21:00 (原文件名:未命名.jpg)

xiaobao9528 发表于 2010-7-23 16:50:32

回复【1楼】nilxy
-----------------------------------------------------------------------

你是用什么显示的 ??

nilxy 发表于 2010-7-25 18:09:24

回复【2楼】xiaobao9528
-----------------------------------------------------------------------
excel

junqinghaha 发表于 2010-8-12 23:06:11

您好,DHT11的时序要求不是很严格吧??
我用winavrgcc自带的延时函数可以吧??

nilxy 发表于 2010-9-14 11:29:34

回复【4楼】junqinghaha
您好,dht11的时序要求不是很严格吧??
我用winavrgcc自带的延时函数可以吧??
-----------------------------------------------------------------------

时序只要在它容许的范围内就没问题,当然就可以用编译器自带的延时函数啦。
代码里面延迟delay_30_ms是任意的,资料上说只要大于18毫秒就行。
我根据DHT11的时序,提取两个最基本的时间单位:30us和10us,这样方便程序移植,我用ICC没自带延时函数,一般就用示波器测量,修改delay里面的参数,达到延时要求的。

heero 发表于 2010-9-29 17:11:57

太好了我喜欢

lixupeng 发表于 2011-5-30 18:02:10

学习!!!

tangwei039 发表于 2011-12-2 23:56:41

mark

ljmdzyx 发表于 2012-1-3 23:57:19

马克

ljmdzyx 发表于 2012-1-3 23:58:02

马克

babygs 发表于 2012-1-28 19:35:01

mark

aabbc 发表于 2012-1-28 21:17:17

mark

flywater 发表于 2012-1-29 18:05:20

支持LZ

pcalling 发表于 2012-2-10 13:56:30

不太明白数据证明采集到得,只看见
if(time_count>=5)
{
if(p==0) humidity|=bit;
if(p==1) temperature|=bit;
}
难道采集到的只能是0x8000或者0x0000?

ddcchh 发表于 2012-11-21 12:25:04

太好了我喜欢

gxy508 发表于 2012-12-1 20:23:16

留个记号,以后用

秋之舞者 发表于 2012-12-7 21:27:01

怎样用示波器来检查DHT11是不是检测到啊

秋之舞者 发表于 2012-12-7 21:27:17

怎样用示波器来检查DHT11是不是检测到???

秋之舞者 发表于 2012-12-7 21:27:39

怎样用示波器来检查DHT11是不是检测到信号???

秋之舞者 发表于 2012-12-7 21:28:30

怎样用示波器来检查DHT11是否检测到信号啊

jz701209李 发表于 2013-4-10 09:20:12

学习一下....

ouredif 发表于 2013-5-21 09:36:05

正好用到 thx

zhangyidao 发表于 2013-5-21 09:39:44

前两天玩了下,发现湿度误差很大,有20-30%。想换个精度高的玩玩。

守望者2012 发表于 2013-5-24 00:27:52

mark!{:smile:}{:smile:}

zljcat3721 发表于 2013-5-24 16:36:09

我用的时候发现温度正常,但湿度相差比较大,与26楼的情况差不多

guimeng 发表于 2013-7-29 09:39:45

{:lol:}求stm32的DHT11程序,Delay怎么调都为0

lghtjpu 发表于 2013-7-29 09:51:51

nilxy 发表于 2010-7-19 21:24 static/image/common/back.gif
总体感觉还不错,价位低、好用,厂商说的温度测量范围是0-60度,我用风枪对着它吹,发现读到的温度达到60度 ...

温湿度的曲线颜色搞反了吧

renpeng009 发表于 2013-7-29 10:11:29

guimeng 发表于 2013-7-29 09:39 static/image/common/back.gif
求stm32的DHT11程序,Delay怎么调都为0

找我的帖子吧,里面有你要的

guimeng 发表于 2013-7-30 10:26:41

renpeng009 发表于 2013-7-29 10:11 static/image/common/back.gif
找我的帖子吧,里面有你要的

我移植了你的程序,但是好像是卡在死循环里面了


                while(!rDHT11);
                while(rDHT11);

renpeng009 发表于 2013-7-30 12:43:29

guimeng 发表于 2013-7-30 10:26 static/image/common/back.gif
我移植了你的程序,但是好像是卡在死循环里面了




IO配置是否与我的一致?
外接上拉电阻没?
DHT11用的是几V?
上拉用的是几V?

hgjdwjz699 发表于 2013-8-1 11:49:45

价格还可以,不能测负温,有点不足。

鲜衣怒马 发表于 2013-11-5 22:41:00

马克,有时间仔细看看

Arvin_lu 发表于 2014-9-13 07:50:37

参考一下。。。。。

寻梦的鱼 发表于 2014-9-17 20:19:05

挺不错的{:smile:}

gzhmcu 发表于 2014-9-19 11:48:04

不错的,收藏了

minwang440 发表于 2014-9-19 12:58:59

楼主有没有K型热点偶加单片机做的温度测量,想做一个,还没有头绪

demonye 发表于 2014-9-22 16:51:53

楼主显示曲线的方法能否介绍一下
Excel如何做可以采集数据,画出曲线

斗转乾坤 发表于 2016-1-11 23:51:55

支持。。。

小梁子 发表于 2018-9-11 14:40:21

DHT11的感湿元件就是湿敏电阻来的
页: [1]
查看完整版本: 温湿度传感器DHT11程序+试用情况