Контрольная сумма датчика DHT22 недействительна

#c #arduino #embedded #sensors

Вопрос:

Биты считывания с датчика DHT22, как показано ниже:

0000000111010001000000001110111111101111

Если мы рассчитаем их контрольную сумму по формуле, которую они дали: введите описание изображения здесь

Ссылка: https://cdn-shop.adafruit.com/datasheets/Digital влажность и температура датчик 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, но контрольная сумма неверна.

Ответ №1:

Я неправильно понял формулу, которую они дали. Под последними 8 битами они подразумевают последние 8 бит из суммы 4 октетов:

 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 бит.

Комментарии:

1. Действительно. Контрольные суммы всегда имеют фиксированную, но ширину. Это просто означает, что переполнение игнорируется. Идиоматическая реализация-это просто суммирование октетов в uint8_t накопитель.