【问题标题】:DHT22 Sensor's checksum not validDHT22 传感器的校验和无效
【发布时间】:2021-10-03 09:43:30
【问题描述】:

DHT22 传感器的读取位如下:

0000000111010001000000001110111111101111

如果我们通过他们给出的公式计算它们的校验和:

参考:https://cdn-shop.adafruit.com/datasheets/Digital+humidity+and+temperature+sensor+AM2302.pdf

如果您将示例中的每个八位字节转换为十进制并将其与最后 8 位(校验和)进行比较 - 它们是相等的。

Binary:      Decimal:
00000001     1     //First  8 bits
11010001     209   //Second 8 bits
00000000     0     //Third  8 bits
11101111     239   //Fourth 8 bits
---------------------------------->
Summed:      449
------------ Not equal ----------->
11000001     193   //Check sum

当转换 16 位湿度和 16 位温度时,它们会根据其他流行的 DHT22 库显示正确的结果,但校验和无效。

【问题讨论】:

    标签: c++ arduino embedded sensors


    【解决方案1】:

    我误解了他们给出的公式。 最后 8 位是指 4 个八位字节和的最后 8 位:

    Binary:                       Decimal:
    00000001                      1     //First  8 bits
    11010001                      209   //Second 8 bits
    00000000                      0     //Third  8 bits
    11101111                      239   //Fourth 8 bits
    ---------------------------------->
    Summed:                       449
    449 as Binary:                111000001
    449's last 8 bits:            11000001
    11000001 as decimal:          193
    ----------------------------- Equal ----------->
    11000001                      193   //Check sum
    

    我希望有同样问题的人来解决这个问题,因为我花了几个小时的试验才找到导致问题的原因。

    在他们的示例中,它们的总和也低于 255,而且更难捕捉它,因为您不需要删除一点,因为该值不大于 8 位。

    【讨论】:

    • 确实如此。校验和始终是固定的但宽度。这仅仅意味着溢出被忽略。惯用的实现就是简单地将八位字节相加成一个uint8_t 累加器。
    猜你喜欢
    • 1970-01-01
    • 2016-08-06
    • 2014-11-28
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2018-12-19
    • 2017-02-03
    • 2011-09-13
    相关资源
    最近更新 更多