Как преобразовать значение, полученное от датчика температуры?

Я работаю над ST Temperature sensor( hts221 ), использую связь команды I2C с датчиком.

Я вижу из документа, как следующий текст.

enter code here Temperature data are expressed as TEMP_OUT_H & TEMP_OUT_L as 2’s complement numbers.

И следующее изображение является описанием из документа. введите здесь описание изображения

И Temperature data, считанное с датчика, выглядит следующим образом.

TEMP_OUT_L is 0xA8
TEMP_OUT_H is 0xFF

Как преобразовать значение TEMP_OUT_L и TEMP_OUT_H в данные температуры?

Заранее спасибо ?


person Martin    schedule 15.08.2014    source источник
comment
Что вы пробовали? Если у вас есть 2 байта от I2C, вы уже сделали сложную часть. Rest — это простой битовый сдвиг и операция ИЛИ.   -  person user694733    schedule 15.08.2014
comment
@squeamishossifrage Я не думаю, что прямое разыменование указателя работает. ОП упоминает, что он читает через I2C.   -  person user694733    schedule 15.08.2014
comment
@ user694733 А, пропустил.   -  person r3mainer    schedule 15.08.2014
comment
Я надеюсь, что есть более подробная информация... Если не стакан воды со льдом при температуре 0 по Цельсию или 32 по Фаренгейту, каковы ваши ценности.?   -  person Serge Ballesta    schedule 15.08.2014


Ответы (3)


Объединив биты в двух значениях, чтобы сформировать одно 16-битное значение:

const temp_h = i2c_read_byte(TEMP_OUT_H);
const temp_l = i2c_read_byte(TEMP_OUT_L);
const uint16_t temp = (temp_h << 8) | temp_l;

Это просто предполагает, что у вас есть функция uint8_t i2c_read_byte(uint8_t address);, которую можно использовать для считывания двух регистров.

Конечно, следующим шагом было бы преобразование этого необработанного двоичного числа в фактическую температуру в какой-то правильной единице (например, в градусах Цельсия или Кельвина). Для этого вам потребуется дополнительная информация из технического паспорта.

person unwind    schedule 15.08.2014
comment
еще, какой масштаб? Я чувствую, что это должно быть где-то задокументировано. Это зависит от производителя? - person John Dvorak; 15.08.2014

На странице 6 таблица данных говорит:

Temperature sensitivity 0.016 °C/LSB

Итак, вот что вам нужно сделать:

#define TEMP_SENSITIVITY 0.016f
#define TEMP_OFFSET      ???    /* Get this value from the datasheet. */

unsigned char tempOutH;
unsigned char tempOutL;

/* Here you get the values for tempOutH and tempOutL. */

uint16_t tempData = (tempOutH << 8) | tempOutL;
float    temp     = (tempData * TEMP_SENSITIVITY) + TEMP_OFFSET;  

Итак, что вы делаете, это объединяете два 8-битных высокого и низкого значения. Это дает вам одно 16-битное значение. Затем вы конвертируете/масштабируете это число от 0 до 65535 до реального значения температуры.

Я предположил, что в даташите должно быть указано смещение, потому что иначе температура может быть только положительной: между 0.0 и 65363 * 0.016. Это смещение будет отрицательным значением. Я оставляю это на ваше усмотрение, чтобы найти это смещение.

person meaning-matters    schedule 15.08.2014
comment
Кроме того, на странице 25 технического описания (st.com/st-web-ui/static/active/en/resource/technical/document/), он показывает разработанный пример с использованием линейной интерполяции (y=mx+b ) подход к преобразованию цифрового значения в температуру. Между этим и ответом, приведенным выше, у вас есть вся информация, которая может вам понадобиться. - person Cloud; 15.08.2014
comment
Извините... Я новичок в этом, я видел страницу 25 в таблице данных. Но я все еще понимаю, как преобразовать значение в температуру... - person Martin; 29.08.2014
comment
@Мартин, у меня нет времени, чтобы полностью разобраться в этом для тебя. Я бы посоветовал вам очень внимательно прочитать лист данных (несколько раз, если необходимо), все должно быть там. ХТН - person meaning-matters; 29.08.2014

0xFF часть 0xFFA8 мне кажется подозрительной, возможно устройство настроено на работу в 8-битном режиме (если это вообще возможно) , на странице 24 datasheet сказано

T0 и T1 — это фактические значения температуры калибровки, умноженные на 8.

Таким образом, 0xA8, разделенное на 8, дает: 31,25 - разве это не температура вокруг вас сейчас?

person Ruslan Gerasimov    schedule 15.08.2014
comment
Извините... я не понял. Как вы конвертируете 0xA8 в 31.25? - person Martin; 28.08.2014
comment
просто разделите 250(0xa8) на 8, так что 250/8=31,25 - person Ruslan Gerasimov; 28.08.2014