【DHT11读取负温度】

Temperature = - (buf[2] + ( buf[3] & 0x7F )/10 ) ;
DHT11检测温度为负时未判断


问题描述

提示:这里描述项目中遇到的问题:

由于日常调试过程中没有遇到过零下温度,因此未重视,后进行低温实现发现该问题,遂解决。

/*
 *函数名称:()
 *输入参数:
 *返回参数:
 *函数功能://获取核心板DHT11温湿度;
 *函数说明:
 *备    注:20191219-ZCJ
 DHT11 -20-55
 DS18B20 -55℃~+125℃
 *			20200303更新 增加对错误DS18B20温度数据的判断127.94 1279.4
 			20210628 更新 优先使用DHT11温度作为环境温度,通过外部目录判断读取哪个传感器
 			20220316 ZHAOCHENGJIE 优化DHT11温度为负温度后未判断的bug,且以前程序未判断温度小数位
 						buf示例一:接收到的40位数据为:
						0011 0101 0000 0000 0001 1000 0000 0100 0101 0001
						湿度高8位 湿度低8位 温度高8位 温度低8位 校验位
						buf[0]湿度高8位,buf[1]湿度低8位,buf[2]温度高8位,buf[3]温度低8位,buf[4]校验位,

*/

int DHT11_Read ( )
{
    int fd;
    char buf[6];	/* 定义存放数据的数组 */
    int length;
    int cnt;
    int iIsNegative;
    fd = open ( "/dev/dht11", O_RDONLY );
    if ( fd == -1 )
    {
        printf ( "open failed!\n" ); 
        return -1;
    }

    while ( 1 )
    {
        length = read( fd, buf, 6 );	/* 读取温湿度数据 */

#if 0
        for (cnt = 0; cnt < 6; cnt++)
        {
            printf ( "DHT11[%d]\n",buf[cnt]);
        }
#endif
        printf ( "open failed!\n" );
        if ( length == 0 )
        {
            break;
        }
        if ( length == -1 )
        {
            printf ( "read error!\n" ); 
            return -1;
        }

    }
    //printx("Temp : %d, Humi : %d\n", buf[2], buf[0]);
    Humidity 	 = buf[0] + (buf[1]/10) ;
     
        iIsNegative = (( buf[3] & 0x80 ) >> 7) ;//温度低八位的最高位为1,则温度为负数 20220317增加移位,否则值为128
        //printx ( "iIsNegative=%d\n", iIsNegative ) ;
		//printx ( "( buf[3] & 0x7F )=%d\n", ( buf[3] & 0x7F ) ) ;
        if ( 1 == iIsNegative )
        {
            Temperature = - (float)( (float)buf[2] + ( (float)( buf[3] & 0x7F ) /10) ) ;//20220317增加float到正确的位置 否则float不生效
			
        }
        else
        {
            Temperature =  (float)buf[2] +  ((float)buf[3]/10) ;
        }
  
#if 0
    sleep ( 1 );
#endif
    close ( fd ); /* 关闭DHT11设备节点 */
    return 0;
}

原因分析:

实际操作中未出现该bug的条件


解决方案:

添加负温度的判断

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值