Управление яркостью lcd. Управление яркостью подсветки дисплея Nextion в FLProg

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

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

  • В качестве основы, я использовал 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:

Void Lcd_Writ_Bus(uint8_t bla) { digitalWrite(WR,LOW); //Настраиваем SSD1963 на чтение digitalWrite(CS, LOW); PORTC = bla; //Передаем на шину данные в виде одного байта digitalWrite(CS,HIGH); digitalWrite(WR,HIGH); }

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

Void Lcd_Write_Com(uint8_t data) { digitalWrite(RS,LOW); //Переключаем RS в режим чтения команды, то есть 0 Lcd_Writ_Bus(data); } void Lcd_Write_Data(uint8_t data) { digitalWrite(RS,HIGH); //Переключаем RS в режим чтения данных, то есть 1 Lcd_Writ_Bus(data); }

Теперь сама настройка подсветки. Чтобы узнать, как осуществить все это, открываем документацию и ищем команду для настройки 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. Обратите внимание, что так как значения начинаются с нуля, то необходимо вычесть единицу. Конечно, вы можете выбрать ступени и их значения сами, но я привёл вот такой, довольно просто пример. Теперь сам код:

Void setBright(byte lvl) { byte brightness(1); for (byte i(1); i <= lvl; i++) //Возведение в степень brightness *= 2; Lcd_Write_Com(0xBE); //Вывод команды Lcd_Write_Data(0x01); //Ставим частоту 760Гц Lcd_Write_Data(brightness-1); //Выводим длину рабочего цикла Lcd_Write_Data(0x01); //Отключаем DBC }

Теперь можно использовать UTFT.setBright(byte lvl);

Пояснения к схеме

R2 – переменный резистор номиналом 10К. Центральный вывод резистора через НЧ-фильтр подключен к нулевому каналу АЦП. Напряжение на резисторе преобразуется в цифровой код, который записывается в регистр сравнения таймера Т0. Таким образом с помощью резистора осуществляется регулировка скважности ШИМ сигнала.

Led1 – мощный светодиод белого цвета. Падение напряжения на нем около 4 Вольт. Максимальный ток светодиода, задается резистором R5 и равен 100 мА.

(Uпит – Uled)/R5 = (5 - 4)/10 = 100 мА

IRLU024N – N–канальный полевой транзистор. Вместо него можно использовать любые полевые транзисторы серии IRL (L - это значит, что управляются логическим уровнем)

R3 – токоограничительный резистор на всякий случай. R4 – pull-down резистор. Затвор полевого транзистора нельзя оставлять "болтающимся в воздухе".

Программа

//************************************************************
// Учебный курс. Программирование микроконтроллеров AVR на Си
// Управление нагрузкой с помощью
// широтно-импульсной модуляции (ШИМ, PWM)

#include
#include

int main(void )
{
//инициализация портов
PORTB = 0;
DDRB = 0xff;

//инициализация таймера Т0
TIMSK = 0;
//реж. - fast pwm, вывод OC0 - неинверт. шим, clk/64
TCCR0 = (1< TCNT0 = 0;
OCR0 = 0;

//инициализируем АЦП
//ион - напряжение питания, выравнивание влево, нулевой канал

ADMUX = (0< //вкл. ацп, реж. непрерывн. преобр., разр. прерывания, частота преобр. = FCPU/128
ADCSRA = (1< //режим непрерывного преобразования
SFIOR = 0;

__enable_interrupt ();
while (1);
return 0;
}

//********************************
//прерывание АЦП
#pragma vector=ADC_vect
__interrupt void adc_my(void )
{

//считываем старший регистр АЦП и

//записываем в регистр сравнения

Пояснения к коду

Логика работы

Инициализация периферии - таймера Т0, модуля АЦП. Разрешение прерываний. Бесконечный цикл. В прерывании АЦП напряжение считанное с переменного резистора записывается в регистр сравнения OCR0. В микроконтроллере AVR для этого регистра организован буфер, и на самом деле запись происходит сначала в него. Из буфера же значение переписывается в OCR0, только когда происходит переполнение счетного регистра TCNT0. Параллельно циклу while и модулю АЦП, работает таймер Т0 и генерит на выводе OC0(PB2) ШИМ сигнал. Когда счетный регистр TCNT0 переполняется OC0 устанавливается в 1, когда значение счетного регистра совпадает с регистром сравнения OCR0, вывод устанавливается в 0.

Инициализация таймера

Прерывания таймера не используются, поэтому регистр TIMSK = 0.

За установки таймера Т0 отвечает конфигурационный регистр TCCR0.

Биты WGM01, WHM00 определяют режим работы. 11 - режим Fast PWM.

Биты CS02, CS01, CS00 - устанавливают коэффициент предделителя таймера. 011 - соответствует предделителю 64. Тактовая частота таймера/счетчика будет Fcpu/64

Биты COM01, COM00 -определяют поведение вывода OC0. 10 - соответствует неинвертированному ШИМ сигналу. 1 - при переполнении TCNT0, 0 - при совпадении TCNT0 c OCR0.

Инициализация АЦП

Пример №2. Генерация синусоидального сигнала с помощью ШИМ

Пояснение к схемe

Резистор R2 просто забыл выкинуть из схемы. R3 и C8 интегратор.

Программа

//************************************************************

// Генерация синуса с помощью

// широтно-импульсной модуляции (ШИМ, PWM)

//************************************************************

#include
#include
#include "TableSin.h"

int main(void )
{
//инициализация портов
PORTB = 0;
DDRB = 0xff;

//инициализация таймера Т0
TIMSK = (1< //реж. - fast pwm, вывод OC0 - неинверт. шим, предделитель - на 8
TCCR0 = (1< //обнуляем счетный регистр и регистр сравнения
TCNT0 = 0;
OCR0 = 0;

__enable_interrupt ();
while (1);
return 0;
}

//**********************************************************

//Прерывание таймера/счетчика Т0

#pragma vector = TIMER0_COMP_vect

__interrupt void Timer0CompVect(void )

Часто пользователи операционной системы Windows 7 сталкиваются с проблемой настройки яркости экрана . Чтобы исправить эту проблему, мы разберем все доступные способы настройки яркости дисплея в Windows 7 . Регулирование подсветки экрана является довольно простым процессом, с которым справится даже начинающий пользователь. После ознакомления с материалом, вы сможете самостоятельно настроить яркость портативного или стационарного компьютера.

Регулирование яркости стандартными средствами Windows 7

Чтобы выставить яркость ноутбука или моноблока стандартными средствами семерки, первым делом следует перейти к Панели управления . Перейти к Панели управления можно через меню «Пуск » или набрать в программе «Выполнить » команду control

После запуска Панели управления необходимо перейти в раздел «».

Теперь можно увеличить или уменьшить подсветку экрана. Для этого поставьте ползунок «Яркость экрана » в положение, которое соответствует вашим предпочтениям подсветки монитора.

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

Изменение параметров освещения экрана с помощью драйвера видеокарты

Еще одним интересным способом изменения освещения дисплея является регулировка с помощью драйвера видеокарты . Для нашего примера будет рассматриваться driver от компании Nvidia . Чтобы открыть параметры драйвера видеокарты, нужно кликнуть правой кнопкой мыши на пустом месте Рабочего стола. Должно появиться контекстное меню.

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

Теперь в этой панели нужно перейти к меню «Видео \ Регулировка параметров цвета для видео ».

В меню регулировки цвета нужно перейти к графе «2. Как выполнить настройки цвета » и поставить переключатель «С настройками NVIDIA ». Выбрав данные параметры, у вас появится возможность регулировки четырех свойств, среди которых яркость дисплея . Чтобы увеличить или уменьшить яркость дисплея, перетяните ползунок к плюсу или к минусу и вы увидите, как меняется подсветка экрана.

Такие программы, которые регулируют освещение экрана с помощью драйвера видеоадаптера, также есть у производителей видеокарт Intel и AMD .

Также в просторах сети вы можете найти множество программ, которые регулируют подсветку дисплея. Все подобные программы работают через обращение к драйверу видеоадаптера. То есть, по сути, они делают то, что вы можете сделать в панели управления видеокарты (в нашем случае Nvidia). Наиболее интересной из всех подобных программ является F.lux . Ее главной особенностью является автоматическая регулировка подсветки дисплея , которая зависит от времени суток.

Пример регулировки подсветки ноутбука с помощью клавиши Fn

Для примера будем использовать нетбук Lenovo s110 с операционной системой Windows 7.

Для регулировки подсветки в нем используется клавиша-модификатор Fn в сочетании с клавишами управления курсором ← и → . Чтобы увеличить подсветку ноутбука Lenovo s110, необходимо использовать комбинацию клавиш Fn + → . Для понижения подсветки нужно использовать комбинацию Fn + ← .

При повышении и понижении подсветки вы увидите как меняется значение графического индикатора. За этот индикатор отвечает программа Hotkey Features .

Как видите, увеличить или уменьшить параметры освещения экрана ноутбука с помощью клавиши «Fn », довольно просто. Использовать этот пример можно и на других ноутбуках, поскольку принципы использования клавиш-модификаторов у них одинаковые.

В частности, на ноутбуках SAMSUNG NP350 сочетания клавиш:

  • для увеличения яркости - Fn + F3 ;
  • для уменьшения - Fn + F2 .

Ручная настройка подсветки монитора

У пользователей стационарных компьютеров параметры освещения экрана можно регулировать на самом дисплее. Для примера будем использовать монитор LG Flatron W1943SS . Чтобы отрегулировать освещение, необходимо перейти в его меню. Для этого на панели управления монитора нажмите клавишу MENU .

После этого нажмите клавишу AUTO/SET . Должно открыться окно регулировки яркости, в котором можно ее изменить.

Также хочется отметить, что настройки монитора не зависят от того, какая установлена ОС или driver. Они регулируются исключительно в мониторе. Каждый монитор от разного производителя имеет свои параметры ручной настройки . Узнать подробности регулировки параметров освещения экрана того или иного монитора можно в мануале, который комплектуется при продаже или может быть скачан в электронном виде на сайте производителя.

Подводим итог

В данном материале видно, что увеличить и уменьшить яркость дисплея в Windows 7, способен даже начинающий пользователь ПК. А мы надеемся, что наш материал поможет вам научиться менять яркость монитора компьютера.

Видео по теме

Дисплей Nextion: http://ali.pub/1xz0e2

Я покупал такой: http://ali.ski/zF01b

Для начала добавим блок получения данных с дисплея Nextion. Он называется Nextion Get Attr .

Находится данный блок в программе FLProg: Панель Nextion HMI -> Элементы -> Получить Параметр

Настройка данного блока выглядит следующим образом:

Для настройки данного блока Нужно выбрать панель с которой будем получать данные, или если создать новую панель. И выбрать как подключается данная панель к ардуино.

Ну и создадим элемент Ползунок (Slider) , пропишем ему его имя в панели Nextion и id.

Параметр, выберем (val) и выберем период опроса каждую секунду.

Все на этом настройка блока получения параметров закончена.

Настройка данного блока выглядит вот так:

Главное в этом блоке выбрать раннее созданную панель Nextion и заменить константу, на вход.

После этого нужно добавить блок Number Change который находится Базовые элементы -> Детектор изменения числа

И все это соединить по такой схеме:

После чего загрузить все в Ардуино и наслаждаться изменением яркости нашего дисплея.

Нагляднее в Видео: