Шаг 5.64. Датчик температуры. Приводим в читабельный вид.
Итак, напишем-ка функцию, которая будет пересчитывать наше значение температуры в сознательное число
Для начала, рассмотрим примеры, которые приведены в даташите:
Рис. 1. Пример значений температуры
Итак, с положительными значениями все просто. Например, вот как получить из 0xAA "+85":
Число | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
Степень двойки | 6 | 5 | 4 | 3 | 2 | 1 | 0 | -1 |
2ˆ6 + 2ˆ4 + 2ˆ2 + 2ˆ0 = 64 + 16 + 4 + 1 = 85
Кстати, обратите внимание, что значение "+85" - исходное, дефолтовое при включении датчика.
А теперь смотрим отрицательные числа - они представлены в так называемом дополнительном коде - то есть модуль числа инвертировали и прибавили к нему единичку (ну, или вычли из 0). Чтобы получить значение "-55",проделываем следующее:
Узнаем по первому байту, что число отрицательно.
10010010 -> вычитаем единичку -> 10010001 -> инвертируем -> 01101110
число | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
степень двойки |
6 | 5 | 4 | 3 | 2 | 1 | 0 | -1 |
-1 * (2ˆ5 + 2ˆ4 + 2ˆ2 + 2ˆ1 + 2ˆ0) = -1 * (32 + 16 + 4 + 2 + 1) = -55
Вот так.
В общем, преобразование из двоичной системы в обычную, десятичную.
Есть у наш в библиотечке волшебная функция FloatToStr - перевод дробного числа типа float в строку (кстати, теперь длина нашей строки sTemp должна быть как минимум 15 символов). Заводим переменную float fTempDec, изначально равную нулю, потом, если температура отрицательна, запоминаем сей факт и переводим из дополнительного кода, и просто суммируем соответствующие степени двойки.
//функция преобразует показание температуры в читабельный вид //на вход - само значение типа word и указатель на начало строки, в которую пишем void convertTemp(word wTemp, char* sTemp) { byte bitCold; //положительна ли (0) или отрицательна (1) температура float fTempDec = 0; //температура в десятичном виде if(wTemp & 0xFF00) //если температура отрицательна { bitCold = 1; wTemp = ˜wTemp + 1; //взяли модуль } else { bitCold = 0; } if(wTemp & 0x0001) //смотрим дробную часть { fTempDec += 0.5; } fTempDec += (wTemp >> 1); //прибавили целую часть if(bitCold) //если температура отрицательна { fTempDec = fTempDec * (-1); } FloatToStr(fTempDec, sTemp); }
Не забудьте исправить буквально пару строк: в функции getTemp вместо последней строки будет вызов новой функции convertTemp(wTemp, sTemp), а в главной функции main первая константа - const byte TempLen - станет равна 15
В результате терминальчик выдает там записи типа "temp = 27,9999.." - слишком много девяток) Увы, такова запись в числа типа float. Для эстетов могу посоветовать просто грубо обрезать строку в самом-самом конце - sTemp[6] = 0;
6 - потому что максимально 3 символа, отвечающих за целую часть, и два - за дробную... По-хорошему, конечно, эту шестерку - в константу!
Ну вот, сама программка и прошивка
Да: есть, к слову, какой тип - bit.Ну,соответственно,размером в один бит. Есть соблазн использовать его при проверке температуры на отрицательность. Но в Си-то оно работает, а в Паскале - увы(
Автор - Moriam
Обсудить на форуме