Страница 1 из 2

LCD 1602

Добавлено: Ср июл 07, 2021 17:14:42
mixon46
Как на lcd дисплей вывести флоат 16 бит или double 32 бит так что бы вывести только первые 5 бит информации. Низшие разряды стереть

Re: LCD 1602

Добавлено: Ср июл 07, 2021 18:36:45
veso74

Код: Выделить всё

float ff = 1234.56;
...

Код: Выделить всё

lcd.print((int)(ff));
или для большего числа

Код: Выделить всё

lcd.print((long)(ff));
Arduino Cast:
https://www.arduino.cc/en/reference/cast

Re: LCD 1602

Добавлено: Ср июл 07, 2021 19:12:09
mixon46
Это переводит из одного типа данных в другой? Мне нужно отсечь лишние цыфры после запятой

Re: LCD 1602

Добавлено: Ср июл 07, 2021 19:53:09
veso74
Приведите пример. Не могу понять, что еще должно быть.
Теперь отображается на дисплее целая часть (1234) из 1234,56 без явной трансформации (преобразование) типа.
Какие 5 бит (у float) имеете в виду?

Re: LCD 1602

Добавлено: Ср июл 07, 2021 20:03:15
mixon46
pressure. getPressure (P, T) ; // возвращает значение давления в mbar.
// на дисплее отображает полностью double 32 бита. А нужно только 5 цифр

Re: LCD 1602

Добавлено: Ср июл 07, 2021 20:18:17
74LS00
Arduino умеет выводить только целые числа. Видимо зависит от библиотеки экрана.

Я делал через dtostrf(), но нужно верно указать размерность. Если строка будет слишком короткой она всё равно будет показана верно, просто гдето в другой части экрана картинку покосит. Но если задать слишком большие размеры, то просто будет отжирать лишние байты.

Re: LCD 1602

Добавлено: Ср июл 07, 2021 20:24:49
veso74
Есьт большая разница между 5 битами и 5 цифрами :).

Код: Выделить всё

float ff = pressure.getPressure (P, T);
long xx = 0;
например:

Код: Выделить всё

ff = 1234567.89

Код: Выделить всё

xx = (long) ff;
xx %= 100000;
lcd.print(xx);
ответ: 34567
---
[uquote="74LS00",url="/forum/viewtopic.php?p=4058005#p4058005"]Arduino умеет выводить только целые числа...[/uquote]
Arduino выводить много типов, вкл double (int = 2). Посмотрите Print.h в C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino.

Re: LCD 1602

Добавлено: Ср июл 07, 2021 20:41:27
mixon46
Что то не понял

Re: LCD 1602

Добавлено: Ср июл 07, 2021 20:46:25
veso74
Пример программы. Запустить как есть. Потом извлеките нужные Вам строки и заместите ff с число, полученного из Вашей функции pressure.
(я частично пользуюсь переводчиком БГ-РУ)
Спойлер

Код: Выделить всё

#include <LiquidCrystal.h>

float ff = 1234567.89;
long xx;

LiquidCrystal lcd(9, 8, 7, 6, 5, 4);

void setup() {
  lcd.begin(16, 2);
}

void loop() {
  lcd.setCursor(0, 0);
  lcd.print(ff);
  lcd.setCursor(0, 1);
  xx = (long) ff;
  xx %= 100000;
  lcd.print(xx);
}

Re: LCD 1602

Добавлено: Ср июл 07, 2021 22:14:16
Аlex
sprintf Вам в помощь.

Re: LCD 1602

Добавлено: Чт июл 08, 2021 00:09:44
Alex_641
Зачем вообще флоат использовать ?

Добавлено after 17 minutes 46 seconds:
А что бы отбросить младшие разряды, нужно число разделить на 10 в степени разрядов которые нужно отбросить ... О чём речь ?

Re: LCD 1602

Добавлено: Чт июл 08, 2021 06:28:12
mixon46
Я не использую float. Он идет из методов библиотеки для барометрического датчика. И выдает результат в double типе данных

Добавлено after 4 minutes 31 second:
[uquote="Аlex",url="/forum/viewtopic.php?p=4058077#p4058077"]sprintf Вам в помощь.[/uquote]
Переделать в строку и вывести так что ли?

Re: LCD 1602

Добавлено: Чт июл 08, 2021 12:28:28
BOB51
А кто мешает предварительно обработку данных сделать?
Перед тем, как скормить результат стандартной библиотеке.
8)

Re: LCD 1602

Добавлено: Чт июл 08, 2021 19:16:44
Dimon456
mixon46 писал(а):что бы вывести только первые 5 бит информации. Низшие разряды стереть
Старшие 5 бит?
В СИ есть инструмент
Спойлер

Код: Выделить всё

union BytByte_32 {
struct {
uint16_t ostalnoe;
unsigned  bm: 11;
unsigned  bs: 5;
} bit;
volatile float byte;
}__attribute__((packed));

union BytByte_32 myBByte_32;

float ff = 1234.56;

unsigned char otvet;

	myBByte_32.byte = ff;

	otvet = myBByte_32.bit.bs;
в otvet как раз и будет старшие 5 бит float
Перефразируйте свой вопрос, а то я и из середины float могу 5 бит вытащить.

Re: LCD 1602

Добавлено: Чт июл 08, 2021 23:36:58
Аlex
mixon46 писал(а):Переделать в строку и вывести так что ли?
А как иначе Вы выводите переменные ?

Добавлено after 3 minutes 36 seconds:
[uquote="mixon46",url="/forum/viewtopic.php?p=4058015#p4058015"]Что то не понял[/uquote] Кстати, Вас тоже никто не понимает.
Сначала Вы говорите про 5 бит, потом про 5 цифр.
Вас просили - приведите пример. Вы не приводите.
Одни догадки ...

Re: LCD 1602

Добавлено: Пт июл 09, 2021 06:58:53
mixon46
[uquote="Аlex",url="/forum/viewtopic.php?p=4058394#p4058394"]
mixon46 писал(а):Переделать в строку и вывести так что ли?
А как иначе Вы выводите переменные ?

Добавлено after 3 minutes 36 seconds:
[uquote="mixon46",url="/forum/viewtopic.php?p=4058015#p4058015"]Что то не понял[/uquote] Кстати, Вас тоже никто не понимает.
Сначала Вы говорите про 5 бит, потом про 5 цифр.
Вас просили - приведите пример. Вы не приводите.
Одни догадки ...[/uquote]
В смысле догадки. Вот например.
lcd. print (P, DEC)

Вывожу переменную double в которой хранится значение давления на дисплей в десятичном виде. 748.84774730840000000090000909000000. Так ведь? А мне надо отсечь лишние цыфры после запятой. Так? Оставить только 748.84

Re: LCD 1602

Добавлено: Пт июл 09, 2021 07:08:14
veso74
ето переменная для pressure:
double ppp = 748.84774730840000000090000909000000;

для печати дисплея добавьте просто
lcd.print(ppp, 2);

и будет на екране 748.84

Re: LCD 1602

Добавлено: Пт июл 09, 2021 07:31:23
mixon46
[uquote="veso74",url="/forum/viewtopic.php?p=4058426#p4058426"]ето переменная для pressure:
double ppp = 748.84774730840000000090000909000000;

для печати дисплея добавьте просто
lcd.print(ppp, 2);

и будет на екране 748.84[/uquote]
Да здорово. Это работает.

Подскажи а почему команда lcd.print () есть. А в библиотеке я ее не могу найти. Я только изучаю как это все работает. И мне интересны все взаимосвязи языка c#. Библиотека LicuidCrystal I2C

Re: LCD 1602

Добавлено: Пт июл 09, 2021 12:11:15
BOB51
Потому что искать надо в базовой библиотеке
file:///C:/Arduino/reference/www.arduino.cc/en/Reference/Libraries.html
и далее
file:///C:/Arduino/reference/www.arduino.cc/en/Reference/LiquidCrystal.html
собственно это встроенная библиотека.
А LicuidCrystal I2C обеспечивает транспорт для ЖКИ с I2C интерфейсом, но использует методы из базовой библиотеки.
Да и в ардуине не С#, а Си/С++ используется - их и надо изучать.
8)

Re: LCD 1602

Добавлено: Сб июл 10, 2021 17:32:17
mixon46
Не нашёл этого метода в библиотеке liquidqcystal