Проблема с progressbar

Miha_Axe
Offline
Зарегистрирован: 23.04.2020

Всем привет! сижу уже 3 дня голову ломаю. Не могу нормально настроить прогресбар, перечитал кучу тем по поводу мерцания и ничего не помогло, а может до меня просто не дошло. Вобщем все корректно показывает за исключением мерцания полоски прогресс бара. Пробовал черный прямоугольник на фоне рисовать как советовали но получилось мерцание, Без прямоугольника не мерцает но прогресбар идет только в сторону увеличения, а обратно не прорисовывается.  Монитор 2.4 ili9341 ардуино уно.

Вот видео мерцания https://www.youtube.com/watch?v=Ae-ed6fn8ks

#include <Adafruit_TFTLCD.h> // Hardware-specific library
#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin (1 -> 0 min 15 micros 0 -> 1)
#define LCD_CS A3 // Chip Select goes to Analog 3 (aktiv LOW)
#define LCD_RS A2 // Command/Data goes to Analog 2  (0 command, 1 data)
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0
#define SENSOR A5
#define    BLACK   0x0000
#define    BLUE    0x001F
#define    RED     0xF800
#define    GREEN   0x07E0
#define    CYAN    0x07FF
#define    MAGENTA 0xF81F
#define    YELLOW  0xFFE0
#define    WHITE   0xFFFF
Adafruit_TFTLCD tft(LCD_CS, LCD_RS, LCD_WR, LCD_RD, LCD_RESET);

void setup(void) {
  Serial.begin(9600); 
  //0x9488, 0x0154, 0x8357, 0x9341, 0x7575, 0x9328, 0x9327
  tft.begin(0x9341);
  tft.fillScreen(BLACK);
  delay(500);
}

void loop(void) {
  int raw = analogRead(SENSOR);
  raw = constrain(raw, 736, 1020); // датчик
  int FuelLevel = map(raw, 1020, 736, 0, 40); // датчик
  tft.setCursor(40, 15);
  tft.setTextSize(4);
  tft.setTextColor(WHITE, BLACK);
  tft.println(FuelLevel); 
  int FuelLeve2 = map(raw, 1020, 736, 0, 230); // датчик 
  tft.fillRect (0, 50, FuelLeve2, 34,WHITE); // прогресбар
  tft.fillRect (0, 50, 230, 34, 1); // черный прямоугольник на фоне
  delay(100);
}

 

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

а зачем вы каждый раз перерисовываете полоску полностью?  Рисуйте только то, что изменилось. Если значение выросло - пририсуйте закрашенный кусочек от старого значения до нового . Если значение упало - рисуете от старого до нового значения прямоугольник пустой, который затрет старую полоску

Оно и работать будет быстрее. чем каждый раз весь прогрессбар рисовать

kalapanga
Offline
Зарегистрирован: 23.10.2016

В том, что есть, нужно хотя бы строки 35 и 36 местами поменять. Нафига полоску рисовать, чтобы тут же сей момент её стереть? Сейчас черный прямоугольник живёт на экране гораздо дольше, чем полоска. Но мерцать всё равно будет. Лучше сразу сделать как b707 написал.

Miha_Axe
Offline
Зарегистрирован: 23.04.2020

b707 пишет:

пририсуйте закрашенный кусочек от старого значения до нового . 

А где взять старое значение и как узнать где новое? Я в этом еще не особо шарю. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Miha_Axe пишет:

А где взять старое значение и как узнать где новое? Я в этом еще не особо шарю. 

Надо спросить у автора кода. 

Miha_Axe
Offline
Зарегистрирован: 23.04.2020

b707 пишет:

а зачем вы каждый раз перерисовываете полоску полностью?  Рисуйте только то, что изменилось. Если значение выросло - пририсуйте закрашенный кусочек от старого значения до нового . Если значение упало - рисуете от старого до нового значения прямоугольник пустой, который затрет старую полоску

Оно и работать будет быстрее. чем каждый раз весь прогрессбар рисовать

Я пробовал делать прогресбар с десятью отдельными прямоугольниками ну все равно они мерцают 

//====================================1
  if (raw<1020) {
   tft.fillRect(10, 50, 30, 34, WHITE);
  }
  else{
    tft.fillRect(10, 50, 30, 34, BLACK);
  }
  //====================================2
  if (raw<992) {
   tft.fillRect(31, 50, 50, 34, WHITE);
  }
  else{
    tft.fillRect(31, 50, 50, 34, BLACK);
  }
  //====================================3
  if (raw<964) {
   tft.fillRect(51, 50, 70, 34, WHITE);
  }
  else{
    tft.fillRect(51, 50, 70, 34, BLACK);
  }

 

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

судя по этому обрывку кода - вы все равно перерисовываете все 10 прямоугольников, поэтому и мерцают.

Блин, я не понимаю. что сложного то? Вот представьте, что у вас значение увеличилось с 80 до 90. Что вы увидите на экране? - что полоска "подросла" от 80 до 90, ведь так? - ну так и рисуйте так же! - рисуйте только прямоугольник с координатами от 80 до 90, а остальное не трогайте!  зачем все-то перерисовывать7

Miha_Axe
Offline
Зарегистрирован: 23.04.2020

В душе не знаю как это делается, а если сделать просто символы | и tft.setTextColor(WHITE, BLACK); то есть

  if (raw<908) {
  tft.setTextColor(WHITE, BLACK);
  tft.println("|||");
  }
  else{
    tft.setTextColor(BLACK, BLACK);
  tft.println("|||");
  }
  if (raw<880) {
  tft.setTextColor(WHITE, BLACK);
  tft.println("   |||");
  }
  else{
    tft.setTextColor(BLACK, BLACK);
  tft.println("   |||");
  }
  if (raw<852) {
  tft.setTextColor(WHITE, BLACK);
  tft.println("      |||");
  }
  else{
    tft.setTextColor(BLACK, BLACK);
  tft.println("      |||");
  }

сработает? 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Вам нужно отобразить прямоугольник у которого левая сторона в нуле, а правая в некоторой координате (максимум 230).

Допустим, на первом проходе цикла вы получили какое-то новое значение отображаемой величины, пересчитали его в координаты, получили допустим 200, запомнили это значение как старое, нарисовали белый прямоугольник от 0 до 200.

На следующем проходе цикла получаете новое значение Вашей величины. После пересчёта её в координаты сравниваете это значение со старым. Возможны три варианта:

1) Значения равны - ничего не делаем

2) Новое значение меньше старого, допустим 190. Вам нужно нарисовать чёрный прямоугольник от нового значения до старого - от 190 до 200

3) Новое значение больше старого, допустим 210. Вам нужно нарисовать белый прямоугольник от старого значения до нового - от 200 до 210

После этого независимо от варианта сохраняем новой значение как старое

Цикл повторяется. Всё. Программируйте! Детали можно потом подправить.

 

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

Miha_Axe пишет:

 

сработает? 

нет.

Вы. прежде чем лезть программировать чепуху - разберитесь в принципе! Вы в идею отрисовки только изменений - вообще не вьезжаете, как я вижу...

Miha_Axe
Offline
Зарегистрирован: 23.04.2020

b707 пишет:

Miha_Axe пишет:

 

сработает? 

нет.

Вы. прежде чем лезть программировать чепуху - разберитесь в принципе! Вы в идею отрисовки только изменений - вообще не вьезжаете, как я вижу...

А вы не таким были? Я же не просто так создал тему в разделе для новичков? не въезжаю как видишь, неделю назад начал разбираться с ардуино, и вы хотите что бы я не задавал глупых вопросов? Зачем тогда этот форум?!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Конечно же для того, чтоб чужой код исправлять для новичков

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

Miha_Axe пишет:

А вы не таким были? Я же не просто так создал тему в разделе для новичков? не въезжаю как видишь, неделю назад начал разбираться с ардуино, и вы хотите что бы я не задавал глупых вопросов? Зачем тогда этот форум?!

я хочу. в первую очередь, чтобы ты не только задавал глупые вопросы и ждал готовых ответов, а пытался напрячь мозг и разобраться в том, что тебе обьясняют. Я тебе уже дважды обьяснил, в чем таоя проблема, а калапанга в #8 - так просто разжевал уже. Не пиши больше вопросов,  а сначала сядь и постарайся въехать в те ответы, что тебе уже дали.. с этим у тебя как-то очень туго...