Как приглушить фоновые светодиоды на TFT дисплее с помощью ILI9341

tft

Я купил 2,5-дюймовый; Экран TFT онлайн, оснащенный контроллером ILI9341. Мне нужно уменьшить яркость фоновых светодиодов, чтобы она соответствовала окружающему свету.

У этого конкретного экрана нет вывода для управления яркостью светодиодов с ШИМ через отдельный вход, поэтому мне нужно уменьшить яркость фоновых светодиодов этого дисплея с помощью программного обеспечения.

Zip-файл с библиотеками можно скачать здесь.

Кто-нибудь из вас знает, как подать команду на TFT-дисплей, чтобы приглушить фоновые светодиоды?

Заранее спасибо!

ОБНОВЛЕНИЕ 1:

Я написал новую функцию для установки яркости дисплея, управляя фоновыми светодиодами, но чего-то не хватает, так как кажется, что я правильно записываю на дисплей. Поэтому я пытаюсь заставить дисплей сначала отвечать на известную команду, например 0x28 (дисплей выключен).

Новая функция определена в Adafruit_TFTLCD.cpp:

// Устанавливаем яркость дисплея (фоновые светодиоды)
void Adafruit_TFTLCD::setDisplayBrightness(uint8_t x) {
  // Попробуйте с 0x28 (Display Off), чтобы увидеть, реагирует ли дисплей
  writeRegister8(0x28, 0);
  return;
}

Прототип функции определен в Adafruit_TFTLCD.h

// Новые функции
void setDisplayBrightness(uint8_t x);

Затем я вызываю функцию в своем основном цикле. Чтобы убедиться, я сначала пишу на экране несколько прямоугольников, жду 5 секунд, затем заливаю экран синим цветом, вызываю новую функцию и вхожу в бесконечный цикл, чтобы никакие другие команды не мешали:

  tft.fillScreen(BLUE);  
  tft.setDisplayBrightness(10); // Что на самом деле является командой 0x28 для проверки

Есть какие-нибудь подсказки, что я мог упустить?

Спасибо!

ОБНОВЛЕНИЕ 2:

Я дошел до того, что ILI9341 реагировал на некоторые команды, но не всегда и не на все команды. Я подозреваю, что есть что-то в том, как вы вводите команды, которые я упускаю (время?, последовательность?, другое?)

Вот что я выяснил на данный момент:

Я могу заставить дисплей реагировать на команду Display Off (0x28), но только когда я ввожу ее в функцию begin(..). Итак, исходный код в Adafruit_TFTLCD.cpp выглядит так:

void Adafruit_TFTLCD::begin(uint16_t id) {
...
writeRegister8(ILI9341_DISPLAYON, 0); 
delay(500);

Если я изменю его на следующее, дисплей останется белым:

void Adafruit_TFTLCD::begin(uint16_t id) {
...
writeRegister8(ILI9341_DISPLAYON, 0); 
writeRegister8(ILI9341_DISPLAYOFF, 0); // Отключение дисплея объявлено как 0x28
delay(500);

Итак, у меня есть реакция на команду 28h.

Затем я попробовал функцию 0x51 в функции begin(...):

void Adafruit_TFTLCD::begin(uint16_t id) {
...
writeRegister8(ILI9341_DISPLAYON, 0); 
delay(500);
writeRegister8(0x51, 0x80); // Тестовая команда 0x51 - интенсивность фона
delay(500);

Безрезультатно :-(

Я даже добавил команду 0xBE (частота фоновой ШИМ), чтобы посмотреть, повлияет ли это, но ничего :-(

void Adafruit_TFTLCD::begin(uint16_t id) {
  ...
  writeRegister8(ILI9341_DISPLAYON, 0);
  writeRegister8(0xbe, 0x80);
  delay(500);
  writeRegister8(0x51, 0x0);
  delay(500);

Также, если я введу команду 0x28:

writeRegister8(ILI9341_DISPLAYOFF, 0)

в другом месте Adafruit_TFTLCD (например, в FillScreen, Fill Rect и т. д.) это тоже не работает).

Есть идеи? Они будут высоко оценены!

, 👍6

Обсуждение

Какой щит? Нам нужно знать это, чтобы знать, возможно ли это вообще. ILI9341 не обеспечивает управление подсветкой, как чипы, такие как SSD1963, поэтому вы не можете сделать это с помощью драйвера. Если он жестко подключен к + 5 В, вам не повезло., @Majenko

Кроме команды 0x51?, @Ignacio Vazquez-Abrams

Хорошо, это новое для меня. Я опирался на свой опыт работы с другими чипами ILI, и это первый, который я видел со светодиодным драйвером. TBH Я не использовал дисплей 9341, только 9340. Это дисплей, который я хотел заполучить для реализации в DisplayCore, но просто не дошел до него. Хорошо, так что игнорируйте этот комментарий об отсутствии контроля - там *может* быть контроль, если он используется, и библиотека *может* быть в состоянии сделать это или быть изменена для этого. Тем не менее, нам все еще нужно знать, что это за щит, чтобы мы знали, как он подключен., @Majenko

Это был интересный вызов. Вроде есть набор команд для управления подсветкой согласно спецификации продукта; уровень яркости, частота ШИМ, переход яркости и т.д. Это потребует написания некоторых новых функций драйвера., @Mikael Patel

Господа, это действительно интересный вызов :-). Я купил плату здесь: http://www.banggood.com/UNO-R3-ATmega328P-Board-2_4-Inch-TFT-LCD-Screen-Module-For-Arduino-p-945755.html. схема которая здесь: https://www.copy.com/s/t%3AwTDo10LVmZFHSxZc%3Bp%3A%252F2.4%2520schematic%25209325.pdf%3Boid%3A74 На их сайте есть подробные фото и можно посмотреть как щит выглядит. К сожалению, больше информации у продавца нет., @kxtronic

@Ignacio: у вас есть фрагмент кода, показывающий, как вводить команду 0x51? Я хотел бы попробовать., @kxtronic

Нет, просто следуйте таблице данных., @Ignacio Vazquez-Abrams

Я пробовал команду 51h (Write Display Brightness), написав 0x51, xx (для xx я пробовал разные значения) безрезультатно. Я также комбинировал его с командой 53h (Write CTRL Display) с 0x53, 0x28 и 0x53,00, тоже безрезультатно. Похоже мне нужна правильная последовательность команд + параметры, @kxtronic

Команда 0x28 сработала, как ожидалось?, @SoreDakeNoKoto

Я мог заставить дисплей реагировать на 0x28, но только при инициализации дисплея, а не где-либо еще. Пожалуйста, смотрите мое обновление № 2, @kxtronic

Это безумие, что они жестко подключили его. Зачем писать таблицу данных, если она не будет правильной? У меня видимо такой же дисплей! Может быть, мы сможем перевести дисплей в спящий режим. То есть еще команда "10h" и выход из сна это "11h"., @Mark Grass

Я согласен, что убивать эту функцию безумно :-( Перевод дисплея в спящий режим не работает, потому что мне все еще нужно, чтобы дисплей был живым ночью (но затемнен)., @kxtronic


5 ответов


0

Похоже, им можно управлять с помощью команды 0x51.

Я бы модифицировал библиотеку и добавил новый метод в класс Adafruit_ILI9341_8bit_AS, например:

void Adafruit_ILI9341_8bit_AS::setBacklight(uint8_t brightness) {
    writeRegister8(0x51, brightness);
}

Затем вы можете изменить яркость, вызвав этот метод для вашего TFT-объекта в скетче. (Конечно, не забудьте добавить прототип в определение класса в заголовочном файле).

,

Привет, Маженко, я последовал твоему совету, но все еще могу заставить это работать. Пожалуйста, смотрите мое обновление в исходном вопросе, @kxtronic


3

Я связался с производителем экрана, они сообщили, что фоновые светодиоды зашиты и не управляются через ILI9341. Таким образом, в этом щите нельзя приглушить фоновую подсветку

:-(

Я поищу другой экран TFT и перед покупкой удостоверюсь, что он поддерживает затемнение.

,

Это странно. BL контакта нет? Есть ли у вас схема или хотя бы изображение модуля?, @next-hack

Нет, на этой плате нет контакта BL. Я спросил у производителя, и они ответили, что этот контакт жестко зашит, и мне не хочется резать/паивать дорожки на печатной плате., @kxtronic

Очень жаль :/ Такое глупое решение производителя., @next-hack

Ага. В итоге я отказался от проекта по другим причинам. Я обнаружил, что другие платы обмениваются данными последовательно и предоставляют возможность приглушить подсветку с помощью команды. Это означает исследовать TFT-экраны перед покупкой :-), @kxtronic


0

Посмотрев на схему (у меня другая), но на контакте 16 помечен как BL. Если это действительно мощность светодиодной подсветки, то приложенное к ней напряжение должно изменять яркость. Внимание: вам нужно знать, какой ток потребляют светодиоды. Если превышен предел для вывода ШИМ, вам придется пропустить его через транзистор, чтобы увеличить ток.

,

1

Большинство из этих дешевых китайских ЖК-модулей имеют светодиодную подсветку, жестко подключенную к Vcc и GND, и ими нельзя управлять.

Тем не менее, изучив модуль, который у меня есть, и некоторые аналогичные в Интернете, я обнаружил, что у большинства из них есть контакты светодиодов подсветки, доступные через гибкий кабель ЖК-панели. Если ваш похож на тот, что на картинке, то вы заметите, что основной гибкий кабель предназначен для самого ЖК-дисплея, и к нему обычно подключены два других гибких кабеля. Тот, что слева, предназначен для сенсорной панели (если есть), а тот, что справа, — для светодиодов подсветки (иногда он подключается к задней стороне шлейфа).

На этой панели и на моей (немного отличается от этой) они помечены как K1, K2, K3 и K4, которые в основном являются катодной стороной светодиода (отрицательная сторона), и они выставлены как отдельные контакты в основной гибкий кабель, в то время как анод припаян к основному гибкому кабелю Vcc, и к нему нельзя легко получить доступ, не отпаяв гибкий светодиодный кабель.

Поэтому, чтобы управлять подсветкой, вам нужно разрезать дорожку на печатной плате (не на гибком кабеле) и подключить ее к транзистору, которым вы управляете через Arduino.

  • Дважды проверьте полярность на ЖК-дисплее, она может отличаться от моей.
,

0

Мне удалось уменьшить яркость подсветки на ili9341, просто модулируя контакт, к которому подключен светодиод.

Обратите внимание, я использую teensy 3.2, ваш пробег может отличаться.

ledPin=32;

void loop() {
analogWrite(ledPin, 60);
,