Adminhs, объясню на примере:
Вот у меня сейчас показывает так:
5 байт: 1 87 1 10 99
DHT22:26.6 *C 34.3 %
Рассматриваем по моей формуле: если b<0, то a=a+1, соответственно, если b>=0, то ничего не прибавляем, а оставляем a=a.
Считаем: у нас в нашем примере выше a=1, b=87, c=1, d=10, e=99.
По условию моей формулы, если b<0, то a=a+1.
У нас b=87, значит больше нуля, поэтому a остаётся без прибавления единицы.
Расшифровываем влажность: (a*256 +b)/10=(1*256 +87)/10 =343/10=34.3%
Байты температуры у нас такие: c=1, d=10.
Расшифровываем температуру: (c*256 +d)/10 =(1*256 +10)/10 =266/10=26.6 градусов.
Придумаем такой пример, когда будет выполняться второе условие моей формулы: 5 байт: 1 -112 0 -5 -116
у нас в этом примере переменные b и d отрицательные. Вот и смотрим на выполнение условия если b<0, то a=a+1 и если d<0, то c=c+1.
Считаем: b у нас =-112, значит a=a+1=1+1=2 (может её записать во временную переменную a').
считаем влажность: (a (или a') *256 +b)/10 =(2*256 -112) /10 =400/10 =40.0%
У вас в этом случае к a не прибавляется 1, поэтому берётся один раз по 256, а не 2 раза по 256 и получается, что ваш алгоритм делает так: (1*256 -112)/10=144/10=14.4% вместо реальных 40,0% влажности
Аналогично считаем температуру:
в нашем примере c=0, d=-5, значит по условию формулы нужно к c прибавить единицу (временно прибавть, нельзя потом её принимать во внимание при подсчёте контрольной суммы). получаем: (c' *256 +d)/10=(1 *256 -5)/10=251/10=25.1 градусов. В Вашем же случае не прибавляется временно к c единица, поэтому у вас получается так: (0 *256 -5)/10=-5/10=-0,5 градусов.
Вывод: в вашей программе в таких случаях, когда второй и четвёртый байты отрицательные, происходит занижение влажности на 25,6% и занижение температуры на 25,6 градусов.