搜索
bottom↓
回复: 10

读AM2302,DHT11,DHT22 温湿度传感器

[复制链接]

出0入0汤圆

发表于 2013-10-31 17:04:53 | 显示全部楼层 |阅读模式
72M
us延时是经过示波器掐出来的。每次读取都对,校验和也对。湿度好像差不多,可温度总是比室温大20多度,大家帮我看看问题是出在哪里? 本以为是DHT11的问题,特意去买了AM2302(DHT22), 可结果还是一样。

0x02  0x90  0x02  0x24  0xB8    //40Bit 数据
DHT11 OK!
********** Humidity & Temperature ***********
DHT11 Humidity    = 65.6%RH
DHT11 Temperature = 54.8C
DHT11 CheckSum    = 184
*********************************************

0x02  0x8E  0x02  0x24  0xB6
DHT11 OK!
********** Humidity & Temperature ***********
DHT11 Humidity    = 65.4%RH
DHT11 Temperature = 54.8C
DHT11 CheckSum    = 182
*********************************************
以上是串口送出的报告

程序如下:
uint8_t DHT_ReadByte(void)
{
  uint8_t data = 0;
  uint8_t i,count=0;
        uint8_t timeout=0;       

        for(i=0;i<8;i++)
        {
                timeout=0;
                while(!DHT_ReadPin() && timeout < 100)    // 输出位头,低电平
                {
                        delay_us(1);       
                        timeout++;
                }
                timeout=0;
                while(DHT_ReadPin() && timeout < 100)
                {
                        delay_us(1);
                        timeout++;
                        count++;
                }       
                if(count > 30)                // 大于30uS的为 1
                {
                        data |= 1;
                }

                data <<= 1;
                count = 0;
        }
        //printf("DHT11 Reader Value = 0x%02X\r\n",data);
        return data;
}

/************************************************************************************/

uint8_t DHT_ReadData(TempHuTypeDef *temphu)
{
        uint8_t SuccessFlag=0;
        uint8_t timeout=0;

        __disable_irq();           //关全局中断

  DHT_IO_Dir(OUT);          //设端口输出
        DHT_PinLow();              //拉低启动DHT11
        delay_ms(20);              //保持18mS以上
        DHT_IO_Dir(IN);           //设端口输入,靠外部上拉电阻拉高电平
  delay_us(30);              //延时
        if(!DHT_ReadPin())         //等待DHT11应答响应
        {
                while(!DHT_ReadPin() && timeout < 100)    //等待DHT11应答结束,DHT11输出高等变高。
                {
                        delay_us(1);
                        timeout++;
                }
                timeout=0;
                while(DHT_ReadPin() && timeout < 100)   // DHT11拉高之后,变低后开始输出
                {
                        delay_us(1);
                        timeout++;
                }
                temphu->humidity_H = DHT_ReadByte();
                temphu->humidity_L = DHT_ReadByte();
                temphu->temperature_H = DHT_ReadByte();
                temphu->temperature_L = DHT_ReadByte();
                temphu->checksum = DHT_ReadByte();
               
                if(temphu->humidity_H + temphu->humidity_L + temphu->temperature_H + temphu->temperature_L == temphu->checksum)
      SuccessFlag = 1;
    printf("0x%02X  0x%02X  0x%02X  0x%02X  0x%02X\r\n",temphu->humidity_H,temphu->humidity_L,temphu->temperature_H,temphu->temperature_L,temphu->checksum);
        }
  __enable_irq();  
        return SuccessFlag;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2013-10-31 17:58:22 | 显示全部楼层
upupup求助

出0入0汤圆

发表于 2013-10-31 20:26:55 | 显示全部楼层
如果读数正确的话,会不会是计算错了?

(1)先保证单个字节的读写是正确的;
(2)高低字节换成成结果也是正确的。

出0入0汤圆

 楼主| 发表于 2013-11-1 11:13:41 | 显示全部楼层
祥子 发表于 2013-10-31 20:26
如果读数正确的话,会不会是计算错了?

(1)先保证单个字节的读写是正确的;

问题找到了,我犯了低级错误,ReadByte 8次循环 先赋值一位,再移位肯定不对,应该改为先移位再赋值。

另外,DTH11 是高8位表示整数,低8位表示小数,而DHT22(AM2302) 是16位表示。温度,湿度值除以10 得到。

修改后的程序:(红色字修正前面错误)

uint8_t DHT_ReadByte(void)
{
  uint8_t data = 0;
  uint8_t i,count=0;
        uint8_t timeout=0;       

        for(i=0;i<8;i++)
        {
                timeout=0;
                while(!DHT_ReadPin() && timeout < 100)    // 输出位头,低电平
                {
                        delay_us(1);       
                        timeout++;
                }
                timeout=0;
                while(DHT_ReadPin() && timeout < 100)
                {
                        delay_us(1);
                        timeout++;
                        count++;
                }
                data <<= 1;                    // 先移位
                if(count > 30)                // 大于30uS的为 1
                {
                        data |= 1;
                }
                count = 0;
        }
        //printf("DHT11 Reader Value = 0x%02X\r\n",data);
        return data;
}

/************************************************************************************/

uint8_t DHT_ReadData(TempHuTypeDef *temphu)
{
        uint8_t SuccessFlag=0;
        uint8_t timeout=0;

        __disable_irq();           //关全局中断

  DHT_IO_Dir(OUT);          //设端口输出
        DHT_PinLow();              //拉低启动DHT11
        delay_ms(20);              //保持18mS以上
        DHT_IO_Dir(IN);           //设端口输入,靠外部上拉电阻拉高电平
  delay_us(30);              //延时
        if(!DHT_ReadPin())         //等待DHT11应答响应
        {
                while(!DHT_ReadPin() && timeout < 100)    //等待DHT11应答结束,DHT11输出高等变高。
                {
                        delay_us(1);
                        timeout++;
                }
                timeout=0;
                while(DHT_ReadPin() && timeout < 100)   // DHT11拉高之后,变低后开始输出
                {
                        delay_us(1);
                        timeout++;
                }
                temphu->humidity_H = DHT_ReadByte();
                temphu->humidity_L = DHT_ReadByte();
                temphu->temperature_H = DHT_ReadByte();
                temphu->temperature_L = DHT_ReadByte();
                temphu->checksum = DHT_ReadByte();
               
                if(temphu->humidity_H + temphu->humidity_L + temphu->temperature_H + temphu->temperature_L == temphu->checksum)
      SuccessFlag = 1;
    printf("0x%02X  0x%02X  0x%02X  0x%02X  0x%02X\r\n",temphu->humidity_H,temphu->humidity_L,temphu->temperature_H,temphu->temperature_L,temphu->checksum);
        }
  __enable_irq();  
        return SuccessFlag;
}




出0入0汤圆

发表于 2013-11-1 15:59:35 | 显示全部楼层
gadio 发表于 2013-11-1 11:13
问题找到了,我犯了低级错误,ReadByte 8次循环 先赋值一位,再移位肯定不对,应该改为先移位再赋值。

...

   赞一个

出0入0汤圆

发表于 2013-11-28 11:37:43 | 显示全部楼层
gadio 发表于 2013-11-1 11:13
问题找到了,我犯了低级错误,ReadByte 8次循环 先赋值一位,再移位肯定不对,应该改为先移位再赋值。

...

请教楼主,读取一次耗时多少?读取的时候要关总中断?

出0入0汤圆

发表于 2013-11-28 15:25:17 | 显示全部楼层
赞一个

出0入0汤圆

发表于 2014-5-25 22:04:56 | 显示全部楼层
你好,请问DHT22传感器,是3脚为地还是4脚为地呢,我看了中文和英文的手册,中文的3脚为地,英文的4脚为地,有点疑问,希望你能回答,谢谢。

出0入0汤圆

发表于 2014-9-7 09:35:52 | 显示全部楼层
楼主可以上传个完整的DHT22程序不?我弄了好几天了,读不出数据啊

出0入0汤圆

发表于 2016-6-29 15:21:51 | 显示全部楼层
厉害  赞一个

出0入0汤圆

发表于 2017-1-18 09:24:27 | 显示全部楼层
小车 发表于 2014-9-7 09:35
楼主可以上传个完整的DHT22程序不?我弄了好几天了,读不出数据啊

注意校验位是16位
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 10:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表