Шаг 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
Обсудить на форуме