OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4260|回复: 10

STM32 DHT11温湿度数据不正确

[复制链接]

11

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2017-10-26
在线时间
25 小时
发表于 2018-1-3 15:36:00 | 显示全部楼层 |阅读模式
10金钱
如题,配置完后湿度有显示数据,温度总是不对,大神们帮忙看看是哪里出问题了

串口打印温湿度度

串口打印温湿度度

main代码:
int main(void)
{
        uint8_t temperature;
        uint8_t humidity;
        uint8_t t=0;
          uint8_t buf[5];
        HAL_Init( );
  SystemClock_Config( );
  HW_Init( );
  DHT11_Init( );       
       
  while(1)
        {
                if(t%10==0)
                {       
                        DHT11_Read_Data(&temperature,&humidity);
                        PRINTF("the temperature1 is %dC\n",buf[2]);
                        DelayMs(100);
                        PRINTF("the temperature2 is %dC\n",buf[3]);
                        DelayMs(100);
                        PRINTF("the humidity1 is %dRH\n",buf[0]);
                        DelayMs(100);
                        PRINTF("the humidity2 is %dRH\n",buf[1]);
                        DelayMs(100);
                        PRINTF("the toal is %dC\n",buf[4]);
                        DelayMs(100);
                }
               
                DelayMs(50);
                t++;
                if(t==20)
                {
                        t=0;
                        LED_Toggle( LED_RED1 );
                }
        }
}


dht11.c代码
void DHT11_IO_IN(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  dht11_GPIO_CLK_ENABLE();
  GPIO_InitStruct.Pin = dht11_PIN;     //配置dht11  PB8
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

void DHT11_IO_OUT(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        dht11_GPIO_CLK_ENABLE();
        GPIO_InitStruct.Pin = dht11_PIN;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

void DHT11_Rst(void)           
{                 
    DHT11_IO_OUT();
    DHT11_DQ_Low;
    DelayMs(20);
    DHT11_DQ_High;
    Delayus(30);
}

uint8_t DHT11_Check(void)            
{   
    uint8_t retry=0;
    DHT11_IO_IN();//SET INPUT         
    while ((HAL_GPIO_ReadPin(dht11_GPIO_PORT,dht11_PIN)==GPIO_PIN_SET)&&retry<100)
        {
                                        retry++;
                                        Delayus(1);
        };         
        if(retry>=100)return 1;
                                        else retry=0;
    while ((HAL_GPIO_ReadPin(dht11_GPIO_PORT,dht11_PIN)==GPIO_PIN_RESET)&&retry<100)
        {
          retry++;
          Delayus(1);
        };
        if(retry>=100)return 1;            
        return 0;
}

uint8_t DHT11_Read_Bit(void)                          
{
    uint8_t retry=0;
    while((HAL_GPIO_ReadPin(dht11_GPIO_PORT,dht11_PIN)==GPIO_PIN_SET)&&retry<100)
    {
        retry++;
        Delayus(1);
    }
        retry=0;
    while((HAL_GPIO_ReadPin(dht11_GPIO_PORT,dht11_PIN)==GPIO_PIN_RESET)&&retry<100)
    {
        retry++;
        Delayus(1);
    }
        Delayus(40);
        if(HAL_GPIO_ReadPin(dht11_GPIO_PORT,dht11_PIN)==GPIO_PIN_SET)
          return 1;
        else
          return 0;                  
}

uint8_t DHT11_Read_Byte(void)   
{        
    uint8_t i,dat;
    dat=0;
        for (i=0;i<8;i++)
        {
            dat<<=1;
            dat|=DHT11_Read_Bit();
                                }                                                   
    return dat;
}

uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi)   
{        
    uint8_t buf[5];
    uint8_t i;
    DHT11_Rst();
    if(DHT11_Check()==0)
    {
         for(i=0;i<5;i++)
         {
             buf=DHT11_Read_Byte();
         }
         if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
         {
             *humi=buf[0];
             *temp=buf[2];
         }
     }else return 1;
      return 0;            
}

uint8_t DHT11_Init(void)
{                             
    DHT11_Rst();
    return DHT11_Check();
}


dht11.h代码
#ifndef __DHT11_H
#define __DHT11_H
#include "stm32l0xx_hal.h"
#include "hw.h"

#define dht11_PIN                          GPIO_PIN_8
#define dht11_GPIO_PORT                    GPIOB
#define dht11_GPIO_CLK_ENABLE()          __HAL_RCC_GPIOB_CLK_ENABLE()
#define dht11_GPIO_CLK_DISABLE()         __HAL_RCC_GPIOB_CLK_DISABLE()

#define  DHT11_DQ_High  HAL_GPIO_WritePin(dht11_GPIO_PORT, dht11_PIN, GPIO_PIN_SET);
#define  DHT11_DQ_Low   HAL_GPIO_WritePin(dht11_GPIO_PORT, dht11_PIN, GPIO_PIN_RESET);



void DHT11_IO_OUT(void);
void DHT11_IO_IN(void);
uint8_t DHT11_Init(void);
uint8_t   DHT11_Read_Data(uint8_t *temp,uint8_t *humi) ;
uint8_t   DHT11_Read_Byte(void);
uint8_t   DHT11_Read_Bit(void);
uint8_t   DHT11_Check(void);
void DHT11_Rst(void);

#endif

最佳答案

查看完整内容[请看2#楼]

终于调出来了,还是在时序的问题上
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2017-10-26
在线时间
25 小时
 楼主| 发表于 2018-1-3 15:36:01 | 显示全部楼层
终于调出来了,还是在时序的问题上
回复

使用道具 举报

11

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2017-10-26
在线时间
25 小时
 楼主| 发表于 2018-1-3 15:40:55 | 显示全部楼层
自己顶起来
回复

使用道具 举报

11

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2017-10-26
在线时间
25 小时
 楼主| 发表于 2018-1-3 17:00:39 | 显示全部楼层
发现不是数据不对,是数据没过来。。。依然不知道哪里出问题了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-1-4 00:54:23 | 显示全部楼层
帮顶
回复

使用道具 举报

0

主题

113

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3321
金钱
3321
注册时间
2017-12-14
在线时间
406 小时
发表于 2018-1-4 13:38:05 | 显示全部楼层
为什么不打印temperature和humidity
回复

使用道具 举报

11

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2017-10-26
在线时间
25 小时
 楼主| 发表于 2018-1-5 08:31:59 | 显示全部楼层
feichangkunge 发表于 2018-1-4 13:38
为什么不打印temperature和humidity

作用是一样的
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2018-1-5 09:02:04 | 显示全部楼层

通信驱动的 那边看一下 ,我搞的是sht10 和sht20
回复

使用道具 举报

11

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2017-10-26
在线时间
25 小时
 楼主| 发表于 2018-1-5 17:09:15 | 显示全部楼层
xyl210xyl 发表于 2018-1-5 09:02
通信驱动的 那边看一下 ,我搞的是sht10 和sht20

用串口打印出来发现DHT11_Init()驱动失败,check应该返回0的,结果返回1了,不知道是不是IO配置问题DHT11_IO_OUT()和DHT11_IO_IN()?
uint8_t DHT11_Init(void)
{
        HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_PIN, GPIO_PIN_SET);
       
        DHT11_RST();
        return DHT11_Check();
}
回复

使用道具 举报

13

主题

145

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
469
金钱
469
注册时间
2015-5-14
在线时间
65 小时
发表于 2018-1-5 17:56:58 | 显示全部楼层
仔细调试,可以参考哈网友的意见。
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2018-1-8 09:21:08 | 显示全部楼层
majicblue 发表于 2018-1-5 17:09
用串口打印出来发现DHT11_Init()驱动失败,check应该返回0的,结果返回1了,不知道是不是IO配置问题DHT ...

io输入输出方式琢磨琢磨,时间花下去能出来的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-16 02:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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