Прокрутка построчно текста на  TFT экране ARDUINO UNO

UjinYu
Offline
Зарегистрирован: 19.05.2020

Здравствуйте!

Я создаю универсальный диагностический прибор для удобства при сервисе. Идея прибора следующая: он считывает данные 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);
 
}

 

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

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

В библиотеке mcufriend есть вертикальная прокрутка текста, но она работает далеко не на всех дисплеях, ищите в примерах.

UjinYu
Offline
Зарегистрирован: 19.05.2020

Благодарю за направление! буду копать дальше... Есть пример подобного прибора (там совмещен NMEA тестер с NMEA генератором и в 3м режиме еще и как осциллограф работает, там прокрутка работает по мере заполнения экрана - текст уходит вверх за него, однако этот прибор работает на STM32. А с этой линейкой я пока не подружился... 

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

Советую подружится. на СТМ вашу задумку реализовать куда проще - там и место под буфер найдется (памяти ровно в 10 раз больше, чем на Уно), да и сама прокрутка будет работать четче и плавнее, так плата в 5 раз быстрее

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

b707 пишет:

На дисплеях без своего процессора 

Не, ну так-то ILI9341 - вполне себе процессор, графический контроллер ;)

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

Если контроллер ILI9341, то в даташите на него недвусмысленно намекается на возможность вертикального скролла для отображения куска графической памяти: https://cdn-shop.adafruit.com/datasheets/ILI9341.pdf страница 198.

Т.е. рисуем экран, и снизу ещё бантик. По мере необходимости скролла - двигаем область отрисовки путём посылки контроллеру команд. Это будет всяко быстрее, чем стирать весь экран.

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

Также ВНЕЗАПНО у класса Adafruit_ILI9341 - https://github.com/adafruit/Adafruit_ILI9341/blob/master/Adafruit_ILI9341.h есть метод scrollTo, который получает координату по Y и, я подозреваю, скроллит экран. Работает совместно с setScrollMargins, скорее всего.

Достаточно только залезть в доку, и оказывается, что всё уже украдено до нас. Но кто их читает, эти грёбаные инструкции, правда?

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

DIYMan пишет:

Также ВНЕЗАПНО у класса Adafruit_ILI9341 - https://github.com/adafruit/Adafruit_ILI9341/blob/master/Adafruit_ILI9341.h есть метод scrollTo

ага. я ж говорю что видел скроллинг в mcufriend... и даже пробовал...

UjinYu
Offline
Зарегистрирован: 19.05.2020

Да дело в том что я буквально несколько дней как, начал в это все вникать, библиотеку скачал, перелопатил а инструкции (кроме примера) не нашёл, видимо не там или не так искал, благодарю за ссылку, буду изучать. Просто по запросам в интернете по скроллингом ничего толком не нашёл, вот к людям знающим решил обратиться, когда упёрся в стену, решил спросить направление - куда ее обходить. Спасибо за информацию!