Прокрутка построчно текста на TFT экране ARDUINO UNO
- Войдите на сайт для отправки комментариев
Здравствуйте!
Я создаю универсальный диагностический прибор для удобства при сервисе. Идея прибора следующая: он считывает данные NMEA посылки протоколов RS422/485 RS232 и без изменений пересылает их на 2.8 TFT экран.
Я добился чтения и построчного вывода дюнных на экран, однако когда экран заполняется данными, - новые данные не выводятся, так как экран не прокручивается вниз, нигде не могу найти способ чтоб при заполнении экрана, строки сдвигались вверх, верхняя уходила за дисплей и исчезала и тем самым давала место на вывод строки с новыми данными. Полная заливка экрана через ноне время - не вариант так как занимает много времени и стирает все с экрана, даже если данные не поступают, а нужно чтоб последние строки данных оставались на экране.
Так же нигде не нашел информации о том как сделать скорость чтения БОД данных с порта - изменяемой при помощи кнопок вверх и вниз от 2400 бод до 115200 бод в реальном времени.
За помощь. и подсказку буду крайне признателен.
ниже скетч:
#include "SPI.h" #include "Adafruit_GFX.h" // Библиотека обработчика графики #include "Adafruit_ILI9341.h" // Программные драйвера для дисплеев ILI9341 #define TFT_DC 9 // Пин подключения вывода D/C дисплея #define TFT_CS 10 // Пин подключения вывода CS дисплея #define TFT_RST 8 #define TFT_MISO 12 // Пин подключения вывода дисплея SDO(MISO) #define TFT_MOSI 11 // Пин подключения вывода дисплея SDI(MOSI) #define TFT_CLK 7 // Пин подключения вывода дисплея SCK Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO); // Создаем объект дисплея и сообщаем библиотеке распиновку для работы с графикой void setup() { Serial.begin(9600); tft.begin(); // Иницализируем дисплей tft.setRotation(1); // Переводим дисплей в альбомную ориентацию tft.fillScreen(ILI9341_BLACK); tft.setCursor(4, 4); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(2); } void loop() { while (Serial.available() == 1); String val = Serial.readStringUntil('\n'); String data = ""; data += val; //tft.setCursor(0, 0); //tft.setTextColor(ILI9341_WHITE); tft.setTextSize(2); //tft.println(val); tft.println(data); Serial.println(val); delay(500); }
На дисплеях без своего процессора единсвенный вариант - это стирать весь экран полностью и выводить те же строчки на одну строку выше. И так каждый раз. В принципе, реализовать в коде это совсем нетрудно, но понадобится хранить все строки в каком-то буфере. что на Уно может оказаться проблематичным (мало паямти)
В библиотеке mcufriend есть вертикальная прокрутка текста, но она работает далеко не на всех дисплеях, ищите в примерах.
Благодарю за направление! буду копать дальше... Есть пример подобного прибора (там совмещен NMEA тестер с NMEA генератором и в 3м режиме еще и как осциллограф работает, там прокрутка работает по мере заполнения экрана - текст уходит вверх за него, однако этот прибор работает на STM32. А с этой линейкой я пока не подружился...
Советую подружится. на СТМ вашу задумку реализовать куда проще - там и место под буфер найдется (памяти ровно в 10 раз больше, чем на Уно), да и сама прокрутка будет работать четче и плавнее, так плата в 5 раз быстрее
На дисплеях без своего процессора
Не, ну так-то ILI9341 - вполне себе процессор, графический контроллер ;)
Если контроллер ILI9341, то в даташите на него недвусмысленно намекается на возможность вертикального скролла для отображения куска графической памяти: https://cdn-shop.adafruit.com/datasheets/ILI9341.pdf страница 198.
Т.е. рисуем экран, и снизу ещё бантик. По мере необходимости скролла - двигаем область отрисовки путём посылки контроллеру команд. Это будет всяко быстрее, чем стирать весь экран.
Также ВНЕЗАПНО у класса Adafruit_ILI9341 - https://github.com/adafruit/Adafruit_ILI9341/blob/master/Adafruit_ILI9341.h есть метод scrollTo, который получает координату по Y и, я подозреваю, скроллит экран. Работает совместно с setScrollMargins, скорее всего.
Достаточно только залезть в доку, и оказывается, что всё уже украдено до нас. Но кто их читает, эти грёбаные инструкции, правда?
Также ВНЕЗАПНО у класса Adafruit_ILI9341 - https://github.com/adafruit/Adafruit_ILI9341/blob/master/Adafruit_ILI9341.h есть метод scrollTo
ага. я ж говорю что видел скроллинг в mcufriend... и даже пробовал...
Да дело в том что я буквально несколько дней как, начал в это все вникать, библиотеку скачал, перелопатил а инструкции (кроме примера) не нашёл, видимо не там или не так искал, благодарю за ссылку, буду изучать. Просто по запросам в интернете по скроллингом ничего толком не нашёл, вот к людям знающим решил обратиться, когда упёрся в стену, решил спросить направление - куда ее обходить. Спасибо за информацию!