Как приглушить фоновые светодиоды на TFT дисплее с помощью ILI9341
Я купил 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 и т. д.) это тоже не работает).
Есть идеи? Они будут высоко оценены!
@kxtronic, 👍6
Обсуждение5 ответов
Похоже, им можно управлять с помощью команды 0x51.
Я бы модифицировал библиотеку и добавил новый метод в класс Adafruit_ILI9341_8bit_AS
, например:
void Adafruit_ILI9341_8bit_AS::setBacklight(uint8_t brightness) {
writeRegister8(0x51, brightness);
}
Затем вы можете изменить яркость, вызвав этот метод для вашего TFT-объекта в скетче. (Конечно, не забудьте добавить прототип в определение класса в заголовочном файле).
Привет, Маженко, я последовал твоему совету, но все еще могу заставить это работать. Пожалуйста, смотрите мое обновление в исходном вопросе, @kxtronic
Я связался с производителем экрана, они сообщили, что фоновые светодиоды зашиты и не управляются через ILI9341. Таким образом, в этом щите нельзя приглушить фоновую подсветку
:-(
Я поищу другой экран TFT и перед покупкой удостоверюсь, что он поддерживает затемнение.
Это странно. BL контакта нет? Есть ли у вас схема или хотя бы изображение модуля?, @next-hack
Нет, на этой плате нет контакта BL. Я спросил у производителя, и они ответили, что этот контакт жестко зашит, и мне не хочется резать/паивать дорожки на печатной плате., @kxtronic
Очень жаль :/ Такое глупое решение производителя., @next-hack
Ага. В итоге я отказался от проекта по другим причинам. Я обнаружил, что другие платы обмениваются данными последовательно и предоставляют возможность приглушить подсветку с помощью команды. Это означает исследовать TFT-экраны перед покупкой :-), @kxtronic
Посмотрев на схему (у меня другая), но на контакте 16 помечен как BL. Если это действительно мощность светодиодной подсветки, то приложенное к ней напряжение должно изменять яркость. Внимание: вам нужно знать, какой ток потребляют светодиоды. Если превышен предел для вывода ШИМ, вам придется пропустить его через транзистор, чтобы увеличить ток.
Большинство из этих дешевых китайских ЖК-модулей имеют светодиодную подсветку, жестко подключенную к Vcc и GND, и ими нельзя управлять.
Тем не менее, изучив модуль, который у меня есть, и некоторые аналогичные в Интернете, я обнаружил, что у большинства из них есть контакты светодиодов подсветки, доступные через гибкий кабель ЖК-панели. Если ваш похож на тот, что на картинке, то вы заметите, что основной гибкий кабель предназначен для самого ЖК-дисплея, и к нему обычно подключены два других гибких кабеля. Тот, что слева, предназначен для сенсорной панели (если есть), а тот, что справа, — для светодиодов подсветки (иногда он подключается к задней стороне шлейфа).
На этой панели и на моей (немного отличается от этой) они помечены как K1, K2, K3 и K4, которые в основном являются катодной стороной светодиода (отрицательная сторона), и они выставлены как отдельные контакты в основной гибкий кабель, в то время как анод припаян к основному гибкому кабелю Vcc, и к нему нельзя легко получить доступ, не отпаяв гибкий светодиодный кабель.
Поэтому, чтобы управлять подсветкой, вам нужно разрезать дорожку на печатной плате (не на гибком кабеле) и подключить ее к транзистору, которым вы управляете через Arduino.
- Дважды проверьте полярность на ЖК-дисплее, она может отличаться от моей.
Мне удалось уменьшить яркость подсветки на ili9341, просто модулируя контакт, к которому подключен светодиод.
Обратите внимание, я использую teensy 3.2, ваш пробег может отличаться.
ledPin=32;
void loop() {
analogWrite(ledPin, 60);
- Кнопка двойного состояния Nextion
- Увеличьте или уменьшите яркость дисплея Nextion
- mcufriend 2.4 TFT с ESP8266
- Низкая частота обновления 1,8-дюймового TFT-дисплея
- Как создавать и редактировать шрифты для библиотеки Adafruit GFX?
- Подключение нескольких TFT-панелей к Arduino Uno через SPI?
- Белый экран в TFT 1.44 ST7735
- Использование Waveshare Raspberry Pi TFT LCD с Arduino Uno
Какой щит? Нам нужно знать это, чтобы знать, возможно ли это вообще. 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