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

2020-01-01 17:39发布

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 ",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 ",temphu->humidity_H,temphu->humidity_L,temphu->temperature_H,temphu->temperature_L,temphu->checksum);
        }
  __enable_irq();  
        return SuccessFlag;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
gadio
1楼-- · 2020-01-01 22:15
upupup求助
祥子
2楼-- · 2020-01-01 22:48
如果读数正确的话,会不会是计算错了?

(1)先保证单个字节的读写是正确的;
(2)高低字节换成成结果也是正确的。
gadio
3楼-- · 2020-01-02 01:10
祥子 发表于 2013-10-31 20:26
如果读数正确的话,会不会是计算错了?

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

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

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

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

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 ",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 ",temphu->humidity_H,temphu->humidity_L,temphu->temperature_H,temphu->temperature_L,temphu->checksum);
        }
  __enable_irq();  
        return SuccessFlag;
}




祥子
4楼-- · 2020-01-02 02:08
gadio 发表于 2013-11-1 11:13
问题找到了,我犯了低级错误,ReadByte 8次循环 先赋值一位,再移位肯定不对,应该改为先移位再赋值。

...

   赞一个
footballwang
5楼-- · 2020-01-02 07:01
 精彩回答 2  元偷偷看……
renmin
6楼-- · 2020-01-02 11:43
赞一个

一周热门 更多>