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的条件
解决方案:
添加负温度的判断