【问题标题】:How does technions DHT22.c program calculate the temperature?technions DHT22.c程序如何计算温度?
【发布时间】:2015-05-17 00:24:39
【问题描述】:

他的代码是如何计算温度的?

尤其是我正在寻找解释的程序的这一部分(我不明白他为什么这样做(& 0x7F)并乘以 256):

if ((j >= 40) &&
  (dht22_dat[4] == ((dht22_dat[0] + dht22_dat[1] + dht22_dat[2] + dht22_dat[3]) & 0xFF)) ) {
    float t, h;
    h = (float)dht22_dat[0] * 256 + (float)dht22_dat[1];
    h /= 10;
    t = (float)(dht22_dat[2] & 0x7F)* 256 + (float)dht22_dat[3];
    t /= 10.0;
    if ((dht22_dat[2] & 0x80) != 0)  t *= -1;
    sicher = 0;    
    dsicher = false;
    temp = t;
printf("Humidity = %.2f %% Temperature = %.2f *C \n", h, t );

如果有人可以评论上面的代码,我将不胜感激。 整个程序可以在这里找到:http://pastebin.com/zkaTjQiS

【问题讨论】:

    标签: c raspberry-pi sensors temperature


    【解决方案1】:

    正如您在DHT22 datasheet 中看到的那样,传感器在被询问时会通过 1 线输出 40 位数据。前 16 位将相对湿度编码为百分之一,接下来的 16 位将温度编码为摄氏度的十分之一,最后 8 位是校验和。

    所有这些都以 MSBit 顺序发生,因此转录的 5 个字节中的数字被编码为big endian。此外,您还可以在数据表中看到,温度数据被编码为有符号幅度而不是二进制补码。

    所以:

    if ((j >= 40) &&
      (dht22_dat[4] == ((dht22_dat[0] + dht22_dat[1] + dht22_dat[2] + dht22_dat[3]) & 0xFF)) ) {
    

    检查 40 位被打卡并且校验和是否有效。

    h = (float)dht22_dat[0] * 256 + (float)dht22_dat[1];
    h /= 10;
    

    为了保持湿度百分比而不是promille,不必要地使用浮点运算,但除此之外,它只是将较高字节的值向上移动到其应有的位置,并将较低的字节添加到该位置。你也可以写

    h = dht22_dat[0] << 8 | dht22_dat[1];
    

    如果您喜欢这种表示法;关键是从两个单独的字节中得到它们所代表的 16 位整数值。

    想一想,如果你愿意的话,就好像传感器给了你两个十进制数字 23,你必须从它们中重建值。如果您知道 2 是更高的有效数字,您将计算 2 * 10 + 3 以获得实际值 23。同样的原理在这里适用,除了传感器没有给您十进制数字而是 256 进制数字,所以你计算a * 256 + b而不是a * 10 + b

    同样,

    t = (float)(dht22_dat[2] & 0x7F)* 256 + (float)dht22_dat[3];
    t /= 10.0;
    

    将高字节的低7位和低字节组合成温度的绝对值。隔离高字节的低 7 位是必要的,因为它的最高位是一个符号位,用于表示负温度,而不是温度绝对值的一部分。

    然后

    if ((dht22_dat[2] & 0x80) != 0)  t *= -1;
    

    检查该符号位是否已设置,如果是则调整结果的符号,并且

    printf("Humidity = %.2f %% Temperature = %.2f *C \n", h, t );
    

    打印转换结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多