С считыванием байтов проблем нет а вот что делать с полученными данными не могу разобраться.
По всем примерам в инете:
St = MSB<<8+LSB; //
тут возникает первый вопрос а что делать с двумя младшими битами младшего байта LSB их надо принудительно обнулять?
Для перевода полученного значения в градусы применяется формула: (не получается ее воткнуть нормально)
T=-46.85 +St*175.72/65536; //
Тут возникает второй вопрос - переменную Т объявлять как float ?
Далее я хочу данные выводить на 1602 индикатор и мне надо знать какие биты в переменной Т отвечают за минус (наверно старший)
а какие за целую и дробную часть?
sht21 помогите разобратьтя
- Виталий_36
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Ср мар 02, 2011 15:09:25
- Откуда: Воронеж
Re: sht21 помогите разобратьтя
Как хочешь. Можешь сделать флоатом и получить результат с плавающей запятой.Виталий_36 писал(а):переменную Т объявлять как float ?
А можешь использовать вариант с фиксированной запятой: умножь обе константы (46.85 и 175.72) на 100 - и в переменной типа signed long получишь температуры с двумя знаками после запятой. Т.е. число 123 будет означать 1.23 градуса.
При использовании float будет проще сделать sprintf() в буфер в нужном формате и вывести результат.Виталий_36 писал(а):какие биты в переменной Т отвечают за минус (наверно старший)
а какие за целую и дробную часть?
При использовании целочисленной переменной: отрицательное число хранится в дополнительном коде.
Да, знак можно определить по старшему биту, но и остальные биты тоже надо обработать.
А с десятичной точкой: перевести число из HEX в DEC, и перед двумя младшими цифрами вставить точку.
- Виталий_36
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Ср мар 02, 2011 15:09:25
- Откуда: Воронеж
Re: sht21 помогите разобратьтя
К сожалению я не знаком с sprintf() и почему только два знака после запятой ведь при делении может быть и больше
Re: sht21 помогите разобратьтя
Виталий_36 писал(а):К сожалению я не знаком с sprintf() и почему только два знака после запятой ведь при делении может быть и больше
Тут есть про SHT21 http://we.easyelectronics.ru/search/topics/?q=SHT21
- Виталий_36
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Ср мар 02, 2011 15:09:25
- Откуда: Воронеж
Re: sht21 помогите разобратьтя
BigallS писал(а):Виталий_36 писал(а):К сожалению я не знаком с sprintf() и почему только два знака после запятой ведь при делении может быть и больше
Тут есть про SHT21 http://we.easyelectronics.ru/search/topics/?q=SHT21
Я там все внимательно прочитал
-
mekuto
- Первый раз сказал Мяу!
- Сообщения: 34
- Зарегистрирован: Вт фев 17, 2009 21:28:10
- Откуда: Новочебоксарск
- Контактная информация:
Re: sht21 помогите разобратьтя
Здравствуйте.
Извините.
Если используется язык СИ. То, лучше Т определить типа float. Вычисления с плавающей точкой медленнее, но думаю вам быстрота не нужна, все равно у датчика есть инерция к изменению температуры. У датчика есть погрешность измерения температуры. Не стоит брать лишние разряды чисел, которые уж точно не несут полезного сигнала с известной достоверностью. Следовательно, можно ограничится 1, 0.1, 0.05 и т.д. градусов. Перевод в интегер:
Получим целую часть, если надо дробную часть получить, то можно умножить на дополнительный коэффициент или использовать trunc().
https://ru.wikipedia.org/wiki/Math.h http://www.cplusplus.com/reference/cmath/
Спасибо.
Извините.
Если используется язык СИ. То, лучше Т определить типа float. Вычисления с плавающей точкой медленнее, но думаю вам быстрота не нужна, все равно у датчика есть инерция к изменению температуры. У датчика есть погрешность измерения температуры. Не стоит брать лишние разряды чисел, которые уж точно не несут полезного сигнала с известной достоверностью. Следовательно, можно ограничится 1, 0.1, 0.05 и т.д. градусов. Перевод в интегер:
Код: Выделить всё
signed int temperature;
....
temperature = (signed int) T;
Получим целую часть, если надо дробную часть получить, то можно умножить на дополнительный коэффициент или использовать trunc().
https://ru.wikipedia.org/wiki/Math.h http://www.cplusplus.com/reference/cmath/
Спасибо.
Re: sht21 помогите разобратьтя
Функция из стандартной библиотеки языка С.Виталий_36 писал(а):К сожалению я не знаком с sprintf()
Если используется другой язык программирование - то смотри в доки, какая у него функция вывода числа из бинарного вида в текстовый.
Ключевые слова: целочисленная переменная (т.е. вообще нет дробных частей!) и фиксированная запятая.Виталий_36 писал(а):и почему только два знака после запятой ведь при делении может быть и больше
Почему именно два знака? Ну, можно обе константы умножить на 1000 - будет в результате температура с тремя знаками после запятой.
А смысл? Что сказано в даташите про разрешающую способность датчика? 0.01 или 0.04 градуса!