Управление подсветкой tft дисплея

Управление яркостью подсветки 7-ми дюймового TFT LCD

Введение

В настоящее время я занимаюсь проектом на Arduino с использованием TFT дисплея. Недавно мне захотелось добавить в него, казалось бы, простую функцию — функцию регулировки яркости. Нашёл в документации к библиотеке для работы с TFT дисплеем (UTFT Library) нужный метод: setBrightness(br);

Написал весь код, сделал все, как надо. Решил проверить, но, к моему удивлению, ничего не происходило. Начал разбираться. Спустя два дня, заметил небольшое примечание к методу: «This function is currently only supported on CPLD-based displays.» То есть, данная библиотека, не поддерживает мой дисплей. Но я узнал, что сам дисплей регулировку яркости поддерживает. Очень долго искал в интернете способы настройки, но так и не нашёл, поэтому решил добиться своей цели сам, несмотря ни на что, и у меня это получилось. И вот решил поделиться с теми, кому это может пригодиться.

Что нам понадобится?

  • В качестве основы, я использовал Frearduino ADK v.2.2 на базе процессора ATmega2560
  • TFT LCD Mega Shield v.2.2
  • Сам дисплей — 7″ TFT LCD SSD1963 (Тут вы найдёте его описание, а так же необходимую документацию)
  • UTFT Library — универсальная библиотека для работы с TFT дисплеями (Найти саму библиотеку, а так же документацию можно тут)
  • Паяльник

Разберёмся с железом

Открыв схему дисплея, можно увидеть, что на конвертер mp3032 идет три входа: LED-A, PWM, 5V. Изначально, PWM неактивен. Этот вход не используется совсем. Подсветка управляется LED-A.

Если взглянуть на обратную сторону дисплея, можно найти область, подписанную как «Backlight control» . Здесь то мы и найдём эти самые входы. Для управления подсветкой методом ШИМ, необходимо сделать так, чтобы все было наоборот: LED-A — неактивен, PWM — активен. Для этого придётся перепаять перемычку. Вот фото того, что должно получиться:

Программная часть

Так как наша библиотека не может дать то, что нам надо, мы сами напишем нужную функцию. Для этого откроем документацию к контроллеру, управляющему дисплеем (SSD1963). Управление SSD1963 осуществляется с помощью специальных команд, которые передаются с Arduino через специальные выходы, которые описаны в документации:

Управление осуществляется следующим образом: Arduino выводит через RS (D/C в таблице) 0, если мы собираемся передавать команду, 1 — если данные. После передачи команды, RS переключается на 1, и далее передаются необходимые параметры. Все команды и параметры передаются через выходы D0-D7. Если у вас ATmega2560, то все эти восемь выходов объединены в порт C.

Итак, для начала, напишем функцию передачи данных по шине. Для удобства использования, я буду писать прямо в UTFT.h:

Также стоит обратить внимание на названия методов, так как в библиотеке уже могут встретиться функции с такими же именами.
Добавим две функции для вывода команд и данных:

Теперь сама настройка подсветки. Чтобы узнать, как осуществить все это, открываем документацию и ищем команду для настройки PWM.

Примечание:

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

То есть, сначала мы должны передать команду «0xBE», а потом, в качестве 3-х параметров передать частоту сигнала, длительность рабочего цикла, а также третий параметр, который определяет, включен DBC или нет (0x01 — выключен, 0x09 — включен).

Для регулировки самой яркости, необходимо изменять лишь частоту рабочего цикла. Так как мы передаём данные в виде одного байта, то значения цикла могут быть от 0 до 255. Я решил определить 9 уровней яркости (от 0 до 8). Следовательно, все 256 значений нужно разбить на 9 ступеней. Но также стоит обратить внимание на то, что если ступени будут равными, то яркость будет изменяться не так плавно, как хотелось бы. То есть уже, к примеру, на 4-ой ступени, яркость будет почти максимальной, а с 4-ой по 8-ую ступень будет изменять почти незаметно. Учитывая это, я решил использовать геометрическую прогрессию со знаменателем 2. То есть яркость будет вычисляться по следующей формуле: (2 ^ lvl) — 1 , где lvl — уровень яркости от 0 до 8. Обратите внимание, что так как значения начинаются с нуля, то необходимо вычесть единицу. Конечно, вы можете выбрать ступени и их значения сами, но я привёл вот такой, довольно просто пример. Теперь сам код:

Источник

Работа с цветными графическими дисплеями TFT (библиотека UTFT)

Библиотека

Поддерживаемые дисплеи

Дисплеи Инициализация
Цветной графический дисплей 2.8 TFT 320х240 Данный дисплей совместим с любыми Arduino.

UTFT myGLCD(TFT01_24SP, 6, 5, 4, 3, 2);

Дисплей можно подключать к любым выводам Arduino указав № выводов при объявлении объекта myGLCD библиотеки UTFT:
UTFT myGLCD(TFT01_24SP, SDI/MOSI, SCK, CS, RESET, DC/RS);

На дисплее установлен преобразователь уровней, так что его можно подключать и к 3В и к 5В логике.

Описание работы с сенсорным экраном находится в разделе Wiki работа с TouchScreen

Данный дисплей совместим только с Arduino Mega.

UTFT myGLCD(TFT32MEGA, 38, 39, 40, 41); // дисплей на чипе ILI9341.
или
UTFT myGLCD(TFT32MEGA_2, 38, 39, 40, 41); // дисплей на чипе HX8357C.

Дисплеи поставляются на базе чипа ILI9341 или HX8357C. Если изображение на дисплее отображается зеркально, то измените тип дисплея: укажите либо TFT32MEGA, либо TFT32MEGA_2.

Если Вы не планируете использовать SD карту, то выводы 50-53 можно использовать для подключения других модулей.

Выводы не подписанные на рисунке, не используются дисплеем.

Цветной графический дисплей 2.8 TFT 320×240 UNO
Данный дисплей совместим только с Arduino Uno.

UTFT myGLCD(TFT28UNO, A2, A1, A3, A4, A0);

Если Вы не планируете использовать SD карту, то выводы 10-13 можно использовать для подключения других модулей.

Выводы не подписанные на рисунке, не используются дисплеем.

Описание работы с сенсорным экраном находится в разделе Wiki работа с TouchScreen

Цветной графический дисплей 2.4 TFT 240×320
Данный дисплей совместим с любыми Arduino.

UTFT myGLCD(TFT01_24SP, 5, 4, 8, 7, 6);

Дисплей можно подключать к любым выводам Arduino указав № выводов при объявлении объекта myGLCD библиотеки UTFT:
UTFT myGLCD(TFT01_24SP, SDI/MOSI, SCK, CS, RESET, DC/RS);

Уровень логической «1» на входах дисплея ≤ 3,3 В.
Если Вы используете 5 В логику, то подключайте входы дисплея через делители:

При питании от 3,3 В необходимо замкнуть перемычку J1 на обратной стороне платы дисплея.

Если Вы желаете использовать SD-карту, то выводы SD_CS, SD_MOSI, SD_MISO и SD_SCK необходимо подключить к Arduino по аппаратной шине SPI:

Если аппаратный вывод CS(SS) Arduino занят, то вывод SD_CS можно подключить к любому другому выводу Arduino, указав его номер в скетче (см пример в файле image_SD библиотеки UTFT).

TouchScreen можно подключать к любым выводам Arduino указав № выводов при объявлении объекта myTouch библиотеки URTouch:
URTouch myTouch( T_CLK, T_CS, T_DIN, T_OUT, T_IRQ);
Например: URTouch myTouch(13, 12, 11, 10, 9);

Указанные в примере выводы Arduino для подключения TouchScreen пересекаются с выводами аппаратной шины SPI на платах Arduino Uno, Pro Mini, Nano и т.д. Если Вы желаете использовать на этих платах и TouchScreen, и SD-карту , то для TouchScreen нужно выбрать другие выводы Arduino, например, аналоговые выводы A0-A4, указав их в скетче при объявлении объекта:
URTouch myTouch(A0, A1, A2, A3, A4);

Описание работы с сенсорным экраном со встроенным контроллером функций TouchScreen находится в разделе Wiki работа с TouchScreen по последовательной шине данных.

Данный дисплей совместим с любыми Arduino.

UTFT myGLCD(TFT01_22SP, 5, 4, 8, 7, 6);

UTFT myGLCD(TFT18SHLD, 5, 4, 8, 7, 6);

Дисплей можно подключать к любым выводам Arduino указав № выводов при объявлении объекта myGLCD библиотеки UTFT:
UTFT myGLCD(TFT01_22SP, SDI/MOSI, SCK, CS, RESET, DC/RS);

Уровень логической «1» на входах дисплея ≤ 3,3 В.
Если Вы используете 5 В логику, то подключайте входы дисплея через делители:

Если Вы желаете использовать SD-карту, то выводы SD_CS, SD_MOSI, SD_MISO и SD_SCK необходимо подключить к Arduino по аппаратной шине SPI:

Если аппаратный вывод CS(SS) Arduino занят, то вывод SD_CS можно подключить к любому другому выводу Arduino, указав его номер в скетче (см пример в файле image_SD библиотеки UTFT).

Если Вы собираетесь использовать библиотеку UTFT для работы с другими дисплеями, то закомментируйте строку с названием Вашего дисплея в файле «memorysaver.h». А для экономии памяти, раскомментируйте остальные строки кода файла «memorysaver.h».

#1 Пример

Выводим на дисплей текст тремя базовыми шрифтами:

#2 Пример

Заливаем весь дисплей различными цветами:

#3 Пример

Рисуем различные графические элементы:

Базовые функции:

Все функции:

  • InitLCD([положение]); – Инициирует начало работы с дисплеем. Необязательный параметр может принимать одно из двух значений: PORTRAIT (вертикальная ориентация) или LANDSCAPE (горизонтальная ориентация — по умолчанию).
  • clrScr(); – Очищает дисплей, стирая всю отображаемую на дисплее информацию и заливая дисплей черным цветом.
  • fillScr(color); – Очищает дисплей, стирая всю отображаемую на дисплее информацию и заливая его указанным в качестве параметра цветом фона.
  • getDisplayXSize(); – Возвращает количество пикселей дисплея по горизонтали, число типа int.
  • getDisplayYSize(); – Возвращает количество пикселей дисплея по вертикали, число типа int.
  • setColor(color); – Выбор цвета для текста и фигур, выводимых после данной функции.
  • getColor(); – Возвращает установленный цвет для текста и фигур в формате RGB565, число типа word.
  • setBackColor(color); – Выбор цвета для фона текста, выводимого после данной функции.
  • getBackColor(); – Возвращает установленный цвет для фона текста в формате RGB565, число типа word.
  • setFont(fontName); – Выбор шрифта для текста выводимого после данной функции.
  • getFont(); – Возвращает указатель на выбранный шрифт.
  • getFontXsize(); – Возвращает количество пикселей в одном символе шрифта, по ширине.
  • getFontYsize(); – Возвращает количество пикселей в одном символе шрифта, по высоте.
  • print(str,x,y[,r]); – Вывод на дисплей строк или содержимого строковых переменных.
  • printNumI(int,x,y[,len[,sym]]); – Вывод на дисплей целого числа или содержимого целочисленной переменной.
  • printNumF(float,dec,x,y[,sym1[,len[,sym2]]]); – Вывод на дисплей вещественного числа или содержимого переменной вещественного типа
  • drawPixel(x,y); – Вывод на дисплей точки. Цвет точки определяется текущим значением цвета, устанавливаемым командой setColor().
  • drawLine(x1,y1,x2,y2); – Вывод на дисплей линии, заданной координатами двух точек.
  • drawRect(x1,y1,x2,y2); – Вывод на дисплей прямоугольника, противоположные углы которого заданы координатами двух точек.
  • drawRoundRect(x1,y1,x2,y2); – Вывод на дисплей прямоугольника со скругленными углами.
  • fillRect(x1,y1,x2,y2); – Вывод на дисплей закрашенного прямоугольника.
  • drawCircle(x,y,R); – Вывод на дисплей окружности, определяемую координатами центра и радиусом.
  • fillCircle(x,y,R); – Вывод на дисплей закрашенной окружности.
  • drawBitmap(x1,y1,x2,y2,data[,scale]); – Вывод на дисплей картинки из массива.
  • Для вывода на дисплей картинки из файла с SD-карты нужно вызвать функцию load(x1,y1,x2,y2,data); объекта библиотеки UTFT_SdRaw.
    Для работы функции load, нужно установить и подключить библиотеки: UTFT_SdRaw и SdFat.

Инициализация работы с дисплеем:

InitLCD( [положение] );
Инициализация работы с дисплеем, с указанием его положения.

InitLCD(PORTRAIT); // инициализация (вертикальное положение)

Параметр:

    Положение может быть горизонтальным или вертикальным:
  • положение: PORTRAIT — вертикальное
  • положение: LANDSCAPE — горизонтальное (по умолчанию)

Очистка экрана:

clrScr();
Очистка экрана с заливкой дисплея чёрным цветом
Параметр: Без параметров.
fillScr( color );
Очистка экрана с заливкой заданным цветом.

fillScr(VGA_RED); // красный цвет

Параметр:

    Цет можно задать тремя способами:
  • color: По названию цвета — VGA_RED
  • color: В формате RGB565 — 0x001F
  • color: В формате RGB — 255,100,0

Выбор цвета:

setColor( color );
Выбор цвета для текста и фигур, выводимых после данной функции.

setColor(0,0,255); // синий цвет

Параметр:

    Цет можно задать тремя способами:
  • color: По названию цвета — VGA_RED
  • color: В формате RGB565 — 0x001F
  • color: В формате RGB — 255,100,0
setBackColor( color );
Выбор цвета для фона текста, выводимого после данной функции.

setBackColor(2016); // зелёный цвет

Параметр:

    Цет можно задать тремя способами:
  • color: По названию цвета — VGA_RED
  • color: В формате RGB565 — 0x001F
  • color: В формате RGB — 255,100,0

Удобнее всего устанавливать цвет по его названию:
Полный перечень цветов: VGA_BLACK, VGA_WHITE, VGA_RED, VGA_GREEN, VGA_BLUE, VGA_SILVER, VGA_GRAY, VGA_MAROON, VGA_YELLOW, VGA_OLIVE, VGA_LIME, VGA_AQUA, VGA_TEAL, VGA_NAVY, VGA_FUCHSIA, VGA_PURPLE, VGA_TRANSPARENT.

Выбор шрифта:

setFont( fontName );
Выбор шрифта для текста выводимого после данной функции.

setFont(SmallFont); // маленький шрифт

Параметр:

    По умолчанию в библиотеке есть 3 шрифта:
  • fontName: SmallFont — маленький шрифт
  • fontName: BigFont — большой шрифт
  • fontName: SevenSegNumFont — шрифт имитирующий семисегментный индикатор

Вывод текста:

print( str , x , y [, r] );
Выводит на дисплей строки или содержимое строковых переменных.

print(«iarduino», 50, 50); // текст «iarduino» горизонтально
print(«iarduino», 50, 50, 90); // текст «iarduino» вертикально

Параметры:

  • str: строка или содержимое строковой переменной
  • x: координата X
  • y: координата Y координаты верхнего левого угла области печати
    (x можно указать как число или LEFT / RIGHT / CENTER)
  • r: поворот текста в градусах, вокруг точки x,y
    r — необязательный параметр
printNumI( int , x , y [, len [, sym ] ] );
Выводит на дисплей целые числа или содержимое целочисленных переменных.

printNumI(2000,50,50); // результат: «2000»
printNumI(2000,50,50,0); // результат: «2000»
printNumI(2000,50,50,5); // результат: » 2000″
printNumI(2000,50,50,6,’0′); // результат: «002000»

Параметры:

  • int: целое число или содержимое целочисленной переменной
  • x: координата X
  • y: координата Y координаты верхнего левого угла области печати
    (x можно указать как число или LEFT / RIGHT / CENTER)
  • len: количество выводимых разрядов числа int.
    игнорируется если len меньше количества разрядов int.
    необязательный параметр, по умолчанию: 0
  • sym: символ заменяющий недостающие разряды.
    необязательный параметр, по умолчанию: ‘ ‘
    (если len больше чем количество разрядов числа int, то недостающие разряды перед числом будут заменены на sym.)
printNumF( float , dec, x , y [, sym1 [, len [, sym2 ] ] ] );
Выводит на дисплей вещественные числа или содержимое переменных вещественного типа.

printNumF(-234.3442,2,50,50); // результат «-234.34»
printNumF(-234.3442,3,50,50); // результат «-234.344»
printNumF(-234.3442,4,50,50,’*’); // результат «-234*3442»
printNumF(-234.3442,1,50,50,’,’,1); // результат «-234,3»
printNumF(-234.3442,1,50,50,’,’,7); // результат » -234,3″
printNumF(-234.3442,1,50,50,’,’,7,’0′); // результат «-0234,3»

Источник

Читайте так же:  Подсветка в такт как сделать
Оцените статью
Охраны в доме нет
Adblock
detector