Редактор эффектов для led cube - компьютерная программа (приложение)

leks
Offline
Зарегистрирован: 22.10.2017

Такая тема возникла у меня:

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

    Собственно плод работы это (картинку смотрим) массив чисел - записываемых в файл после рисования анимации мышью. Теперь захотелось сделать симулятор-эмулятор куба на компьютере, что бы на выходе приложения-программы получать получать подобный массив при этом красиво шлёпая курсором нарисованные светодиодики куба. 

Собственно вопрос: как проще это сделать? Каким доступным инструментом воспользоваться? (так что б сразу бах... и получилось - как "мит ап инвентор" для приложений смартфона :)  

leks
Offline
Зарегистрирован: 22.10.2017

Вопрос видимо не корректно сформулировал :)

sadman41
Offline
Зарегистрирован: 19.10.2016

Чтобы приложение выдало массив в известном только пользователю формате, оно должно быть самим этим пользователем и быть написано...

kalapanga
Offline
Зарегистрирован: 23.10.2016

sadman41 пишет:

Чтобы приложение выдало массив в известном только пользователю формате, оно должно быть самим этим пользователем и быть написано...

Это точно. Вероятность того, что какая-то сторонняя программа подойдёт к этому конкретному кубу, стремится к нулю.

А так, софт какой-то прилагается к наборам для сборки лед-кубов (Можно поискать в обзорах покупок в китае. Но всё это - чисто посмотреть, каких-нибудь идей набраться), на гитхабе по "led cube" много чего находит (тут хоть исходники, может что-то адаптировать можно). Но лучше писать самому, с блэкджеком и остальным! :)

leks
Offline
Зарегистрирован: 22.10.2017

Да, это всё так. Я спросил есть ли инструмент создания приложения для пк достаточно простой в освоении подобно "мит ап инвентору " для смартфонов? По сути приложение это множество виртуальных кнопок порядка 216 на экране - нажимаем и получаем число в массив.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Я не знаю, что такое "мит ап инвентор для смартфонов" оценить не могу. Но думаю даже в нём совсем без програмирования не получится, чтобы нажал кнопку и число в массиве! "Простой в освоении" тоже понятие субъективное. Например, иногда слышишь от некоторых "тру-программеров", что дельфи - это среда для программирования путём накидывания мышкой кнопок на форму! Как раз что Вы хотите :)

Но 216 кнопок на экране - это фуу, не интересно. Надо что-нибудь трёхмерное,  вращающееся и светящееся! :)

leks
Offline
Зарегистрирован: 22.10.2017

Вот картинка рабочего экрана одной из программ для куба. Кнопки-светодиоды. Конечно хотелось бы трёхмерный куб создать, но тут хоть бы за что зацепиться.

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

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А формат на выходе какой у этой программы (формат хранения рисунка)? Сомневаюсь, что векторный. Небось по типу bmp? Это намёк, если все же своё писать...

leks
Offline
Зарегистрирован: 22.10.2017

BOOM пишет:

А формат на выходе какой у этой программы (формат хранения рисунка)? Сомневаюсь, что векторный. Небось по типу bmp? Это намёк, если все же своё писать...

Не понял вопроса. На данный момент куб 6*6*6 имеет кроме Ардуино модуль SD карты- на ней файл расширением txt. В нем массив чисел - номеров светодиодов куба которые надо включить в данном кадре эффекта (картинка в первом сообщении). Кадр это строка чисел завершающаяся числом 227, набор кадров-строк это эффект (завершается числом 255). Этот файл редактируется силами самой Ардуино при рисовании новых эффектов на самом кубе мышью. Теперь задача как сделать подобный файл txt на компьютере в приложении самолепном. Ясно, что зная соответствие номеров и светодиодам можно тупо забивать числа в строки, но это не интересно.  

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

И я о том же. Упростим - разобьём куб на 6 квадратов 6х6. Рисуем для них, к примеру, интенсивность яркости (или можно заменить на разноцветность) послойно (проще типа пейнта для восприятия, или как в программе выше). Сохраняем в файл нужного формата. Профит.

Или надо для вас саму программу написать? Лет 10-15 может и написал бы за полчаса, а щас годы не те - уже не помню и лень. Во многих проф студиях программирования это возможно (где есть поддержка быстрой разработки 3д - для красочности взаимодействия с юзером, или 2д или самому накропать). Современные средства (мне кажется - QT подойдёт для красочности) так легко. Но я в QT все никак не соберусь силами разобраться. 

leks
Offline
Зарегистрирован: 22.10.2017

Мне желательно подсказать какими средствами программирования легче замысел реализовать. Ведь в студию я вряд ли сходу войду :)

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Ну хз, qtcreator как я сам поюзал - типа древенего drenweavera (если познаешь о чем я), то есть там достаточно быстро можно наваять визуал. А дальше ручками-ручками. Да и в принципе я сомневаюсь, что есть программы которые такое сделают по кнопке «сделать заебись!». Эх, с 2003 (вроде) года мечтаю о такой кнопке. 

Если сам наваял формирование массивов, то это для тебя ещё полчаса времени займёт. 

leks
Offline
Зарегистрирован: 22.10.2017

Скетч для куба с SD картой сам сделал с нуля, вряд ли за полчаса разберусь что есть  qtcreator или drenweavera:)

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

В гугле забанили? Давно бы уже разобрался...

leks
Offline
Зарегистрирован: 22.10.2017

Простенький редактор получился на Hiasm. Но всё равно не удобно по слоям набирать. Нет ли похожих конструкторов русских с возможностью создания 3D интерфейса? Чтобы форма с элементами управления была не плоскостью, а объёмом с возможностью кругового обзора.

leks
Offline
Зарегистрирован: 22.10.2017
//3D processing //
//ВИРТУАЛЬНЫЙ ИСПОЛНИТЕЛЬ ЭФФЕКТОВ СВЕТОДИОДНОГО КУБА 6*6*6//
float rotX = 0.0, rotY = 0.0; 
int lastX, lastY;
float distX = 0.0, distY = 0.0;
float X,Y;
int x=0,y=0,z=0;//счётчики - координаты
int i;//счётчик
int s=0;//счётчик
int ss=0;//счётчик
int sss=0;//счётчик
int R=25;//размер куба в окне
int fl=1;//флаг состояний (управляет сменой режимов внешнего вида куба)
int k=0;//счётчик
int j=0;//счётчик
int raz=2;//коэффициент влияющий на размер элемента куба
boolean fl_A=true;//флаг состояний (управление переключением эффекта)
boolean fl_B=true;//флаг состояний (управляет сменой направлений вращения куба при автономном режиме)
boolean fl_D=true;//флаг состояний (управляет стоп кадром) 
int r=0,g=255,b=0;//составляющие цвета
int color_=0;//счётчик цвета
int forma_=0;//счётчик формы элемента куба
int n=50;//скорость анимации
int T=0;//переменная хранения моментов времени
int m=0;//счётчик
boolean fl_C=true;//флаг состояний (управляет сменой ручного и автоматического вращения куба )
int N=0;//переменная определяет цвет экрана (ночь,утро-вечер,день)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////// массив данных нескольких эффектов ////////////////////////////////
int []tabl_dano={5,227,
4,11,41,227,
3,10,17,40,47,77,227,
2,9,16,23,39,46,53,76,83,113,227,
1,8,15,22,29,38,45,52,59,75,82,89,112,119,149,227,
0,7,14,21,28,35,37,44,51,58,65,74,81,88,95,111,118,125,148,155,185,227,
6,13,20,27,34,36,43,50,57,64,71,73,80,87,94,110,117,124,131,147,154,161,184,191,227,
12,19,26,33,42,49,56,63,70,72,79,86,93,100,107,109,116,123,130,137,146,153,160,167,183,190,227,
18,25,32,48,55,62,69,78,85,92,99,106,108,115,122,129,136,143,145,152,159,166,173,182,189,196,203,227,
24,31,54,61,68,84,91,98,105,114,121,128,135,142,144,151,158,165,172,179,181,188,195,202,209,227,
30,60,67,90,97,104,120,127,134,141,150,157,164,171,178,180,187,194,201,208,215,227,
66,96,103,126,133,140,156,163,170,177,186,193,200,207,214,227,
102,132,139,162,169,176,192,199,206,213,227,
138,168,175,198,205,212,227,
174,204,211,227,
210,227,
255,// 1 ЭФФЕКТ СЛОЙ ДВИЖЕТСЯ ПО ДИАГОНАЛИ КУБА СНИЗУ ВВЕРХ, СЛЕВА НАПРОВО, ВГЛУБЬ//
0,7,14,21,28,35,36,43,50,57,64,71,72,79,86,93,100,107,108,115,122,129,136,143,144,151,158,165,172,179,180,187,194,201,208,215,227,
1,6,13,20,27,34,37,42,49,56,63,70,73,78,85,92,99,106,109,114,121,128,135,142,145,150,157,164,171,178,181,193,200,207,214,227,
2,7,12,19,26,38,43,48,55,62,69,74,79,84,91,98,105,110,115,120,127,134,141,146,151,156,163,170,177,182,187,192,199,206,213,227,
3,8,13,18,25,32,39,44,49,54,61,68,75,80,85,90,97,104,111,116,121,126,133,140,147,152,157,162,169,176,183,188,193,198,205,212,227,
4,9,14,19,24,31,40,45,50,55,60,67,76,81,86,91,96,103,112,117,122,127,132,139,148,153,158,163,168,175,184,189,194,199,204,211,227,
5,10,15,20,25,30,41,46,51,56,61,66,77,82,87,92,97,102,113,118,123,128,133,138,149,154,159,164,169,174,185,190,195,200,205,210,227,
4,11,16,21,26,31,40,47,52,57,62,67,76,83,88,93,98,103,112,119,124,129,134,139,148,155,160,165,170,175,184,191,196,201,206,211,227,
3,10,17,22,27,32,39,46,53,58,63,68,75,82,89,94,99,104,111,118,125,130,135,140,147,154,161,166,171,176,183,190,197,202,207,212,227,
2,9,16,23,28,33,38,45,52,59,64,69,74,81,88,95,100,105,110,117,124,131,136,141,146,153,160,167,172,177,182,189,196,203,208,213,227,
1,8,15,22,29,34,37,44,51,58,65,70,73,80,87,94,101,106,109,116,123,130,137,142,145,152,159,166,173,178,181,188,195,202,209,214,227,
255,// 2 ЭФФЕКТ ВОЛНА//
4,5,10,11,40,41,46,47,227,
3,4,5,9,11,15,16,17,39,41,51,53,75,76,77,81,83,87,88,89,227,
2,3,4,5,8,11,14,17,20,21,22,23,38,41,56,59,74,77,92,95,110,111,112,113,116,119,122,125,128,129,130,131,227,
1,2,3,4,5,7,11,13,17,19,23,25,26,27,28,29,37,41,61,65,73,77,97,101,109,113,133,137,145,146,147,148,149,151,155,157,161,163,167,169,170,171,172,173,227,
0,1,2,3,4,5,6,11,12,17,18,23,24,29,30,31,32,33,34,35,36,41,66,71,72,77,102,107,108,113,126,138,143,144,149,174,179,180,181,182,183,184,185,186,191,192,197,198,203,204,209,210,211,212,213,214,215,227,
42,43,44,45,46,48,52,54,58,60,64,66,70,78,82,102,106,114,118,138,142,150,154,174,178,186,187,188,189,190,192,196,198,202,204,208,210,211,212,213,214,227,
84,85,86,87,90,93,96,99,102,103,104,105,120,123,138,141,156,159,174,177,192,193,194,195,198,201,204,207,210,211,212,213,227,
126,127,128,132,134,138,139,140,162,164,174,176,198,199,200,204,206,210,211,212,227,
168,169,174,175,204,205,210,211,227,
255,// 3 ЭФФЕКТ НАРАСТАНИЕ И УМЕНЬШЕНИЕ КОНТУРА КУБА ПО ДИАГОНАЛИ//
3,8,26,33,38,49,55,68,79,84,90,97,115,120,126,133,146,157,163,176,183,188,206,213,227,
2,7,25,32,37,48,54,67,78,84,90,96,114,120,126,132,145,156,162,175,182,187,205,212,227,
1,6,24,31,36,48,54,66,78,84,90,96,114,120,126,132,144,156,162,174,181,186,204,211,227,
0,6,24,30,36,48,54,66,78,84,90,96,114,120,126,132,144,156,162,174,180,186,204,210,227,
0,6,24,30,36,48,54,66,78,85,91,96,114,121,127,132,138,144,156,162,174,180,186,204,210,227,
0,6,24,30,36,49,55,61,66,79,86,92,97,115,122,128,133,144,157,163,174,180,186,204,210,227,
0,7,25,30,37,50,56,67,80,87,93,98,116,123,129,134,145,158,164,175,180,187,205,210,227,
1,8,26,31,38,51,57,68,81,88,94,99,117,124,130,135,146,159,165,176,181,188,206,211,227,
2,9,27,32,39,52,58,69,82,89,95,100,118,125,131,136,147,160,166,177,182,189,207,212,227,
3,10,28,33,40,53,59,70,83,89,95,101,119,125,131,137,148,161,167,178,183,190,208,213,227,
4,11,29,34,41,53,59,71,83,89,95,101,107,119,125,131,137,149,161,167,179,184,191,209,214,227,
5,11,29,35,41,53,59,71,83,89,95,101,119,125,131,137,143,149,161,167,179,185,191,209,215,227,
5,11,29,35,41,53,59,71,83,88,94,101,119,124,130,137,149,161,167,179,185,191,209,215,227,
5,11,29,35,41,52,58,71,82,87,93,100,118,123,129,136,149,160,166,179,185,191,209,215,227,
5,10,28,35,40,51,57,70,81,86,92,99,117,122,128,135,148,159,165,178,185,190,208,215,227,
4,9,27,34,39,50,56,69,80,85,91,98,116,121,127,134,147,158,164,177,184,189,207,214,227,
255,// 4 ЭФФЕКТ ВЫТРЯХИВАНИЯ КОВРА//
0,7,14,21,28,35,37,44,51,58,65,70,74,81,88,95,100,105,111,118,125,130,135,140,148,155,160,165,170,175,185,190,195,200,205,210,227,
1,8,15,22,29,34,38,45,52,59,64,69,75,82,89,94,99,104,112,119,124,129,134,139,149,154,159,164,169,174,184,189,194,199,204,211,227,
2,9,16,23,28,33,39,46,53,58,63,68,76,83,88,93,98,103,113,118,123,128,133,138,148,153,158,163,168,175,183,188,193,198,205,212,227,
3,10,17,22,27,32,40,47,52,57,62,67,77,82,87,92,97,102,112,117,122,127,132,139,147,152,157,162,169,176,182,187,192,199,206,213,227,
4,11,16,21,26,31,41,46,51,56,61,66,76,81,86,91,96,103,111,116,121,126,133,140,146,151,156,163,170,177,181,186,193,200,207,214,227,
5,10,15,20,25,30,40,45,50,55,60,67,75,80,85,90,97,104,110,115,120,127,134,141,145,150,157,164,171,178,180,187,194,201,208,215,227,
4,9,14,19,24,31,39,44,49,54,61,68,74,79,84,91,98,105,109,114,121,128,135,142,144,151,158,165,172,179,181,188,195,202,209,214,227,
3,8,13,18,25,32,38,43,48,55,62,69,73,78,85,92,99,106,108,115,122,129,136,143,145,152,159,166,173,178,182,189,196,203,208,213,227,
2,7,12,19,26,33,37,42,49,56,63,70,72,79,86,93,100,107,109,116,123,130,137,142,146,153,160,167,172,177,183,190,197,202,207,212,227,
1,6,13,20,27,34,36,43,50,57,64,71,73,80,87,94,101,106,110,117,124,131,136,141,147,154,161,166,171,176,184,191,196,201,206,211,227,
255,// 5 ВОЛНА-ГОРА//
5,10,15,20,25,30,180,187,194,201,208,215,227,
11,16,21,26,31,66,144,181,188,195,202,209,227,
17,22,27,32,67,102,108,145,182,189,196,227,
23,28,33,68,72,103,109,138,146,183,190,197,227,
29,34,36,69,73,104,110,139,147,174,184,191,227,
0,35,37,70,74,105,111,140,148,175,185,210,227,
1,6,38,71,75,106,112,141,149,176,204,211,227,
2,7,12,39,76,107,113,142,177,198,205,212,227,
3,8,13,18,40,77,143,178,192,199,206,213,227,
4,9,14,19,24,41,179,186,193,200,207,214,227,
255,// 6 ДВЕ ЗМЕЙКИ ГОНЯЮТСЯ ДРУГ ЗА ДРУГОМ//
2,7,8,9,12,13,14,15,16,19,20,21,25,26,27,31,32,33,227,
1,2,3,6,7,8,9,10,13,14,15,19,20,21,25,26,27,38,227,
0,1,2,3,4,7,8,9,13,14,15,19,20,21,37,38,39,74,227,
1,2,3,7,8,9,13,14,15,36,37,38,39,40,73,74,75,110,227,
1,2,3,7,8,9,37,38,72,73,74,75,76,109,110,111,146,227,
1,2,3,37,38,39,73,74,75,108,109,110,111,112,145,146,147,182,227,
37,38,39,73,74,75,109,110,111,144,145,146,147,148,181,182,183,188,227,
73,74,75,109,110,111,145,146,147,180,181,182,183,184,187,188,189,194,227,
109,110,111,145,146,147,181,182,183,186,187,188,189,190,193,194,195,200,227,
145,146,147,181,182,183,187,188,189,192,193,194,195,196,199,200,201,206,227,
181,182,183,187,188,189,193,194,195,198,199,200,201,202,205,206,207,212,227,
176,187,188,189,193,194,195,199,200,201,204,205,206,207,208,211,212,213,227,
140,175,176,177,193,194,195,199,200,201,205,206,207,210,211,212,213,214,227,
104,139,140,141,174,175,176,177,178,199,200,201,205,206,207,211,212,213,227,
68,103,104,105,138,139,140,141,142,175,176,177,205,206,207,211,212,213,227,
32,67,68,69,102,103,104,105,106,139,140,141,175,176,177,211,212,213,227,
26,31,32,33,66,67,68,69,70,103,104,105,139,140,141,175,176,177,227,
20,25,26,27,30,31,32,33,34,67,68,69,103,104,105,139,140,141,227,
14,19,20,21,24,25,26,27,28,31,32,33,67,68,69,103,104,105,227,
8,13,14,15,18,19,20,21,22,25,26,27,31,32,33,67,68,69,227,
255,// 7 СТРЕЛКА ДВИЖЕТСЯ ГОРИЗОНТАЛЬНО ПО ВНЕШНИМ СТОРОНАМ КУБА//
4,9,11,16,39,41,51,53,76,81,83,88,227,
111,116,118,123,146,148,158,160,183,188,190,195,227,
128,133,135,163,165,175,177,200,205,207,212,227,
19,24,26,31,54,56,66,68,91,96,98,103,227,
2,7,9,14,37,39,49,51,74,79,81,86,227,
111,116,118,123,146,148,158,160,183,188,190,195,227,
130,135,137,142,165,167,177,179,202,207,209,214,227,
81,86,88,93,116,118,128,130,153,158,160,165,227,
22,27,29,34,57,59,69,71,94,99,101,106,227,
49,54,56,61,84,86,96,98,121,126,128,133,227,
39,44,46,51,74,76,86,88,111,116,118,123,227,
55,60,62,67,90,92,102,104,127,132,134,139,227,
118,123,125,130,153,155,165,167,190,195,197,202,227,
255,// 8 СЛУЧАЙНОЕ ДВИЖЕНИЕ ШАРА//
0,1,2,3,4,5,227,
6,7,8,9,10,11,36,37,38,39,40,41,227,
12,13,14,15,16,17,42,43,44,45,46,47,72,73,74,75,76,77,227,
18,19,20,21,22,23,48,49,50,51,52,53,78,79,80,81,82,83,108,109,110,111,112,113,227,
24,25,26,27,28,29,54,55,56,57,58,59,84,85,86,87,88,89,114,115,116,117,118,119,144,145,146,147,148,149,227,
30,31,32,33,34,35,60,61,62,63,64,65,90,91,92,93,94,95,120,121,122,123,124,125,150,151,152,153,154,155,180,181,182,183,184,185,227,
66,67,68,69,70,71,96,97,98,99,100,101,126,127,128,129,130,131,156,157,158,159,160,161,186,187,188,189,190,191,227,
102,103,104,105,106,107,132,133,134,135,136,137,162,163,164,165,166,167,192,193,194,195,196,197,227,
138,139,140,141,142,143,168,169,170,171,172,173,198,199,200,201,202,203,227,
174,175,176,177,178,179,204,205,206,207,208,209,227,
210,211,212,213,214,215,227,
30,31,32,33,34,35,227,
24,25,26,27,28,29,67,68,69,70,71,227,
18,19,20,21,22,23,60,61,62,63,64,65,102,103,104,105,106,107,227,
12,13,14,15,16,17,54,55,56,57,58,59,96,97,98,99,100,101,138,139,140,141,142,143,227,
6,7,8,9,10,11,48,49,50,51,52,53,90,91,92,93,94,95,132,133,134,135,136,137,174,175,176,177,178,179,227,
0,1,2,3,4,5,42,43,44,45,46,47,84,85,86,87,88,89,126,127,128,129,130,131,168,169,170,171,172,173,210,211,212,213,214,215,227,
36,37,38,39,40,41,78,79,80,81,82,83,120,121,122,123,124,125,162,163,164,165,166,167,204,205,206,207,208,209,227,
72,73,74,75,76,77,114,115,116,117,118,119,156,157,158,159,160,161,198,199,200,201,202,203,227,
108,109,110,111,112,113,150,151,152,153,154,155,192,193,194,195,196,197,227,
144,145,146,147,148,149,186,187,188,189,190,191,227,
180,181,182,183,184,185,227,
255,// 9 ДВЕ ПЛОСКОСТИ ВЕРТИКАЛЬНЫЕ ПООЧЕРЕДИ ДВИГАЮТСЯ ПО ДИАГОНАЛИ//
300};
int []tabl_eff=new int[600];
////////////////////////////////////////////////////////////////////////
void setup()
{
size(500, 500, P3D);
//noStroke();
stroke(0,100,100,100); 
frameRate(70);//число кадров в секунду
} 
////////////////////////////////////////////////////////////////////////
void draw()
{delay(n);//скорость анимации регулирует
 //////////////////////////////////////////////////
 i=0;
 while(fl_A==true){tabl_eff[i]=tabl_dano[j];if(tabl_dano[j]==255){fl_A=false;s=0;}i++;j++;if(tabl_dano[j]==300){j=0;}}//запись в массив текущего эффекта
if(fl_D==true){k++;}if(k>600){fl_A=true;k=0;}//число циклов draw на 1 эффект

/////////////////////////////////////////////////
background(N); lights(); 
translate(width/2, (height/2)-50);
/////////  навигация исполнения эффектов ////////
if(fl_C==true)
{
//if (mousePressed && (mouseButton == LEFT)){rotateX(rotX + distY); rotateY(rotY + distX);fl=1;}// если нажата кнопка мыши и она левая вращаем видимым кубом
//if (mousePressed && (mouseButton == RIGHT)){rotateX(rotX + distY); rotateY(rotY + distX);fl=0;}// если нажата кнопка мыши и она правая вращаем невидимым кубом
if (mousePressed && (mouseButton == LEFT)){X=rotX + distY; Y=rotY + distX;fl=1;}// если нажата кнопка мыши и она левая вращаем видимым кубом
if (mousePressed && (mouseButton == RIGHT)){X=rotX + distY; Y=rotY + distX;fl=0;}// если нажата кнопка мыши и она правая вращаем невидимым кубом
rotateX(X); rotateY(Y);
} else{avtonom();}
//if (mousePressed && (mouseButton == CENTER)){noLoop();delay(3000);loop();}// если нажата центральная кнопка мыши то стоп кадр
if (mousePressed && (mouseButton == CENTER)){fl_D=!fl_D;delay(200);}// если нажата центральная кнопка мыши то стоп кадр

if (keyPressed&&key == ' ') {fl_A=true;k=0;}//если нажат пробел переходим к следующему эффекту
if (keyPressed&&(key == 'ц'||key == 'Ц'||key == 'w'||key == 'W')) {color_smena();}//если нажата клавиша "W"(Ц) меняем цвет куба
if (keyPressed&&(key == 'v'||key == 'V'||key == 'м'||key == 'М')){n=n+50;if(n>150){n=50;}delay(100);}// если нажата клавиша "V"(М)меняем скорость исполнения эффекта 
if (keyPressed&&(key == 'a'||key == 'A'||key == 'ф'||key == 'Ф')){fl_C=!fl_C;delay(100);}// если нажата клавиша "A"(Ф)меняем автономный и ручной режимы 
if (keyPressed&&(key == 'r'||key == 'R'||key == 'к'||key == 'К')){raz=raz*2;if(raz>4){raz=1;}delay(100);}// если нажата клавиша "R"(К)меняем размер элемента куба
if (keyPressed&&(key == 'f'||key == 'F'||key == 'а'||key == 'А')){forma_++;if(forma_>2){forma_=0;}delay(100);}// если нажата клавиша "F"(А)меняем форму элемента куба
if (keyPressed&&(key == 'q'||key == 'Q'||key == 'й'||key == 'Й')){N=N+127;if(N>255){N=0;}delay(100);}// если нажата клавиша "Q"(Й)меняем цвет экрана (день-ночь)
/////////////////////////////////////////////////
/////// перебор кадров в эффекте ///////////////
/////////////////////////////////////////////////

 for (i=s+1;i<tabl_eff.length;i++)  
{

if(tabl_eff[i]==255){s=0;ss=sss;break;}  
if(tabl_eff[i]==227){ss=i;if(s==0){sss=i;}break;}
}

////////////////////////////////////////////////
////// построение изображения куба в кадре //////////////
///////////////////////////////////////////////  
for (x=-2;x<4;x++)
{
  for (y=-2;y<4;y++)
  {
   for (z=-2;z<4;z++)
  { 
if(fl==1){translate(2*R*x,2*R*y,2*R*z);strokeWeight(1);noFill();forma();translate(-2*R*x,-2*R*y,-2*R*z);}// условие видимости всего куба
 for (i=s;i<ss;i++)  
{
if((x+2)+(y+2)*6+(z+2)*36==tabl_eff[i]){translate(2*R*x,2*R*y,2*R*z);strokeWeight(0.1);fill(r, g, b);forma();translate(-2*R*x,-2*R*y,-2*R*z);}

}
  }
}
}
if(fl_D==true){s=ss;}
////////////////////////////////////////////////
if(fl==0){strokeWeight(R/5);translate(R,R,R);noFill();box(12*R);}//рамка - куб при невидимости всего куба
if(fl==1){strokeWeight(R/5);translate(R,8*R,R);noFill();box(13*R,2*R,13*R);}//рамка - основание куба при его видимости
/////////////////////////////////////////////////
}


/////////////////// функции положения курсора и вращения колеса ////////////////////////////////////////////
void mousePressed() { lastX = mouseX; lastY = mouseY; }
void mouseDragged() {  distX = radians(mouseX - lastX); distY = radians(lastY - mouseY); } 
void mouseReleased() {  rotX += distY; rotY += distX;distX = distY = 0.0;  } 
void mouseWheel(MouseEvent event){R=R+5*event.getCount();}//приближение-удаление куба с помощью колеса мыши
 ////////////////// функция автономного вращения куба //////////////////////////
 void avtonom()
 {
  if(fl_B==true){rotateY(2*PI*m/256);}else{rotateY(-2*PI*m/256);}
  if(millis()-T>n){T=millis();m++;if(m>255){m=0;fl_B=!fl_B;if(fl_D==true){color_smena();fl_A=true;k=0;}}} 
 }
 ///////////// функция смены цвета ///////////////
 void color_smena()
 {
  color_++;
if(color_>7){color_=0;}if(color_==0){r=0;g=255;b=0;}if(color_==1){r=255;g=0;b=0;}if(color_==2){r=0;g=127;b=255;}if(color_==3){r=0;g=255;b=255;}if(color_==4){r=255;g=255;b=255;}
if(color_==5){r=255;g=255;b=0;}if(color_==6){r=255;g=0;b=255;}if(color_==7){r=255;g=127;b=0;}
 }
 /////////// функция смены формы элемента куба ////////////
 void forma()
 {
  if(forma_==0){box(R/raz);}//форма пикселя куб
  if(forma_==1){//форма пикселя шару подобная
 ellipse(0, 0,R/raz,R/raz);
 rotateX(PI/2);ellipse(0, 0,R/raz,R/raz);rotateX(-PI/2);
 rotateX(-PI/4);ellipse(0, 0,R/raz,R/raz);rotateX(PI/4);
 rotateX(PI/4);ellipse(0, 0,R/raz,R/raz);rotateX(-PI/4);
 rotateY(PI/2);ellipse(0, 0,R/raz,R/raz);rotateY(-PI/2);
 rotateY(PI/4);ellipse(0, 0,R/raz,R/raz);rotateY(-PI/4);
 rotateY(-PI/4);ellipse(0, 0,R/raz,R/raz);rotateY(PI/4);
 rotateZ(PI/4);ellipse(0, 0,R/raz,R/raz);rotateZ(-PI/4);
 rotateZ(-PI/4);ellipse(0, 0,R/raz,R/raz);rotateZ(PI/4);
 rotateZ(PI/2);ellipse(0, 0,R/raz,R/raz);rotateZ(-PI/2);
} 
if(forma_==2)//форма пикселя светодиоду подобная
{
rect(-R/(2*raz),0,R/raz,R/raz ); ellipse(0, 0,R/raz,R/raz);
rotateY(PI/2);rect(-R/(2*raz),0,R/raz,R/raz ); ellipse(0, 0,R/raz,R/raz);rotateY(-PI/2);
rotateY(PI/4);rect(-R/(2*raz),0,R/raz,R/raz ); ellipse(0, 0,R/raz,R/raz);rotateY(-PI/4);
rotateY(-PI/4);rect(-R/(2*raz),0,R/raz,R/raz ); ellipse(0, 0,R/raz,R/raz);rotateY(PI/4);
rotateX(PI/2);ellipse(0,0,R/raz,R/raz);translate(0,0,-R/raz);ellipse(0,0,R/raz,R/raz);translate(0,0,R/raz);rotateX(-PI/2);
}
 }
 //////////////////////////////////////////////////////////

Наконец удалось найти топор под лавкой!!! Processing легко и просто создаёт виртуальный-нереальный светодиодный куб. И 3D интерфейс на нём можно делать.

leks
Offline
Зарегистрирован: 22.10.2017

Вот так выглядят стоп-кадры

leks
Offline
Зарегистрирован: 22.10.2017

Сделал синхронизацию реального и виртуального кубов.

b707
Offline
Зарегистрирован: 26.05.2017

красиво. Эта 3д эмуляция в процессинге такая?

А массивы для эффектов в скетче ардуино лучше в прогмем засунуть

leks
Offline
Зарегистрирован: 22.10.2017

Да, виртуальный куб, реализованный в процессинге. Реальный куб в данном случае как индикатор виртуального - синхронно повторяет за ним эффекты, передаваемые на ардуино. А так массивы на флешке, пробовал с прогмем тоже.

b707
Offline
Зарегистрирован: 26.05.2017

leks пишет:

Да, виртуальный куб, реализованный в процессинге.

хотелось бы на код процессинга глянуть... не думал что он на такое способен

leks
Offline
Зарегистрирован: 22.10.2017

В 15 сообщении код ранней версии. Я сам о нём неделю как узнал, начал пробовать. Возможностей слишком много, не успеваю вникать :) На данный момент ... чего то код не вставляется ...? и картинки...? сделал приложение с виртуальными кнопками вместо клавиш, добавил ритм эффектов под музыку.

leks
Offline
Зарегистрирован: 22.10.2017
import processing.serial.*;

//3D processing //
//ВИРТУАЛЬНЫЙ ИСПОЛНИТЕЛЬ ЭФФЕКТОВ СВЕТОДИОДНОГО КУБА 6*6*6//
float rotX = 0.0, rotY = 0.0; 
int lastX, lastY;
float distX = 0.0, distY = 0.0;
float X,Y;
int x=0,y=0,z=0;//счётчики - координаты
int i;//счётчик
int s=0;//счётчик
int ss=0;//счётчик
int sss=0;//счётчик
int R=25;//размер куба в окне
int fl=1;//флаг состояний (управляет сменой режимов внешнего вида куба)
int k=0;//счётчик
int j=0;//счётчик
int raz=2;//коэффициент влияющий на размер элемента куба
boolean fl_A=true;//флаг состояний (управление переключением эффекта)
boolean fl_B=true;//флаг состояний (управляет сменой направлений вращения куба при автономном режиме)
boolean fl_D=true;//флаг состояний (управляет стоп кадром) 
int r=0,g=255,b=0;//составляющие цвета
int color_=0;//счётчик цвета
int forma_=0;//счётчик формы элемента куба
int n=50;//скорость анимации
int T=0;//переменная хранения моментов времени
int m=0;//счётчик
int knopka=50;//счётчик включённой кнопки
int fotka=0;//счётчик фоток
int transf=0;//счётчик трансформаций - реверс,поворот анимации
boolean fl_C=true;//флаг состояний (управляет сменой ручного и автоматического вращения куба )
int N=0;//переменная определяет цвет экрана (ночь,утро-вечер,день)
boolean fl_P=false;//управляет включением-выключением порта
int port_no=0;//номер порта,счётчик
///////////////////////////////////////////////////////////////////////
// последовательный порт:
Serial myPort;       
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////// массив данных нескольких эффектов ////////////////////////////////
 int []tabl_dano={17,23,29,35,48,54,60,66,156,162,168,174,197,203,209,215,20,21,56,57,91,92,93,94,127,128,129,130,164,165,200,201,227,
17,23,29,35,42,48,54,60,156,162,168,174,191,197,203,209,20,21,56,57,91,92,93,94,127,128,129,130,164,165,200,201,227,
6,12,18,24,53,59,65,71,155,161,167,173,192,198,204,210,20,21,56,57,91,92,93,94,127,128,129,130,164,165,200,201,227,
12,18,24,30,53,59,65,71,161,167,173,179,192,198,204,210,20,21,56,57,91,92,93,94,127,128,129,130,164,165,200,201,227,
12,18,24,30,47,53,59,65,161,167,173,179,186,192,198,204,20,21,56,57,91,92,93,94,127,128,129,130,164,165,200,201,227,
11,17,23,29,48,54,60,66,150,156,162,168,197,203,209,215,20,21,56,57,91,92,93,94,127,128,129,130,164,165,200,201,227,
255,//квадропод шагает//
  30,31,32,33,34,35,61,62,63,64,66,67,68,69,70,71,92,93,97,98,99,100,102,103,104,105,106,107,128,129,133,134,135,136,138,139,140,141,142,143,169,170,171,172,174,175,176,177,178,179,210,211,212,213,214,215,227,
255,//пирамидка статичная //
26,27,28,32,33,34,49,50,51,52,62,63,64,68,69,70,75,76,77,81,82,83,85,88,111,112,113,117,118,119,121,124,157,158,159,160,168,169,170,174,175,176,204,205,206,210,211,212,227,
25,26,27,31,32,33,39,40,41,45,46,47,49,50,51,52,61,62,63,67,68,69,75,76,77,81,82,83,85,88,121,124,157,158,159,160,163,164,165,169,170,171,199,200,201,205,206,207,227,
24,25,26,30,31,32,49,50,51,52,60,61,62,66,67,68,75,76,77,81,82,83,85,88,111,112,113,117,118,119,121,124,157,158,159,160,170,171,172,176,177,178,206,207,208,212,213,214,227,
19,20,21,25,26,27,49,50,51,52,55,56,57,61,62,63,85,88,111,112,113,117,118,119,121,124,147,148,149,153,154,155,157,158,159,160,169,170,171,175,176,177,205,206,207,211,212,213,227,
255,//динозавр походка //
5,227,
4,11,41,227,
3,10,17,40,47,77,227,
2,9,16,23,39,46,53,76,83,113,227,
1,8,15,22,29,38,45,52,59,75,82,89,112,119,149,227,
0,7,14,21,28,35,37,44,51,58,65,74,81,88,95,111,118,125,148,155,185,227,
6,13,20,27,34,36,43,50,57,64,71,73,80,87,94,110,117,124,131,147,154,161,184,191,227,
12,19,26,33,42,49,56,63,70,72,79,86,93,100,107,109,116,123,130,137,146,153,160,167,183,190,227,
18,25,32,48,55,62,69,78,85,92,99,106,108,115,122,129,136,143,145,152,159,166,173,182,189,196,203,227,
24,31,54,61,68,84,91,98,105,114,121,128,135,142,144,151,158,165,172,179,181,188,195,202,209,227,
30,60,67,90,97,104,120,127,134,141,150,157,164,171,178,180,187,194,201,208,215,227,
66,96,103,126,133,140,156,163,170,177,186,193,200,207,214,227,
102,132,139,162,169,176,192,199,206,213,227,
138,168,175,198,205,212,227,
174,204,211,227,
210,227,
255,//  ЭФФЕКТ СЛОЙ ДВИЖЕТСЯ ПО ДИАГОНАЛИ КУБА СНИЗУ ВВЕРХ, СЛЕВА НАПРОВО, ВГЛУБЬ//
0,7,14,21,28,35,36,43,50,57,64,71,72,79,86,93,100,107,108,115,122,129,136,143,144,151,158,165,172,179,180,187,194,201,208,215,227,
1,6,13,20,27,34,37,42,49,56,63,70,73,78,85,92,99,106,109,114,121,128,135,142,145,150,157,164,171,178,181,193,200,207,214,227,
2,7,12,19,26,38,43,48,55,62,69,74,79,84,91,98,105,110,115,120,127,134,141,146,151,156,163,170,177,182,187,192,199,206,213,227,
3,8,13,18,25,32,39,44,49,54,61,68,75,80,85,90,97,104,111,116,121,126,133,140,147,152,157,162,169,176,183,188,193,198,205,212,227,
4,9,14,19,24,31,40,45,50,55,60,67,76,81,86,91,96,103,112,117,122,127,132,139,148,153,158,163,168,175,184,189,194,199,204,211,227,
5,10,15,20,25,30,41,46,51,56,61,66,77,82,87,92,97,102,113,118,123,128,133,138,149,154,159,164,169,174,185,190,195,200,205,210,227,
4,11,16,21,26,31,40,47,52,57,62,67,76,83,88,93,98,103,112,119,124,129,134,139,148,155,160,165,170,175,184,191,196,201,206,211,227,
3,10,17,22,27,32,39,46,53,58,63,68,75,82,89,94,99,104,111,118,125,130,135,140,147,154,161,166,171,176,183,190,197,202,207,212,227,
2,9,16,23,28,33,38,45,52,59,64,69,74,81,88,95,100,105,110,117,124,131,136,141,146,153,160,167,172,177,182,189,196,203,208,213,227,
1,8,15,22,29,34,37,44,51,58,65,70,73,80,87,94,101,106,109,116,123,130,137,142,145,152,159,166,173,178,181,188,195,202,209,214,227,
255,//  ЭФФЕКТ ВОЛНА//
0,1,6,7,10,11,12,13,16,17,22,23,36,37,42,43,46,47,48,49,52,53,58,59,160,161,162,163,166,167,168,169,172,173,174,175,196,197,198,199,202,203,204,205,208,209,210,211,227,
4,5,6,7,10,11,12,13,16,17,18,19,40,41,42,43,46,47,48,49,52,53,54,55,154,155,156,157,160,161,162,163,166,167,168,169,190,191,192,193,196,197,198,199,202,203,204,205,227,
10,11,12,13,16,17,18,19,22,23,24,25,46,47,48,49,52,53,54,55,58,59,60,61,148,149,150,151,154,155,156,157,160,161,162,163,184,185,186,187,190,191,192,193,196,197,198,199,227,
16,17,18,19,22,23,24,25,28,29,30,31,52,53,54,55,58,59,60,61,64,65,66,67,144,145,150,151,154,155,156,157,160,161,166,167,180,181,186,187,190,191,192,193,196,197,202,203,227,
12,13,18,19,22,23,24,25,28,29,34,35,48,49,54,55,58,59,60,61,64,65,70,71,150,151,156,157,160,161,162,163,166,167,172,173,186,187,192,193,196,197,198,199,202,203,208,209,227,
6,7,12,13,16,17,18,19,22,23,28,29,42,43,48,49,52,53,54,55,58,59,64,65,156,157,162,163,166,167,168,169,172,173,178,179,192,193,198,199,202,203,204,205,208,209,214,215,227,
255,// мотор-цилиндры //
4,5,10,11,40,41,46,47,227,
3,4,5,9,11,15,16,17,39,41,51,53,75,76,77,81,83,87,88,89,227,
2,3,4,5,8,11,14,17,20,21,22,23,38,41,56,59,74,77,92,95,110,111,112,113,116,119,122,125,128,129,130,131,227,
1,2,3,4,5,7,11,13,17,19,23,25,26,27,28,29,37,41,61,65,73,77,97,101,109,113,133,137,145,146,147,148,149,151,155,157,161,163,167,169,170,171,172,173,227,
0,1,2,3,4,5,6,11,12,17,18,23,24,29,30,31,32,33,34,35,36,41,66,71,72,77,102,107,108,113,126,138,143,144,149,174,179,180,181,182,183,184,185,186,191,192,197,198,203,204,209,210,211,212,213,214,215,227,
42,43,44,45,46,48,52,54,58,60,64,66,70,78,82,102,106,114,118,138,142,150,154,174,178,186,187,188,189,190,192,196,198,202,204,208,210,211,212,213,214,227,
84,85,86,87,90,93,96,99,102,103,104,105,120,123,138,141,156,159,174,177,192,193,194,195,198,201,204,207,210,211,212,213,227,
126,127,128,132,134,138,139,140,162,164,174,176,198,199,200,204,206,210,211,212,227,
168,169,174,175,204,205,210,211,227,
255,//  ЭФФЕКТ НАРАСТАНИЕ И УМЕНЬШЕНИЕ КОНТУРА КУБА ПО ДИАГОНАЛИ//
3,8,26,33,38,49,55,68,79,84,90,97,115,120,126,133,146,157,163,176,183,188,206,213,227,
2,7,25,32,37,48,54,67,78,84,90,96,114,120,126,132,145,156,162,175,182,187,205,212,227,
1,6,24,31,36,48,54,66,78,84,90,96,114,120,126,132,144,156,162,174,181,186,204,211,227,
0,6,24,30,36,48,54,66,78,84,90,96,114,120,126,132,144,156,162,174,180,186,204,210,227,
0,6,24,30,36,48,54,66,78,85,91,96,114,121,127,132,138,144,156,162,174,180,186,204,210,227,
0,6,24,30,36,49,55,61,66,79,86,92,97,115,122,128,133,144,157,163,174,180,186,204,210,227,
0,7,25,30,37,50,56,67,80,87,93,98,116,123,129,134,145,158,164,175,180,187,205,210,227,
1,8,26,31,38,51,57,68,81,88,94,99,117,124,130,135,146,159,165,176,181,188,206,211,227,
2,9,27,32,39,52,58,69,82,89,95,100,118,125,131,136,147,160,166,177,182,189,207,212,227,
3,10,28,33,40,53,59,70,83,89,95,101,119,125,131,137,148,161,167,178,183,190,208,213,227,
4,11,29,34,41,53,59,71,83,89,95,101,107,119,125,131,137,149,161,167,179,184,191,209,214,227,
5,11,29,35,41,53,59,71,83,89,95,101,119,125,131,137,143,149,161,167,179,185,191,209,215,227,
5,11,29,35,41,53,59,71,83,88,94,101,119,124,130,137,149,161,167,179,185,191,209,215,227,
5,11,29,35,41,52,58,71,82,87,93,100,118,123,129,136,149,160,166,179,185,191,209,215,227,
5,10,28,35,40,51,57,70,81,86,92,99,117,122,128,135,148,159,165,178,185,190,208,215,227,
4,9,27,34,39,50,56,69,80,85,91,98,116,121,127,134,147,158,164,177,184,189,207,214,227,
255,//  ЭФФЕКТ ВЫТРЯХИВАНИЯ КОВРА//
0,7,14,21,28,35,37,44,51,58,65,70,74,81,88,95,100,105,111,118,125,130,135,140,148,155,160,165,170,175,185,190,195,200,205,210,227,
1,8,15,22,29,34,38,45,52,59,64,69,75,82,89,94,99,104,112,119,124,129,134,139,149,154,159,164,169,174,184,189,194,199,204,211,227,
2,9,16,23,28,33,39,46,53,58,63,68,76,83,88,93,98,103,113,118,123,128,133,138,148,153,158,163,168,175,183,188,193,198,205,212,227,
3,10,17,22,27,32,40,47,52,57,62,67,77,82,87,92,97,102,112,117,122,127,132,139,147,152,157,162,169,176,182,187,192,199,206,213,227,
4,11,16,21,26,31,41,46,51,56,61,66,76,81,86,91,96,103,111,116,121,126,133,140,146,151,156,163,170,177,181,186,193,200,207,214,227,
5,10,15,20,25,30,40,45,50,55,60,67,75,80,85,90,97,104,110,115,120,127,134,141,145,150,157,164,171,178,180,187,194,201,208,215,227,
4,9,14,19,24,31,39,44,49,54,61,68,74,79,84,91,98,105,109,114,121,128,135,142,144,151,158,165,172,179,181,188,195,202,209,214,227,
3,8,13,18,25,32,38,43,48,55,62,69,73,78,85,92,99,106,108,115,122,129,136,143,145,152,159,166,173,178,182,189,196,203,208,213,227,
2,7,12,19,26,33,37,42,49,56,63,70,72,79,86,93,100,107,109,116,123,130,137,142,146,153,160,167,172,177,183,190,197,202,207,212,227,
1,6,13,20,27,34,36,43,50,57,64,71,73,80,87,94,101,106,110,117,124,131,136,141,147,154,161,166,171,176,184,191,196,201,206,211,227,
255,//  ВОЛНА-ГОРА//
5,10,15,20,25,30,180,187,194,201,208,215,227,
11,16,21,26,31,66,144,181,188,195,202,209,227,
17,22,27,32,67,102,108,145,182,189,196,227,
23,28,33,68,72,103,109,138,146,183,190,197,227,
29,34,36,69,73,104,110,139,147,174,184,191,227,
0,35,37,70,74,105,111,140,148,175,185,210,227,
1,6,38,71,75,106,112,141,149,176,204,211,227,
2,7,12,39,76,107,113,142,177,198,205,212,227,
3,8,13,18,40,77,143,178,192,199,206,213,227,
4,9,14,19,24,41,179,186,193,200,207,214,227,
255,//  ДВЕ ЗМЕЙКИ ГОНЯЮТСЯ ДРУГ ЗА ДРУГОМ//
2,7,8,9,12,13,14,15,16,19,20,21,25,26,27,31,32,33,227,
1,2,3,6,7,8,9,10,13,14,15,19,20,21,25,26,27,38,227,
0,1,2,3,4,7,8,9,13,14,15,19,20,21,37,38,39,74,227,
1,2,3,7,8,9,13,14,15,36,37,38,39,40,73,74,75,110,227,
1,2,3,7,8,9,37,38,72,73,74,75,76,109,110,111,146,227,
1,2,3,37,38,39,73,74,75,108,109,110,111,112,145,146,147,182,227,
37,38,39,73,74,75,109,110,111,144,145,146,147,148,181,182,183,188,227,
73,74,75,109,110,111,145,146,147,180,181,182,183,184,187,188,189,194,227,
109,110,111,145,146,147,181,182,183,186,187,188,189,190,193,194,195,200,227,
145,146,147,181,182,183,187,188,189,192,193,194,195,196,199,200,201,206,227,
181,182,183,187,188,189,193,194,195,198,199,200,201,202,205,206,207,212,227,
176,187,188,189,193,194,195,199,200,201,204,205,206,207,208,211,212,213,227,
140,175,176,177,193,194,195,199,200,201,205,206,207,210,211,212,213,214,227,
104,139,140,141,174,175,176,177,178,199,200,201,205,206,207,211,212,213,227,
68,103,104,105,138,139,140,141,142,175,176,177,205,206,207,211,212,213,227,
32,67,68,69,102,103,104,105,106,139,140,141,175,176,177,211,212,213,227,
26,31,32,33,66,67,68,69,70,103,104,105,139,140,141,175,176,177,227,
20,25,26,27,30,31,32,33,34,67,68,69,103,104,105,139,140,141,227,
14,19,20,21,24,25,26,27,28,31,32,33,67,68,69,103,104,105,227,
8,13,14,15,18,19,20,21,22,25,26,27,31,32,33,67,68,69,227,
255,//  СТРЕЛКА ДВИЖЕТСЯ ГОРИЗОНТАЛЬНО ПО ВНЕШНИМ СТОРОНАМ КУБА//
4,9,11,16,39,41,51,53,76,81,83,88,227,
111,116,118,123,146,148,158,160,183,188,190,195,227,
128,133,135,163,165,175,177,200,205,207,212,227,
19,24,26,31,54,56,66,68,91,96,98,103,227,
2,7,9,14,37,39,49,51,74,79,81,86,227,
111,116,118,123,146,148,158,160,183,188,190,195,227,
130,135,137,142,165,167,177,179,202,207,209,214,227,
81,86,88,93,116,118,128,130,153,158,160,165,227,
22,27,29,34,57,59,69,71,94,99,101,106,227,
49,54,56,61,84,86,96,98,121,126,128,133,227,
39,44,46,51,74,76,86,88,111,116,118,123,227,
55,60,62,67,90,92,102,104,127,132,134,139,227,
118,123,125,130,153,155,165,167,190,195,197,202,227,
255,//  СЛУЧАЙНОЕ ДВИЖЕНИЕ ШАРА//
0,1,2,3,4,5,227,
6,7,8,9,10,11,36,37,38,39,40,41,227,
12,13,14,15,16,17,42,43,44,45,46,47,72,73,74,75,76,77,227,
18,19,20,21,22,23,48,49,50,51,52,53,78,79,80,81,82,83,108,109,110,111,112,113,227,
24,25,26,27,28,29,54,55,56,57,58,59,84,85,86,87,88,89,114,115,116,117,118,119,144,145,146,147,148,149,227,
30,31,32,33,34,35,60,61,62,63,64,65,90,91,92,93,94,95,120,121,122,123,124,125,150,151,152,153,154,155,180,181,182,183,184,185,227,
66,67,68,69,70,71,96,97,98,99,100,101,126,127,128,129,130,131,156,157,158,159,160,161,186,187,188,189,190,191,227,
102,103,104,105,106,107,132,133,134,135,136,137,162,163,164,165,166,167,192,193,194,195,196,197,227,
138,139,140,141,142,143,168,169,170,171,172,173,198,199,200,201,202,203,227,
174,175,176,177,178,179,204,205,206,207,208,209,227,
210,211,212,213,214,215,227,
30,31,32,33,34,35,227,
24,25,26,27,28,29,67,68,69,70,71,227,
18,19,20,21,22,23,60,61,62,63,64,65,102,103,104,105,106,107,227,
12,13,14,15,16,17,54,55,56,57,58,59,96,97,98,99,100,101,138,139,140,141,142,143,227,
6,7,8,9,10,11,48,49,50,51,52,53,90,91,92,93,94,95,132,133,134,135,136,137,174,175,176,177,178,179,227,
0,1,2,3,4,5,42,43,44,45,46,47,84,85,86,87,88,89,126,127,128,129,130,131,168,169,170,171,172,173,210,211,212,213,214,215,227,
36,37,38,39,40,41,78,79,80,81,82,83,120,121,122,123,124,125,162,163,164,165,166,167,204,205,206,207,208,209,227,
72,73,74,75,76,77,114,115,116,117,118,119,156,157,158,159,160,161,198,199,200,201,202,203,227,
108,109,110,111,112,113,150,151,152,153,154,155,192,193,194,195,196,197,227,
144,145,146,147,148,149,186,187,188,189,190,191,227,
180,181,182,183,184,185,227,
255,//  ДВЕ ПЛОСКОСТИ ВЕРТИКАЛЬНЫЕ ПООЧЕРЕДИ ДВИГАЮТСЯ ПО ДИАГОНАЛИ//
//добавка здесь новых данных для эффектов
300};
int []tabl_eff=new int[600];
int nomer_eff=1;//счётчик номеров эффектов
StringList nazvania_eff;//переменная хранения списка имён эффектов

////////////////////////////////////////////////////////////////////////
void setup()
{
size(650, 600, P3D);//размер экрана
//noStroke();
stroke(0,100,100,100); 
frameRate(10);//число кадров в секунду
////////////////
// печатаем список всех доступных последовательных портов:
printArray (Serial.list());
// открываем используемый порт на нужной скорости:
myPort = new Serial(this, Serial.list()[0], 115200);
nazvania_eff= new StringList();//массив хранения имён эффектов
///////// НАЗВАНИЯ эффектов вносим в список ///////////////
nazvania_eff.append("ДВЕ ПЛОСКОСТИ ВЕРТИКАЛЬНЫЕ ПООЧЕРЕДИ ДВИГАЮТСЯ ПО ДИАГОНАЛИ");// нулевое по счёту название эфф. в массиве хр. имён - последние в массиве данных!!!
///// добавка здесь новых названий эффектов 
nazvania_eff.append("КВАДРОПОД ШАГАЕТ");
nazvania_eff.append("ПИРАМИДКА СТАТИЧНАЯ");
nazvania_eff.append("ДИНОЗАВР - ПОХОДКА");
nazvania_eff.append("СЛОЙ ДВИЖЕТСЯ ПО ДИАГОНАЛИ КУБА СНИЗУ ВВЕРХ, СЛЕВА НАПРОВО, ВГЛУБЬ");
nazvania_eff.append("ЭФФЕКТ ВОЛНА");
nazvania_eff.append("МОТОР - ЦИЛИНДРЫ");
nazvania_eff.append("НАРАСТАНИЕ И УМЕНЬШЕНИЕ КОНТУРА КУБА ПО ДИАГОНАЛИ");
nazvania_eff.append("ВЫТРЯХИВАНИЯ КОВРА");
nazvania_eff.append("ВОЛНА-ГОРА");
nazvania_eff.append("ДВЕ ЗМЕЙКИ ГОНЯЮТСЯ ДРУГ ЗА ДРУГОМ");
nazvania_eff.append("СТРЕЛКА ДВИЖЕТСЯ ГОРИЗОНТАЛЬНО ПО ВНЕШНИМ СТОРОНАМ КУБА");
nazvania_eff.append("СЛУЧАЙНОЕ ДВИЖЕНИЕ ШАРА");
} 
////////////////////////////////////////////////////////////////////////
void draw()
{delay(n);//скорость анимации регулирует
 //////////////////////////////////////////////////
 i=0;
 while(fl_A==true){tabl_eff[i]=tabl_dano[j];if(tabl_dano[j]==255){fl_A=false;s=0;}i++;j++;if(tabl_dano[j]==300){j=0;nomer_eff=0;}}//запись в массив текущего эффекта
if(fl_D==true){k++;}if(k>600){fl_A=true;k=0;nomer_eff++;}//число циклов draw на 1 эффект

/////////////////////////////////////////////////
background(N);//цвет фона
lights();//освещение сцены 
/////// РИСУЕМ кнопки управления и названия к ним - добавочно к клавишам ////////////////
for (i=0;i<9;i++)
{
strokeWeight(3);stroke(255,0,0);fill(0, 255, 255,200);rect(20+70*i,20, 60, 30, 5);stroke(0,100,100,100);//горизонтальные кнопки
strokeWeight(3);stroke(255,0,0);fill(0, 255, 255,200);rect(20,100+50*i, 60, 30, 5);stroke(0,100,100,100);//вертикальные кнопки
}
stroke(255,0,0);noFill();rect(10,140, 80, 100, 5);stroke(0,100,100,100);//рамка вокруг кнопок порта
//////// горизонтальные кнопки ///////////////
fill(0);textSize(18); text("  ФОН", 20, 40);text(" ЦВЕТ", 90, 40);textSize(12);text(" АВТ/РУЧ", 160, 40);textSize(10);text(" СТОП-ШАГ", 230, 40);
textSize(14);text(" ФОРМА", 300, 40);textSize(12);text(" РАЗМЕР", 370, 40);textSize(10);text(" СКОРОСТЬ", 440, 40);textSize(11);text(" ЭФФЕКТ"+nomer_eff, 510, 40);
textSize(18);text(" ФОТО", 580, 40);
//////// вертикальные кнопки ///////////////
textSize(11); text(" ТРАНСФ."+transf, 20, 120);textSize(9); if(fl_P==true){text(" ВКЛЮЧЕНО", 20, 170);}else{text("ВЫКЛЮЧЕНО", 20, 170);}
textSize(14);text(Serial.list()[port_no],25, 220);
//////////// текст с номером исполняемого эффекта ////////////////
fill(255,0,0);textSize(14); text("ЭФФЕКТ №"+nomer_eff, 20, 590);textSize(14);text(nazvania_eff.get(nomer_eff), 120, 590);

/////////////////////////////////////////////////
translate(width/2, (height/2)-50);
///////// НАВИГАЦИЯ исполнения эффектов ////////
if (mousePressed && (mouseButton == LEFT)){if( mouseX>100&&mouseY>75&&fl_C==true){X=rotX + distY; Y=rotY + distX;fl=1;}else{fun_knopka();}}// если нажата кнопка мыши и она левая вращаем видимым кубом
if(fl_C==true)
{
if (mousePressed && (mouseButton == RIGHT)){X=rotX + distY; Y=rotY + distX;fl=0;}// если нажата кнопка мыши и она правая вращаем невидимым кубом
rotateX(X); rotateY(Y);
} else{avtonom();}

if (mousePressed && (mouseButton == CENTER)){fl_D=!fl_D;delay(200);}// если нажата центральная кнопка мыши то стоп кадр

if (keyPressed&&key == ' ') {fl_A=true;k=0;nomer_eff++;}//если нажат пробел переходим к следующему эффекту
if (keyPressed&&(key == 'ц'||key == 'Ц'||key == 'w'||key == 'W')) {color_smena();}//если нажата клавиша "W"(Ц) меняем цвет куба
if (keyPressed&&(key == 'v'||key == 'V'||key == 'м'||key == 'М')){n=n+50;if(n>150){n=50;}delay(100);}// если нажата клавиша "V"(М)меняем скорость исполнения эффекта 
if (keyPressed&&(key == 'a'||key == 'A'||key == 'ф'||key == 'Ф')){fl_C=!fl_C;delay(100);}// если нажата клавиша "A"(Ф)меняем автономный и ручной режимы 
if (keyPressed&&(key == 'r'||key == 'R'||key == 'к'||key == 'К')){raz=raz*2;if(raz>4){raz=1;}delay(100);}// если нажата клавиша "R"(К)меняем размер элемента куба
if (keyPressed&&(key == 'f'||key == 'F'||key == 'а'||key == 'А')){forma_++;if(forma_>2){forma_=0;}delay(100);}// если нажата клавиша "F"(А)меняем форму элемента куба
if (keyPressed&&(key == 'q'||key == 'Q'||key == 'й'||key == 'Й')){N=N+127;if(N>255){N=0;}delay(100);}// если нажата клавиша "Q"(Й)меняем цвет экрана (день-ночь)
//if (keyPressed&&(key == 's'||key == 'S'||key == 'ы'||key == 'Ы')){s=ss;delay(100);}//покадровое исполнение текущего эффекта, работает вместе со стоп-кадром
/////////////////////////////////////////////////
/////// перебор кадров в эффекте ///////////////
/////////////////////////////////////////////////

 for (i=s+1;i<tabl_eff.length;i++)  
{

if(tabl_eff[i]==255){s=0;ss=sss;break;}  
if(tabl_eff[i]==227){ss=i;if(s==0){sss=i;}
if(fl_P==true){myPort.write(str(tabl_eff[i]));myPort.write(',');}//передача данных на реальный куб
break;}
}

////////////////////////////////////////////////
////// построение изображения куба в кадре //////////////
///////////////////////////////////////////////  
for (x=-2;x<4;x++)
{
  for (y=-2;y<4;y++)
  {
   for (z=-2;z<4;z++)
  { 
if(fl==1){translate(2*R*x,2*R*y,2*R*z);strokeWeight(1);noFill();forma();translate(-2*R*x,-2*R*y,-2*R*z);}// условие видимости всего куба
 for (i=s;i<ss;i++)  
{

if((x+2)+(y+2)*6+(z+2)*36==tabl_eff[i]&&transf==0){translate(2*R*x,2*R*y,2*R*z);strokeWeight(0.1);fill(r, g, b);forma();translate(-2*R*x,-2*R*y,-2*R*z);//рисует пиксели по кадру
 if(fl_P==true){myPort.write(str(tabl_eff[i]));myPort.write(',');}//передача данных на реальный куб
 }
if((y+2)+(x+2)*6+(z+2)*36==tabl_eff[i]&&transf==1){translate(2*R*x,2*R*y,2*R*z);strokeWeight(0.1);fill(r, g, b);forma();translate(-2*R*x,-2*R*y,-2*R*z);}//рисует пиксели по кадру (поворот)
if((x+2)+(-y+3)*6+(z+2)*36==tabl_eff[i]&&transf==2){translate(2*R*x,2*R*y,2*R*z);strokeWeight(0.1);fill(r, g, b);forma();translate(-2*R*x,-2*R*y,-2*R*z);}//рисует пиксели по кадру (реверс)
if((y+2)+(-x+3)*6+(-z+3)*36==tabl_eff[i]&&transf==3){translate(2*R*x,2*R*y,2*R*z);strokeWeight(0.1);fill(r, g, b);forma();translate(-2*R*x,-2*R*y,-2*R*z);}//рисует пиксели по кадру (комбинация)
if((-y+3)+(x+2)*6+(-z+3)*36==tabl_eff[i]&&transf==4){translate(2*R*x,2*R*y,2*R*z);strokeWeight(0.1);fill(r, g, b);forma();translate(-2*R*x,-2*R*y,-2*R*z);}//рисует пиксели по кадру (комбинация)
if((x+2)+(y+2)*6+(z+2)*36==tabl_eff[i]&&transf==5){translate(2*R*x,2*R*y,2*R*z);strokeWeight(1);stroke(255,127,0);noFill();forma();stroke(0,100,100,100);translate(-2*R*x,-2*R*y,-2*R*z);}//рисует пиксели- контуры по кадру
if(transf==5){}//исчезновение
}
  }
}
}
if(fl_D==true){s=ss;}
////////////////////////////////////////////////
if(fl==0){strokeWeight(R/5);translate(R,R,R);noFill();box(12*R);}//рамка - куб при невидимости всего куба
if(fl==1){strokeWeight(R/5);translate(R,8*R,R);noFill();box(13*R,2*R,13*R);}//рамка - основание куба при его видимости
/////////////////////////////////
if(knopka==8){if(fotka==0){save("kadr_0.png");}if(fotka==1){save("kadr_1.png");}if(fotka==2){save("kadr_2.png");}if(fotka==3){save("kadr_3.png");}
if(fotka==4){save("kadr_4.png");}if(fotka==5){save("kadr_5.png");}if(fotka==6){save("kadr_6.png");}if(fotka==7){save("kadr_7.png");}
fotka++;if(fotka>7){fotka=0;}knopka=50;}//сохранение "фото" стоп-кадра
/////////////////////////////////////////////////
}


/////////////////// функции положения курсора и вращения колеса ////////////////////////////////////////////
void mousePressed() {if(mouseX>100&& mouseY>75){ lastX = mouseX; lastY = mouseY;} }//когда нажата
void mouseDragged() {if(mouseX>100&& mouseY>75){  distX = radians(mouseX - lastX); distY = radians(lastY - mouseY);} }//когда движется 
void mouseReleased() { if(mouseX>100&& mouseY>75){ rotX += distY; rotY += distX;distX = distY = 0.0;} }//когда отпущена 
void mouseWheel(MouseEvent event){R=R+5*event.getCount();}//приближение-удаление куба с помощью колеса мыши
 ////////////////// функция автономного вращения куба //////////////////////////
 void avtonom()
 {
  if(fl_B==true){rotateY(2*PI*m/256);}else{rotateY(-2*PI*m/256);}
  if(millis()-T>n){T=millis();m++;if(m>255){m=0;fl_B=!fl_B;if(fl_D==true){color_smena();fl_A=true;k=0;nomer_eff++;}}} 
 }
 ///////////// функция смены цвета ///////////////
 void color_smena()
 {
  color_++;
if(color_>7){color_=0;}if(color_==0){r=0;g=255;b=0;}if(color_==1){r=255;g=0;b=0;}if(color_==2){r=0;g=127;b=255;}if(color_==3){r=0;g=255;b=255;}if(color_==4){r=255;g=255;b=255;}
if(color_==5){r=255;g=255;b=0;}if(color_==6){r=255;g=0;b=255;}if(color_==7){r=255;g=127;b=0;}
 }
 /////////// функция смены формы элемента куба ////////////
 void forma()
 {
  if(forma_==0){box(R/raz);}//форма пикселя куб
  if(forma_==1){//форма пикселя шару подобная
 ellipse(0, 0,R/raz,R/raz);
 rotateX(PI/2);ellipse(0, 0,R/raz,R/raz);rotateX(-PI/2);
 rotateX(-PI/4);ellipse(0, 0,R/raz,R/raz);rotateX(PI/4);
 rotateX(PI/4);ellipse(0, 0,R/raz,R/raz);rotateX(-PI/4);
 rotateY(PI/2);ellipse(0, 0,R/raz,R/raz);rotateY(-PI/2);
 rotateY(PI/4);ellipse(0, 0,R/raz,R/raz);rotateY(-PI/4);
 rotateY(-PI/4);ellipse(0, 0,R/raz,R/raz);rotateY(PI/4);
 rotateZ(PI/4);ellipse(0, 0,R/raz,R/raz);rotateZ(-PI/4);
 rotateZ(-PI/4);ellipse(0, 0,R/raz,R/raz);rotateZ(PI/4);
 rotateZ(PI/2);ellipse(0, 0,R/raz,R/raz);rotateZ(-PI/2);
} 
if(forma_==2)//форма пикселя светодиоду подобная
{
rect(-R/(2*raz),0,R/raz,R/raz ); ellipse(0, 0,R/raz,R/raz);
rotateY(PI/2);rect(-R/(2*raz),0,R/raz,R/raz ); ellipse(0, 0,R/raz,R/raz);rotateY(-PI/2);
rotateY(PI/4);rect(-R/(2*raz),0,R/raz,R/raz ); ellipse(0, 0,R/raz,R/raz);rotateY(-PI/4);
rotateY(-PI/4);rect(-R/(2*raz),0,R/raz,R/raz ); ellipse(0, 0,R/raz,R/raz);rotateY(PI/4);
rotateX(PI/2);ellipse(0,0,R/raz,R/raz);translate(0,0,-R/raz);ellipse(0,0,R/raz,R/raz);translate(0,0,R/raz);rotateX(-PI/2);
}
 }
 /////////////// функция проверки нажатия дублирующих клавиши кнопок ///////////////////////////////////////////
 void fun_knopka()
 {
   if(mouseY<75)//горизонтальные 
   {
 for (i=0;i<9;i++)
{
 if( mouseX>20+(70*i)&&mouseX<80+(70*i)){knopka=i;
 translate(-width/2, (-height/2)+50);fill(0,255,255,200);rect(20+70*i,20, 60, 30, 5);translate(width/2, (height/2)-50);break;} 
}
/////// выполнение команд по условиям для горизонтальных кнопок ////////
if(knopka==0){N=N+127;if(N>255){N=0;}delay(100);}//цвет фона приложения день-ночь-утро
if(knopka==1){color_smena();}//выбор цвета пикселей
if(knopka==2){fl_C=!fl_C;delay(100);}// меняем автономный и ручной режимы 
if(knopka==3){s=ss;delay(100);}//покадровое исполнение текущего эффекта, работает вместе со стоп-кадром
if(knopka==4){forma_++;if(forma_>2){forma_=0;}delay(100);}//форма пикселя меняется
if(knopka==5){raz=raz*2;if(raz>4){raz=1;}delay(100);}//размер пикселя меняем
if(knopka==6){n=n+50;if(n>150){n=50;}delay(100);}//скорость регулируем
if(knopka==7){fl_A=true;k=0;nomer_eff++;}//переход к следующему эффекту
//if(knopka==8){save("kadr.png");knopka=50;}//сохранение "фото" стоп-кадра (СТРОКА НАХОДИТЬСЯ В ДРУГОМ МЕСТЕ ПРОГРАММЫ)
   }
  if(mouseX<100)//вертикальные
   {
 for (i=0;i<9;i++)
    { 
  if( mouseY>100+(50*i)&&mouseY<130+(50*i)){knopka=i+9;
   translate(-width/2, (-height/2)+50);fill(0,255,255,200);rect(20,100+50*i, 60, 30, 5);translate(width/2, (height/2)-50);break;} 
     }
  /////// выполнение команд по условиям для вертикальных кнопок ////////
if(knopka==9){transf++;if(transf>6){transf=0;}delay(100);}//трансформация - реверс,поворот,комбинация,исчезновение анимации 
if(knopka==10){fl_P=!fl_P;perekl_porta();delay(100);}//включение-выключение сом порта
if(knopka==11){port_no++;if(port_no+1>Serial.list().length){port_no=0;}delay(100);}//выбор номера порта для связи
   }
 }
 //////////////////////////////////////////////////////////
 void perekl_porta()
 {
  myPort.clear(); myPort.stop();myPort = new Serial(this,Serial.list()[port_no], 115200);//очищаем порт,отключаем и меняем на новый 
  
 }

 

leks
Offline
Зарегистрирован: 22.10.2017

А ещё можно покадрово снимать и делать гиф-картинки.

sadman41
Offline
Зарегистрирован: 19.10.2016

leks - молодец, добивает тему.

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

А для  чего используется аппинвентор ?

leks
Offline
Зарегистрирован: 22.10.2017

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

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

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

https://www.youtube.com/user/d36073/search?query=app

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

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

https://www.youtube.com/user/d36073/search?query=app

lilik
Offline
Зарегистрирован: 19.10.2017

https://geckoanton.github.io/quadrum/index.html

Наконец-таки, нашёл симулятор куба! Автор сделал шаг во всём кубостроении. Ему удалось создать симулятор-генератор кода для любых типов кубов, с любым числом пикселей в грани, реализовав "живое" и в "записи" воспроизведение. Я  :-)  проверил на своём кубе 555 из умных светодиодов. Может кто знает - есть ли другие схемные решения кубов кроме сдвиговых регистров, max 7219 и умных пикселей?

ПС

Хорошо бы автору ещё добавить возможность создания серии эффектов в одном скетче. Из минусов ещё то, что надо писать самому скетч-адаптер под свой кубик, но это "издержки" авторского концепта.

 

lilik
Offline
Зарегистрирован: 19.10.2017

Вот пример синхронного воспроизведения на куб.

sadman41
Offline
Зарегистрирован: 19.10.2016

Вангую, что далее будет объемный градусник, кошачий глаз в 3D и радар.

lilik
Offline
Зарегистрирован: 19.10.2017

sadman41 пишет:
Вангую, что далее будет объемный градусник, кошачий глаз в 3D и радар.

:-)

Нет, не будет. Просто ещё не придумали 3D экранчики, а в светодиодных один слой визуально экранирует другой - нужны хотя бы полупрозрачные светодиоды и провода. 

lilik
Offline
Зарегистрирован: 19.10.2017

Подниму тему, не знаю почему захотелось задумку автора довести до "маломальской" удобоваримости пользователями :-)

Суть проблемы : библиотеки автора рассчитаны на исполнение 1 эффекта вместо "скока хошь"

Пробую это исправить.

///////////////////////////
#include <QuadrumCode.h>
#include "Adafruit_NeoPixel.h"
#define LED_COUNT1 125
#define LED_PIN1 6

Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(LED_COUNT1, LED_PIN1, NEO_GRB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой. 
int r=0;int g=15; int b=0;//переменные хранения параметров включений пикселей

const uint8_t animation_1[] = {0x05,0x01,0x01,0x09,0x00,0x00,0x00,0xC8,0x42,0x1F,0x00,0x00,0x22,0x00,0x00,0x44,0x00,0x00,0x88,0x00,0x00,0xF0,0x01,0x00,0x00,0x00,
0x00,0xC8,0x42,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x05,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x14,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,
0x00,0xF0,0x01,0x00,0x20,0x02,0x00,0x40,0x04,0x00,0x80,0x08,0x00,0x00,0x1F,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x14,0x00,0x00,0x38,0x00,
0x00,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x80,0x03,
0x00,0x00,0x05,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x22,0x00,0x00,0x44,0x00,0x00,0x88,0x00,0x00,0xF0,0x01,0x00,0x00};
//////////
const uint8_t animation_2[] = {0x05,0x01,0x01,0x09,0x00,0x00,0x00,0xC8,0x42,0x01,0x00,0x00,0x02,0x00,0x00,0x04,0x00,0x00,0x08,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0xC8,
0x42,0x40,0x00,0x00,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,0x10,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x00,0x80,0x00,0x00,
0x00,0x01,0x00,0x00,0x00,0xC8,0x42,0x00,0x00,0x04,0x00,0x00,0x08,0x00,0x00,0x10,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x01,0x00,0x00,0x02,
0x00,0x00,0x04,0x00,0x00,0x08,0x00,0x00,0x10,0x00,0x00,0xC8,0x42,0x00,0x00,0x04,0x00,0x00,0x08,0x00,0x00,0x10,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x00,0x00,0xC8,0x42,0x00,
0x10,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x00,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xC8,0x42,0x40,0x00,0x00,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x00,0x04,0x00,
0x00,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//////////////////////////////////////
bool fl=1;// задаёт какой из "массивов будет воспроизводиться на кубе"
QuadrumCode qc_1 (animation_1,256); 
QuadrumCode qc_2 (animation_2,256); 
 
void setup () {

strip1.begin();
for(int i=0;i<LED_COUNT1;i++)
 {
  strip1.setPixelColor(i,0,0,0);//
  }strip1.show(); 
    
if(fl==true){qc_1. start ();} // должен быть последним вызовом внутри функции настройки // ничего ниже qc.start () не будет выполняться
else{qc_2. start ();} 
}
///////////////
void loop () {
 
 kadr();
 delay(150);
}
/////////////////////////////////
void kadr(){
 for ( int z = 0; z <5; z ++) {
  for ( int y = 0; y <5; y ++) {
    for ( int x = 0; x <5; x ++) {
      if(fl==true){
        if  (qc_1. getVoxelState (y, 4-x, z)==true){ // возвращает true, если воксель в x, y и z включен, иначе возвращает false
            strip1.setPixelColor(x+5*y+25*z,r,g,b);//
            }else{strip1.setPixelColor(x+5*y+25*z,0,0,0);}
      }
      if(fl==false){
        if  (qc_2. getVoxelState (y, 4-x, z)==true){ // возвращает true, если воксель в x, y и z включен, иначе возвращает false
            strip1.setPixelColor(x+5*y+25*z,r,g,b);//
            }else{strip1.setPixelColor(x+5*y+25*z,0,0,0);}
      }
        }
    }
}
strip1.show(); 
}
//////////////////////////////////

Вот так работает. При попытке перенести массивы в PROGMEM уже нет. Понимаю, что проблема в 25,26 строках.

Функции на которые грешу в файле cpp. имеет вид:

QuadrumCode::QuadrumCode(const uint8_t* animationData, uint16_t planeRate) {
	startup(animationData, planeRate);
}
void QuadrumCode::startup(const uint8_t* animationData, uint16_t planeRate) {
	this->cubeSide = animationData[0];
	this->animationData = (int8_t*) animationData;
	this->loopCallWait = (1000000.0f / (float) planeRate);
	
	this->channelCount = animationData[1];
	this->channelSize = animationData[2];
	this->channelMaxValue = (int16_t) pow(2, channelSize) - 1;
	
	ByteToInt bti;
	bti.bytes[0] = (uint8_t) animationData[3];
	bti.bytes[1] = (uint8_t) animationData[4];
	this->frameCount = bti.value;
	
	int16_t frameBitSize = pow(cubeSide, 3) * channelCount * channelSize;
	this->frameDataSize = (int16_t) (ceil((float) frameBitSize / (float) BYTE_SIZE)) + 4;	// + 4 (sizeof(float)) because of frame duration at beginning
}

Можно это исправить?

lilik
Offline
Зарегистрирован: 19.10.2017
///////////////////////////
#include <QuadrumCode.h>
#include "Adafruit_NeoPixel.h"
#define LED_COUNT1 125
#define LED_PIN1 6

Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(LED_COUNT1, LED_PIN1, NEO_GRB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой. 
int r=0;int g=15; int b=0;//переменные хранения параметров включений пикселей

const uint8_t animation_1[] PROGMEM = {0x05,0x01,0x01,0x09,0x00,0x00,0x00,0xC8,0x42,0x1F,0x00,0x00,0x22,0x00,0x00,0x44,0x00,0x00,0x88,0x00,0x00,0xF0,0x01,0x00,0x00,0x00,
0x00,0xC8,0x42,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x05,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x14,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,
0x00,0xF0,0x01,0x00,0x20,0x02,0x00,0x40,0x04,0x00,0x80,0x08,0x00,0x00,0x1F,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x14,0x00,0x00,0x38,0x00,
0x00,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x80,0x03,
0x00,0x00,0x05,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x22,0x00,0x00,0x44,0x00,0x00,0x88,0x00,0x00,0xF0,0x01,0x00,0x00};
//////////
const uint8_t animation_2[] PROGMEM = {0x05,0x01,0x01,0x09,0x00,0x00,0x00,0xC8,0x42,0x01,0x00,0x00,0x02,0x00,0x00,0x04,0x00,0x00,0x08,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0xC8,
0x42,0x40,0x00,0x00,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,0x10,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x00,0x80,0x00,0x00,
0x00,0x01,0x00,0x00,0x00,0xC8,0x42,0x00,0x00,0x04,0x00,0x00,0x08,0x00,0x00,0x10,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x01,0x00,0x00,0x02,
0x00,0x00,0x04,0x00,0x00,0x08,0x00,0x00,0x10,0x00,0x00,0xC8,0x42,0x00,0x00,0x04,0x00,0x00,0x08,0x00,0x00,0x10,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x00,0x00,0xC8,0x42,0x00,
0x10,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x00,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xC8,0x42,0x40,0x00,0x00,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x00,0x04,0x00,
0x00,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//////////////////////////////////////
bool fl=1;// задаёт какой из "массивов будет воспроизводиться на кубе"
QuadrumCode qc_1 (animation_1,256); 
QuadrumCode qc_2 (animation_2,256); 
 
void setup () {

strip1.begin();
for(int i=0;i<LED_COUNT1;i++)
 {
  strip1.setPixelColor(i,0,0,0);//
  }strip1.show(); 
    
if(fl==true){qc_1. start ();} // должен быть последним вызовом внутри функции настройки // ничего ниже qc.start () не будет выполняться
else{qc_2. start ();} 
}
///////////////
void loop () {
 
 kadr();
 delay(150);
}
/////////////////////////////////
void kadr(){
 for ( int z = 0; z <5; z ++) {
  for ( int y = 0; y <5; y ++) {
    for ( int x = 0; x <5; x ++) {
      if(fl==true){
        if  (qc_1. getVoxelState (y, 4-x, z)==true){ // возвращает true, если воксель в x, y и z включен, иначе возвращает false
            strip1.setPixelColor(x+5*y+25*z,r,g,b);//
            }else{strip1.setPixelColor(x+5*y+25*z,0,0,0);}
      }
      if(fl==false){
        if  (qc_2. getVoxelState (y, 4-x, z)==true){ // возвращает true, если воксель в x, y и z включен, иначе возвращает false
            strip1.setPixelColor(x+5*y+25*z,r,g,b);//
            }else{strip1.setPixelColor(x+5*y+25*z,0,0,0);}
      }
        }
    }
}
strip1.show(); 
}
//////////////////////////////////

А вот так уже нет. Ошибок тоже не выдаёт.

sadman41
Offline
Зарегистрирован: 19.10.2016

Надо библиотеку править так, чтобы для PROGMEM-массивов она читала их через pgm_read_byte(). Возможно, что придётся её очень сильно дописывать.

lilik
Offline
Зарегистрирован: 19.10.2017

sadman41 пишет:
Возможно, что придётся её очень сильно дописывать.

Скорее да, потому как в такой редакции придётся для переключений эффектов жать RESET.

lilik
Offline
Зарегистрирован: 19.10.2017

Потому что строки 36, 37 тоже весьма своеобразные для использования. Проще говоря, переменная fl должна быть определена однозначно в "сетап". 

sadman41
Offline
Зарегистрирован: 19.10.2016

Скетч-то можно и иначе написать. А вот если в библиотеке что-то в массивах изменяется, то тут все - приплыли. В противном случае - под прогмем перелицевать можно.

lilik
Offline
Зарегистрирован: 19.10.2017

sadman41 пишет:
Скетч-то можно и иначе написать.

Не, как я не пробовал перестановки функций работает только так. Ощущение, что библиотека как пример написана. При том, что сама идея блестящая - создать ПО которое не зависит никак от конкретного  железа и в то же время делает это железо законченной конструкцией для пользователя. Правда всё равно нужен каждому пользователю скетч-переходник под свой конкретный вариант куба, но он логически простой в написании.

Вот собственно весь файл - насчитал 5 мест где надо менять считывание элемента массива.

/*
 * QuadrumCode.cpp
 *
 *       Created on:  Okt 29, 2020
 *  Last Updated on:  Nov 5, 2020
 *           Author:  Anton Gecko https://github.com/antongecko
 *
 * Quadrum is a LED-Cube framework and editor.
 * Copyright (C) 2020  antongecko
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

#include "Arduino.h"
#include "QuadrumCode.h"

QuadrumCode::QuadrumCode(const uint8_t* animationData, uint16_t planeRate) {
	startup(animationData, planeRate);
}
void QuadrumCode::startup(const uint8_t* animationData, uint16_t planeRate) {
	this->cubeSide = animationData[0];
	this->animationData = (int8_t*) animationData;
	this->loopCallWait = (1000000.0f / (float) planeRate);
	
	this->channelCount = animationData[1];
	this->channelSize = animationData[2];
	this->channelMaxValue = (int16_t) pow(2, channelSize) - 1;
	
	ByteToInt bti;
	bti.bytes[0] = (uint8_t) animationData[3];
	bti.bytes[1] = (uint8_t) animationData[4];
	this->frameCount = bti.value;
	
	int16_t frameBitSize = pow(cubeSide, 3) * channelCount * channelSize;
	this->frameDataSize = (int16_t) (ceil((float) frameBitSize / (float) BYTE_SIZE)) + 4;	// + 4 (sizeof(float)) because of frame duration at beginning
}

bool QuadrumCode::start() {
	if(cubeSide < 0)
		return false;
	
	while(continueAnimation) {
		uint32_t startTime = micros();
		
		if(micros() > incrementFrameTime) {
			ByteToFloat frameDuration;
			for(int16_t i = 0; i < sizeof(float); i++)
				frameDuration.bytes[i] = (uint8_t) animationData[INIT_DATA_SIZE + (currentFrame * frameDataSize) + i];
			incrementFrameTime = (uint32_t) (frameDuration.value * 1000.0f) + micros();
			
			voxelData = &animationData[INIT_DATA_SIZE + (currentFrame * frameDataSize) + sizeof(float)];
			currentFrame++;
			if(currentFrame >= frameCount)
				currentFrame = 0;
		}
		
		float delayTime = (float) loopCallWait - (float) (micros() - startTime);
		delayMicroseconds(max((int32_t)delayTime, 0));
		
		loop();
	}
	
	while(true) {	// make sure anything after start call never gets executed
		loop();
		if(serialEventRun) serialEventRun();
	}
}
void QuadrumCode::terminate() {
	continueAnimation = false;
}

uint8_t QuadrumCode::getChannelBrightness(uint16_t channel, uint16_t x, uint16_t y, uint16_t z) {
    if(channel >= channelCount)
		return 0;
	
	int16_t voxelPos = ((cubeSide * cubeSide) * z) + (cubeSide * y) + x;
	int16_t readPos = (voxelPos * channelCount * channelSize) + (channel * channelSize);
	
	int16_t bytePos = readPos / BYTE_SIZE;
	int16_t byteOffset = readPos % BYTE_SIZE;
	
	uint8_t mask = ((int8_t) channelMaxValue) << byteOffset;
	uint8_t channelBits = (uint8_t) ((voxelData[bytePos] & mask) >> byteOffset);
	
	return (uint8_t) (((uint16_t) channelBits * 255) / (uint16_t) channelMaxValue);
}
uint8_t QuadrumCode::getVoxelBrightness(uint16_t x, uint16_t y, uint16_t z) {
    if(channelCount != 1)
		return 0;
	return getChannelBrightness(0, x, y, z);
}
bool QuadrumCode::getChannelState(uint16_t channel, uint16_t x, uint16_t y, uint16_t z) {
    if(channelSize != 1 || channel >= channelCount)
		return false;
	
	int16_t voxelPos = ((cubeSide * cubeSide) * z) + (cubeSide * y) + x;
	int16_t readPos = (voxelPos * channelCount) + channel;
	
	int16_t bytePos = readPos / BYTE_SIZE;
	int16_t byteOffset = readPos % BYTE_SIZE;
	
	int8_t mask = 0x1 << byteOffset;
	return (uint8_t) (voxelData[bytePos] & mask) > 0;
}
bool QuadrumCode::getVoxelState(uint16_t x, uint16_t y, uint16_t z) {
    if(channelCount != 1)
		return false;
	return getChannelState(0, x, y, z);
}

 

Вообще,  надо наверное, попробовать связаться с автором, а то нехорошо получается :-)

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Вроде только чтение происходит.

Если быстро кромсать по живому, то стоит добавить в класс флажок ram/progmem, написать функцию чтения из массива байта по индексу, в которой уже по флажку юзать pgm_read_byre или [].

lilik
Offline
Зарегистрирован: 19.10.2017

Это стратегия, мне бы тактику преодолеть.

 Понимаю что такое (поэлементно) (uint8_t) animationData[3]  меняем на     (uint8_t) pgm_read_byte(&animationData[3])

А это как? this->animationData = (int8_t*) animationData;

или вот: voxelData = &animationData[i]; это примерно так?: voxelData = &pgm_read_byte(&animationData[i]);

sadman41
Offline
Зарегистрирован: 19.10.2016

Ссылка на библиотеку есть? Скинь на wrk.sadman@gmail.com

lilik
Offline
Зарегистрирован: 19.10.2017

Спасибо большое за добровольно-безвозмездную помощь Вам. Так конечно я не напишу никогда. Всё работает. Автору написал письмо про желаемую модернизацию, жду ответа :-)

inline uint8_t QuadrumCode::getByte(const uint8_t* _array, const size_t _idx) { return storeIsProgmem ? pgm_read_byte(_array + _idx) : *( _array + _idx); }

sadman41
Offline
Зарегистрирован: 19.10.2016

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

lilik
Offline
Зарегистрирован: 19.10.2017

sadman41 пишет:
Эту хреновину с вызовом лупа из класса необходимо переделывать серьёзно. В противном случае пользоваться ей, конечно, крайне затруднительно.

А я ещё подумал: странно, в других библиотеках такого не видел. Пользоваться, для выбора из многих эффектов в скетче, думаю потенциометром и проводком на ресет. Ну, а может автор всё поправит и мне сообщит :-)

lilik
Offline
Зарегистрирован: 19.10.2017

sadman41 пишет:
Эту хреновину с вызовом лупа из класса необходимо переделывать серьёзно. В противном случае пользоваться ей, конечно, крайне затруднительно.

И снова СПАСИБО!, за бескорыстный вклад в дело кубостроения!

Базовый пример заработал.

///////////////////////////
#include <QuadrumCode.h>
#include "Adafruit_NeoPixel.h"
#define LED_COUNT1 125
#define LED_PIN1 6
#define DATASTORE_IS_PROGMEM true

Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(LED_COUNT1, LED_PIN1, NEO_GRB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой.
int r = 0; int g = 15; int b = 0; //переменные хранения параметров включений пикселей

const uint8_t animation_1[] = {0x05, 0x01, 0x01, 0x09, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x1F, 0x00, 0x00, 0x22, 0x00, 0x00, 0x44, 0x00, 0x00, 0x88, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00,
                               0x00, 0xC8, 0x42, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
                               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x14, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x00,
                               0x00, 0xF0, 0x01, 0x00, 0x20, 0x02, 0x00, 0x40, 0x04, 0x00, 0x80, 0x08, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x14, 0x00, 0x00, 0x38, 0x00,
                               0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x00, 0x00, 0x80, 0x03,
                               0x00, 0x00, 0x05, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x22, 0x00, 0x00, 0x44, 0x00, 0x00, 0x88, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00
                              };
//////////

const uint8_t animation_2[] PROGMEM = {0x05, 0x01, 0x01, 0x09, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x40, 0x00,
                                       0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 
                                       0x00, 0x01, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x00, 0x00, 0x01, 
                                       0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40,
                                       0x00, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00,
                                       0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00
                                       };
//////////////////////////////////////
QuadrumCode qc;
int t = 0; //счётчик кадров

void setup () {
  qc.configure(animation_1, 256, frame );
  // allow frame control//разрешить управление кадром
  qc.start();
  ////////////////////////////////////////////////
  strip1.begin();

  for (int i = 0; i < LED_COUNT1; i++) {
    strip1.setPixelColor(i, 0, 0, 0); //
  }
  strip1.show();
  /////////////////////////////////////////////////

}
void loop () {
  // tick must calls always to frame speed/change control//
  qc.tick();
  delay(200);// время между сменой кадров
  t++;
  if (t == 25) //если нам нужно поставить анимацию на паузу на 25 кадре
  {
    qc.stop();
  }

  if (t == 35) //если нам нужно продолжить анимацию на 35 кадре
  {
    qc.start();
  }

  if (t == 50) //если мы хотим изменить анимацию на 50 кадре
  {
    qc.configure(animation_2, 256, frame, DATASTORE_IS_PROGMEM); //здесь массив эффекта берём из флеш памяти
  }
  if (t == 100) //если мы хотим изменить анимацию на 100 кадре
  {
    qc.configure(animation_1, 256, frame);  // здесь массив эффекта берём из ОЗУ
    t = 0;
  }
}

/////////////////////////////////
void frame(QuadrumCode* _QuadrumCodeObject) {
  //Serial.println(millis());
  //delay(150);
  for (uint8_t z = 0; z < 5; z ++) {
    for (uint8_t y = 0; y < 5; y ++) {
      for (uint8_t x = 0; x < 5; x ++) {
        if  (_QuadrumCodeObject->getVoxelState (y, 4 - x, z) == true) { // возвращает true, если воксель в x, y и z включен, иначе возвращает false
          strip1.setPixelColor(x + 5 * y + 25 * z, r, g, b); //
        } else {
          strip1.setPixelColor(x + 5 * y + 25 * z, 0, 0, 0);
        }
      }
    }
  }
  strip1.show();
}
//////////////////////////////////

 

lilik
Offline
Зарегистрирован: 19.10.2017


///////////////////////////
#include <QuadrumCode.h>
#include "Adafruit_NeoPixel.h"
#define LED_COUNT1 125
#define LED_PIN1 6
#define DATASTORE_IS_PROGMEM true

Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(LED_COUNT1, LED_PIN1, NEO_GRB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой.
int r = 0; int g = 15; int b = 0; //переменные хранения параметров включений пикселей

const uint8_t animation_1[] = {0x05, 0x01, 0x01, 0x09, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x1F, 0x00, 0x00, 0x22, 0x00, 0x00, 0x44, 0x00, 0x00, 0x88, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00,
                               0x00, 0xC8, 0x42, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
                               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x14, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x00,
                               0x00, 0xF0, 0x01, 0x00, 0x20, 0x02, 0x00, 0x40, 0x04, 0x00, 0x80, 0x08, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x14, 0x00, 0x00, 0x38, 0x00,
                               0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x00, 0x00, 0x80, 0x03,
                               0x00, 0x00, 0x05, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x22, 0x00, 0x00, 0x44, 0x00, 0x00, 0x88, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00
                              };
//////////

const uint8_t animation_2[] PROGMEM = {0x05, 0x01, 0x01, 0x09, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x40, 0x00,
                                       0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00,
                                       0x00, 0x01, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x00, 0x00, 0x01,
                                       0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40,
                                       0x00, 0x00, 0x00, 0xC8, 0x42, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00,
                                       0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x42, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00
                                      };
//////////////////////////////////////
QuadrumCode qc;
int t = 0; //счётчик кадров

void setup () {
  qc.configure(animation_1, 256, frame );
  // allow frame control//разрешить управление кадром
  qc.start();
  ////////////////////////////////////////////////
  strip1.begin();

  for (int i = 0; i < LED_COUNT1; i++) {
    strip1.setPixelColor(i, 0, 0, 0); //
  }
  strip1.show();
  /////////////////////////////////////////////////

}
void loop () {
  // tick must calls always to frame speed/change control//
  qc.tick();
  delay(200);// время между сменой кадров
  t++;
  if (t == 25) //если нам нужно поставить анимацию на паузу на 25 кадре
  {
    qc.stop();
  }

  if (t == 35) //если нам нужно продолжить анимацию на 35 кадре
  {
    qc.start();
  }

  if (t == 50) //если мы хотим изменить анимацию на 50 кадре
  {
    qc.configure(animation_2, 256, frame, DATASTORE_IS_PROGMEM); //здесь массив эффекта берём из флеш памяти
  }
  if (t == 100) //если мы хотим изменить анимацию на 100 кадре
  {
    qc.configure(animation_1, 256, frame);  // здесь массив эффекта берём из ОЗУ
    t = 0;
  }
}

/////////////////////////////////
void frame(QuadrumCode* _QuadrumCodeObject) {
  uint8_t cubeSideSize = _QuadrumCodeObject->getCubeSideSize();
  for (uint8_t z = 0; z < cubeSideSize; z ++) {
    for (uint8_t y = 0; y < cubeSideSize; y ++) {
      for (uint8_t x = 0; x < cubeSideSize; x ++) {
        uint8_t pixelNumber =  x + (cubeSideSize * y) + (cubeSideSize * cubeSideSize * z);
        if  (_QuadrumCodeObject->getVoxelState (y, cubeSideSize - 1 - x, z) == true) { // возвращает true, если воксель в x, y и z включен, иначе возвращает false
          strip1.setPixelColor(pixelNumber, r, g, b); //
        } else {
          strip1.setPixelColor(pixelNumber, 0, 0, 0);
        }
      }
    }
  }
  strip1.show();
}
//////////////////////////////////

Ещё улучшенный вариант :-)

lilik
Offline
Зарегистрирован: 19.10.2017
/////////////////////////// КУБ 6*6*6 НА 6 MAX7219
#include <QuadrumCode.h>
#include <LedControlSPI.h>//вариация библиотеки LedControl (переименована),использующая аппаратный SPI 
// https://github.com/jacken/LedControl_HW_SPI
LedControl LC = LedControl(9,6);// создаём объект класса для 6 индикаторов
// при этом выводы 11-DIN(MOSI) 13-CLK(SCK) 9-CS //зелёный,фиолетовый,жёлтый
///////////////////////////////////////////
#define DATASTORE_IS_PROGMEM true
int x=0;int y=0;int z=0;
int i=0;//счётчик

const uint8_t animation_1[]  =        {0x06,0x01,0x01,0x0A,0x00,0x00,0x00,0xC8,0x42,0x3F,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x10,0x02,0x00,0x00,
                                       0x00,0x21,0x00,0x00,0x00,0xF0,0x03,0x00,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x80,0x04,0x00,
                                       0x00,0x00,0x48,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                       0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,0x00,
                                       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                       0x00,0xC8,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x1E,0x00,
                                       0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x40,0x08,0x00,0x00,0x00,0x84,
                                       0x00,0x00,0x00,0x40,0x08,0x00,0x00,0x00,0xFC,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x00,0x12,
                                       0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                       0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,
                                       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                       0xC8,0x42,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,
                                       0x00,0x00,0x00
                                       };
//////////

const uint8_t animation_2[] PROGMEM = {0x06,0x01,0x01,0x0B,0x00,0x00,0x00,0xC8,0x42,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
                                       0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0x42,0x80,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x80,0x00,0x00,
                                       0x00,0x00,0x08,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,0x40,0x00,0x00,0x00,0x00,0x04,
                                       0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xC8,0x42,0x00,0x00,
                                       0x20,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x02,0x00,0x00,
                                       0x00,0xC8,0x42,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,
                                       0x00,0x00,0x00,0x01,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x80,
                                       0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x80,0x00,0x00,0xC8,0x42,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,
                                       0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xC8,0x42,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x02,
                                       0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xC8,0x42,0x00,0x40,0x00,
                                       0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,
                                       0xC8,0x42,0x80,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x08,
                                       0x00,0x00,0x00,0x00,0x00,0xC8,0x42,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x01,
                                       0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00
                                       };
//////////////////////////////////////
QuadrumCode qc;
int t = 0; //счётчик кадров

void setup () {
  qc.configure(animation_1, 256, frame );
  // allow frame control//разрешить управление кадром
  qc.start();
  ////////////////////////////////////////////////
 for (i=0;i<=5;i++)
   {  
  LC.shutdown(i, false);//выключаем энергосберегающий режим
  LC.setIntensity(i,4 );// устанавливаем интенсивность в 4 единиц между 0 и 15
  LC.clearDisplay(i);//очищаем матрицу i
   } 
  /////////////////////////////////////////////////

}
void loop () {
  // tick must calls always to frame speed/change control//
  qc.tick();
  delay(100);// время между сменой кадров
  t++;
  if (t == 25) //если нам нужно поставить анимацию на паузу на 25 кадре
  {
  //  qc.stop();
  }

  if (t == 35) //если нам нужно продолжить анимацию на 35 кадре
  {
  //  qc.start();
  }

  if (t == 50) //если мы хотим изменить анимацию на 50 кадре
  {
    qc.configure(animation_2, 256, frame, DATASTORE_IS_PROGMEM); //здесь массив эффекта берём из флеш памяти
  }
  if (t == 100) //если мы хотим изменить анимацию на 100 кадре
  {
    qc.configure(animation_1, 256, frame);  // здесь массив эффекта берём из ОЗУ
    t = 0;
  }
}

/////////////////////////////////
void frame(QuadrumCode* _QuadrumCodeObject) {
  uint8_t cubeSideSize = _QuadrumCodeObject->getCubeSideSize();
  for (uint8_t z = 0; z < cubeSideSize; z ++) {
    for (uint8_t y = 0; y < cubeSideSize; y ++) {
      for (uint8_t x = 0; x < cubeSideSize; x ++) {
        uint8_t pixelNumber =  x + (cubeSideSize * y) + (cubeSideSize * cubeSideSize * z);
        if  (_QuadrumCodeObject->getVoxelState (y, x, z) == true) { // возвращает true, если воксель в x, y и z включен, иначе возвращает false
         LC.setLed(z, x, y,1);// 
        } else { LC.setLed(z, x, y,0);//
         
        }
      }
    }
  }
  
}
//////////////////////////////////

Для куба 6*6*6 на 6 мах7219 чисто из любопытства.

sadman41
Offline
Зарегистрирован: 19.10.2016

Не лень же паять было.
Без видео непонятен масштаб, к слову.

lilik
Offline
Зарегистрирован: 19.10.2017

Да я уже давно паял их. Сейчас купил бы готовый, но у китайцев только "своими ручками наборы". Видео плохо передаёт реальное восприятие эффекта, надо ловить сумерки.