Разделить float на разряды

Тарас Петрович
Offline
Зарегистрирован: 21.11.2015

Делаю часы с термометром и большим светодиодным дисплеем (63 светодиода на цифру). Дисплей управляется двумя 16-разрядными драйверами MBI5026. Информацию вывожу в них бесхитростным ШифтАут. С выводом времени всё ясно, поделил целое четырёхзначное на разряды, да отправил. А вот с температурой засада. Есть у меня переменная    float mytemp= (celsius/16.0);    celsius ранее объявлена как     volatile int celsius; Заполнение переменных происходит в следующем участке кода

ISR (WDT_vect){ //вектор прерывания WD
static boolean n=0; // флаг работы: запрос температуры или её чтение
n=!n;
counter++;
digitalWrite(4,n);
if (counter==5) {counter=0;}
if (n) {ds.reset();  // сброс шины
        ds.select(addr); // выбор адреса
        ds.write(0x44); // начать преобразование (без паразитного питания)
        }
else   {ds.reset();
        ds.select(addr);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        celsius =  ds.read() | (ds.read()<<8); //прочитаны 2 байта 

Код этот я взял когда-то здесь, на форуме, однако принципа его работы я не понимаю. А именно, сколько не читал даташит к ДС18Б20, так и не выяснил в каком чудо-формате датчик в двух байтах  хранит и отправляет измеренную температуру. Отсюда и вопрос, что делает эта строка   celsius = ds.read() | (ds.read()<<8); //прочитаны 2 байта ...Вжжжух, и температура измерена....

Так вот, к самому вопросу: есть у меня переменная mytemp. Она то отрицательная, то положительная. То больше 9,9, то меньше (разное колличество десятичных разрядов).Имеет после запятой то один знак, то два. А мне её надо на дислей вытащить. То есть точно разложить по четырём знакоместам. Коллеги, как это сделать с float?

bwn
Offline
Зарегистрирован: 25.08.2014

Тарас Петрович пишет:

Код этот я взял когда-то здесь, на форуме, однако принципа его работы я не понимаю. А именно, сколько не читал даташит к ДС18Б20, так и не выяснил в каком чудо-формате датчик в двух байтах  хранит и отправляет измеренную температуру. Отсюда и вопрос, что делает эта строка   celsius = ds.read() | (ds.read()<<8); //прочитаны 2 байта ...Вжжжух, и температура измерена....

Здесь немного разбирались.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Раз уж Вы используете float, то (кутить, так кутить) воспользуйтесь функцией dtostrf. Получите число в строке с нужным форматированием, ну а там уж всё просто.