#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
накопитель.