Проблема с progressbar
- Войдите на сайт для отправки комментариев
Чт, 23/04/2020 - 13:30
Всем привет! сижу уже 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); }
а зачем вы каждый раз перерисовываете полоску полностью? Рисуйте только то, что изменилось. Если значение выросло - пририсуйте закрашенный кусочек от старого значения до нового . Если значение упало - рисуете от старого до нового значения прямоугольник пустой, который затрет старую полоску
Оно и работать будет быстрее. чем каждый раз весь прогрессбар рисовать
В том, что есть, нужно хотя бы строки 35 и 36 местами поменять. Нафига полоску рисовать, чтобы тут же сей момент её стереть? Сейчас черный прямоугольник живёт на экране гораздо дольше, чем полоска. Но мерцать всё равно будет. Лучше сразу сделать как b707 написал.
пририсуйте закрашенный кусочек от старого значения до нового .
А где взять старое значение и как узнать где новое? Я в этом еще не особо шарю.
А где взять старое значение и как узнать где новое? Я в этом еще не особо шарю.
Надо спросить у автора кода.
а зачем вы каждый раз перерисовываете полоску полностью? Рисуйте только то, что изменилось. Если значение выросло - пририсуйте закрашенный кусочек от старого значения до нового . Если значение упало - рисуете от старого до нового значения прямоугольник пустой, который затрет старую полоску
Оно и работать будет быстрее. чем каждый раз весь прогрессбар рисовать
Я пробовал делать прогресбар с десятью отдельными прямоугольниками ну все равно они мерцают
судя по этому обрывку кода - вы все равно перерисовываете все 10 прямоугольников, поэтому и мерцают.
Блин, я не понимаю. что сложного то? Вот представьте, что у вас значение увеличилось с 80 до 90. Что вы увидите на экране? - что полоска "подросла" от 80 до 90, ведь так? - ну так и рисуйте так же! - рисуйте только прямоугольник с координатами от 80 до 90, а остальное не трогайте! зачем все-то перерисовывать7
В душе не знаю как это делается, а если сделать просто символы | и tft.setTextColor(WHITE, BLACK); то есть
сработает?
Вам нужно отобразить прямоугольник у которого левая сторона в нуле, а правая в некоторой координате (максимум 230).
Допустим, на первом проходе цикла вы получили какое-то новое значение отображаемой величины, пересчитали его в координаты, получили допустим 200, запомнили это значение как старое, нарисовали белый прямоугольник от 0 до 200.
На следующем проходе цикла получаете новое значение Вашей величины. После пересчёта её в координаты сравниваете это значение со старым. Возможны три варианта:
1) Значения равны - ничего не делаем
2) Новое значение меньше старого, допустим 190. Вам нужно нарисовать чёрный прямоугольник от нового значения до старого - от 190 до 200
3) Новое значение больше старого, допустим 210. Вам нужно нарисовать белый прямоугольник от старого значения до нового - от 200 до 210
После этого независимо от варианта сохраняем новой значение как старое
Цикл повторяется. Всё. Программируйте! Детали можно потом подправить.
сработает?
нет.
Вы. прежде чем лезть программировать чепуху - разберитесь в принципе! Вы в идею отрисовки только изменений - вообще не вьезжаете, как я вижу...
сработает?
нет.
Вы. прежде чем лезть программировать чепуху - разберитесь в принципе! Вы в идею отрисовки только изменений - вообще не вьезжаете, как я вижу...
А вы не таким были? Я же не просто так создал тему в разделе для новичков? не въезжаю как видишь, неделю назад начал разбираться с ардуино, и вы хотите что бы я не задавал глупых вопросов? Зачем тогда этот форум?!
Конечно же для того, чтоб чужой код исправлять для новичков
А вы не таким были? Я же не просто так создал тему в разделе для новичков? не въезжаю как видишь, неделю назад начал разбираться с ардуино, и вы хотите что бы я не задавал глупых вопросов? Зачем тогда этот форум?!
я хочу. в первую очередь, чтобы ты не только задавал глупые вопросы и ждал готовых ответов, а пытался напрячь мозг и разобраться в том, что тебе обьясняют. Я тебе уже дважды обьяснил, в чем таоя проблема, а калапанга в #8 - так просто разжевал уже. Не пиши больше вопросов, а сначала сядь и постарайся въехать в те ответы, что тебе уже дали.. с этим у тебя как-то очень туго...