Конверт цветов из Nextion HMI в RGB

Mozgoklui

★★✩✩✩✩✩
1 Окт 2018
68
63
Господа, кто сталкивался с экранами Nextion, есть проблема.
Экран понимает значения цветов в HEX decimal формате (для меня уже это какой-то бред), значения от 0 до 65535. Также в описаниях встречается обозначение R5G6B5 или RGB565.
Есть ли формула для получения кода цвета вида RGB типа 255,255,255?
Задача - три ползунка и объект на экране, меняющий свой цвет при движении ползунков. То есть некая переменная собирает значения с ползунков, переваривает их в вид RGB565 и задаёт цвет объекту.
Я полдня проторчал в гугле... безрезультатно...
 

Mozgoklui

★★✩✩✩✩✩
1 Окт 2018
68
63
@Wan-Derer, я понимаю, что это должно ответить на мой вопрос. При должных знаниях видимо. Но увы, мне это ничего не говорит :( И как из этого слепить формулу пересчета, я не понимаю..
 

Mozgoklui

★★✩✩✩✩✩
1 Окт 2018
68
63
Поскольку я тупой, я начал просто на сайте конвертировать цвета и выписал как меняются значения. Если красный цвет (значение R) изменять от 0 до 255, то на выходе идут значения 2048, 4096 ... 63488. Отсюда значение NextionRed = R/8*2048 = R*256
Зеленый NextionGreen = G/4*32 = G*8
Синий NextionBlue = B/8

По идее формула пересчета будет NextionColor = R*256+G*8+B/8
Для примера взял значение 100 для каждого цвета:
100*256+100*8+100/8 = 25600 + 800 +13 = 26413.

Однако, когда ставлю в онлайн конвертер 100,100,100, то он выдает 25388 и это совсем другой цвет. Что за хрень????
 

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,136
412
Москва
wan-derer.ru
@Mozgoklui,
8 бит -> 0...255
5 бит -> 0...31

пишем пропорцию

известный_цвет -> 255
расчётный_цвет -> 31

расчётный_цвет = известный_цвет * 31 / 255, округлить до целого

Так получить три компонента, учитывая что 6 бит -> 0...63

Дальше надо собрать из 3 компонент композитный цвет. Имеем:

00000000 000RRRRR
00000000 00GGGGGG
00000000 000BBBBB

их надо собрать так:

RRRRRGGGGGGBBBBB

т.е.

RRRRR000 00000000
+
00000
GGG GGG00000
+
00000000 000
BBBBB

Операция сдвига для двоичного числа на одну позицию влево = умножению на 2
Побитное сложение двоичных чисел это OR (лог ИЛИ)
 
  • Лойс +1
Реакции: Mozgoklui

Mozgoklui

★★✩✩✩✩✩
1 Окт 2018
68
63
@Wan-Derer, спасибо! уже что-то понял :) Вечером доберусь домой и проверю можно ли это написать силами nextion editora, он кастрированный.
 

Mozgoklui

★★✩✩✩✩✩
1 Окт 2018
68
63
@Wan-Derer, увы, силами экрана сделать задуманное не получится, так как там отсутствуют функции перевода между системами исчисления :(. Придется слать в ардуино, там выполнять все операции (перевод в двоичные, сборка двоичного числа из трех, перевод в десятичное), а затем присылать обратно готовое значение. Очень жаль...
 

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,136
412
Москва
wan-derer.ru
@Mozgoklui, "Дядя Федя, ты дурак?" (с)
Числа везде одинаковые. Разные представления мы используем для себя, только для удобства.
255 = FF = 1111 1111 <- это всё одно и то же

А вообще, в экран надо слать (или формировать на нём) сразу те цвета, которые ему нужны для отображения. Математику внутри дисплея надо сокращать по максимуму.
 

Mozgoklui

★★✩✩✩✩✩
1 Окт 2018
68
63
@Wan-Derer, походу я не вытягиваю всё мозгом, но я упрямый :)
А я подумал, раз уж дисплей намного быстрее чем ардуино и имеет на борту 16мб памяти, то стоит его душить посильнее.
Вот опишу полную картину:
Есть три ползунка (h0..h2), в которых можно простыми числами выставлять крайние значения (minval и maxval).
Есть область, которая получив число t0.bco=0..65535 покажет соответствующий цвет.
Есть таймер, в который можно загнать небольшой код.
Например, я ставил пороги ползунков 0..31,0..63,0..31, в таймере прописывал t0.bco=h0.val*2048+h1.val*32+h2.val
.....и получил чушь....
че делать, чтобы гоняя ползунки получить корректный цвет области t0.bco?
 

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,136
412
Москва
wan-derer.ru
@Mozgoklui, я этот дисплей не программировал, поэтому могу только предполагать. Большую задачу надо разделить на несколько мелких и отладить каждую часть.
1. Убедись что алгоритм формирования цвета ты понимаешь правильно. Закрась область какими-то "вручную" постичанными цветами и убедись что они отображаются как задумано.
2. Убедись что ползунки дают именно те значения, которые ты задал ограничениями. Выведи куда-нибудь их значения в виде чисел.
3. Убедись в правильности вычислений. Выведи куда-нибудь h0.val*2048 и h1.val*32. Это уже должны быть 16-разрядные числа.
3. Выведи куда-нибудь результат формулы, убедись что не перепутал порядок компонент.
Ну и т.д. Короче, больше отладочного вывода на всех стадиях алгоритма. Так можно понять что там творится под капотом.
 
  • Лойс +1
Реакции: Mozgoklui

Mozgoklui

★★✩✩✩✩✩
1 Окт 2018
68
63
@Wan-Derer, огромное спасибо за помощь!!!
Разложив на этапы и создав несколько таймеров с простыми действиями вместо одного толстого, решил проблему.
Походу это был баг..
Я только начал разбираться в программировании, но уже приятно, что что-то получается.
Результат в видео: https://drive.google.com/open?id=1RxjfPaPb7rU57hGb8nIQQ3lhlCFypaD9