рисовать прогресс-линию в зависимости от числа

multimax
Offline
Зарегистрирован: 07.11.2017

Доброго дня :) Возникла идея, для своего радиоприемика на ардуино сделать прогресс-бар. Полоску с точкой, которая симулирует шкалу аналогового радиоприемника, в зависимости от настроенной частоты...

По сути мне нужно рисовать линию, 

u8g.drawHLine(127, 0, 8);

при частоте 89.5 чтобы линия отсутствовала, и по мере перемещения к краю фм диапазона... до 108.0 Мгц, становилась от точки А до точки Б полностью. Может быть кто подскажет элегантное решение?) Есть переменная chastota, которая в которой и находится заветное число 99.5 или 105,6 (фм частота)... Были мысли сделат фиксированные точки отображения "ползунка" через if. Типа

 else if(chastota >= 85.5 && friendlyVolt < 90.0) {

u8g.drawHLine(127, 0, 8);

Но это как-то костыльно :( 

vvadim
Offline
Зарегистрирован: 23.05.2012

создайте массив значение и из него дёргайте

или функцией map воспользуйтесь

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Навскидку так:

#define ZERO_PERCENT_FREQ 89.5
#define HUNDRED_PERCENT_FREQ 108.0

#define ZERO_PERCENT_X 10
#define HUNDRED_PERCENT_X 100
#define Y_COORD 50


void drawProgressBar(float freq)
{
	int targetPercents = map(freq, ZERO_PERCENT_FREQ, HUNDRED_PERCENT_FREQ, 0, 100);
	int targetX = (HUNDRED_PERCENT_X - ZERO_PERCENT_X)/100.0 * targetPercents;
	
	u8g.drawLine(ZERO_PERCENT_X,Y_COORD,targetX,Y_COORD);
}

 

multimax
Offline
Зарегистрирован: 07.11.2017

нашел описание в инете, сделал) спасибо всем! сейчас покажу что вышло )))

multimax
Offline
Зарегистрирован: 07.11.2017

кстати, код вышел вот такой 

  //аналоговая шкала приемника НАЧАЛО
int frequency_map;
int real_frequency = channel;
  frequency_map = map(real_frequency, 875, 1080, 2, 124);
  
u8g.drawHLine(2, 46, frequency_map);
u8g.drawHLine(2, 47, frequency_map);
 u8g.drawRFrame(0, 44, 128, 6, 1);
  //аналоговая шкала приемника КОНЕЦ
 

 

multimax
Offline
Зарегистрирован: 07.11.2017

А вышло вот что) https://youtu.be/MqFE9IH37gc

У меня еще такой вопрос... как можно заметить в видео, выравнивание частоты и rds ps происходит по левой стороне... а вот как бы это замутить по центру или по правому боку? Как в ворде? Грубо говоря сейчас частота после ста и до 100 фм видна вот так:

105.5 |

90.0   |

Визуально хочется сделать, чтобы было так:

105.5 |

   90.0|

 

Но... как?

Если вывод частоты вот такой:

  u8g.setPrintPos(0, 37);
  u8g.println(channel/10.);

 

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

multimax пишет:

по центру или по правому боку? Как в ворде? Грубо говоря сейчас частота после ста и до 100 фм видна вот так:

105.5 |

90.0   |

Визуально хочется сделать, чтобы было так:

105.5 |

   90.0|

 

Но... как?

Если вывод частоты вот такой:

  u8g.setPrintPos(0, 37);
  u8g.println(channel/10.);

Очевидно, надо сперва получить ширину бокса, которая будет требоваться для отрисовки нужной строки, и потом просчитать смещение слева, банальная арифметика. В U8Glib есть функция https://github.com/olikraus/u8glib/wiki/userreference#getstrwidth - как раз для получения ширины в пикселях строки, которую можно отрисовать текущим шрифтом.

multimax
Offline
Зарегистрирован: 07.11.2017

вы не могли бы с примером показать :( если вам не трудно

b707
Offline
Зарегистрирован: 26.05.2017

multimax пишет:

вы не могли бы с примером показать :( если вам не трудно

мультимакс, зачем тут пример-то? Возьмите ширину экрана и вычтите их нее ширину строки - вот вам левая координата вашей надписи. Или вам нужно арифметику 2-ого класса обьяснить на примере? :)

vvadim
Offline
Зарегистрирован: 23.05.2012

multimax пишет:

А вышло вот что) https://youtu.be/MqFE9IH37gc

 

лучше бы не выкладывал - смотреть не возможно.

если не получается снять - не берись.

Дим
Offline
Зарегистрирован: 05.05.2017

DIYMan пишет:
В U8Glib есть функция https://github.com/olikraus/u8glib/wiki/userreference#getstrwidth - как раз для получения ширины в пикселях строки, которую можно отрисовать текущим шрифтом.

Не хочет отображаться. :(