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

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

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

/////////////////////////// КУБ 4*4*4 НА 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


//////////////////////////////////////
QuadrumCode qc;
int t = 0; //счётчик кадров

extern const uint8_t animation_1[];
extern const uint8_t animation_2[];
extern const uint8_t animation_3[];
extern const uint8_t animation_4[];

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

}
void loop () {
  qc.tick();
  delay(150);// время между сменой кадров
  t++;
  

  if (t == 50) //если мы хотим изменить анимацию на 50 кадре
  {
    qc.configure(animation_1, 256, frame, DATASTORE_IS_PROGMEM); //
  }
  if (t == 100) //если мы хотим изменить анимацию на 100 кадре
  {
    qc.configure(animation_3, 256, frame,DATASTORE_IS_PROGMEM);  // 
   }
  if (t == 150) //если мы хотим изменить анимацию на 150 кадре
  {
    qc.configure(animation_2, 256, frame,DATASTORE_IS_PROGMEM);
   
   } 
    if (t == 200) //если мы хотим изменить анимацию на 200 кадре
  {
    qc.configure(animation_4, 256, frame,DATASTORE_IS_PROGMEM);
    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*2+(y%2))+ (2*cubeSideSize * (y/2)) + (cubeSideSize * cubeSideSize * z);
        if  (_QuadrumCodeObject->getVoxelState (z, y, x) == true) { // возвращает true, если воксель в x, y и z включен, иначе возвращает false
         LC.setLed(0,pixelNumber/8 ,pixelNumber%8 ,1);// 
        } else { LC.setLed(0,pixelNumber/8 ,pixelNumber%8 ,0);//
         
        }
      }
    }
  }
  
}


#include <avr/pgmspace.h>

//// волна-гора
const uint8_t animation_1[]PROGMEM  = {0x04,0x01,0x01,0x06,0x00,0x00,0x00,0xC8,0x42,0x21,0x84,0x10,0x4A,0x80,0x25,0x48,0x12,0x00,0x00,0xC8,0x42,0x52,0x08,
                                       0x21,0x84,0x10,0x4A,0x80,0x25,0x00,0x00,0xC8,0x42,0xA4,0x01,0x52,0x08,0x21,0x84,0x10,0x4A,0x00,0x00,0x48,0x43,0x48,
                                       0x12,0xA4,0x01,0x52,0x08,0x21,0x84,0x00,0x00,0xC8,0x42,0x80,0x25,0x48,0x12,0xA4,0x01,0x52,0x08,0x00,0x00,0xC8,0x42,
                                       0x10,0x4A,0x80,0x25,0x48,0x12,0xA4,0x01
                                       }; 
////  волна                                       
const uint8_t animation_2[] PROGMEM = {0x04,0x01,0x01,0x06,0x00,0x00,0x00,0xC8,0x42,0x21,0x84,0x21,0x84,0x21,0x84,0x21,0x84,0x00,0x00,0xC8,0x42,0x52,0x08,
                                       0x52,0x08,0x52,0x08,0x52,0x08,0x00,0x00,0xC8,0x42,0xA4,0x01,0xA4,0x01,0xA4,0x01,0xA4,0x01,0x00,0x00,0xC8,0x42,0x48,
                                       0x12,0x48,0x12,0x48,0x12,0x48,0x12,0x00,0x00,0xC8,0x42,0x80,0x25,0x80,0x25,0x80,0x25,0x80,0x25,0x00,0x00,0xC8,0x42,
                                       0x10,0x4A,0x10,0x4A,0x10,0x4A,0x10,0x4A
                                       };
////  рамка вниз-вверх                                       
const uint8_t animation_3[] PROGMEM ={0x04,0x01,0x01,0x06,0x00,0x00,0x00,0xC8,0x42,0x0F,0x00,0x09,0x00,0x09,0x00,0x0F,0x00,0x00,0x00,0xC8,0x42,0xF0,0x00,0x90,
                                      0x00,0x90,0x00,0xF0,0x00,0x00,0x00,0xC8,0x42,0x00,0x0F,0x00,0x09,0x00,0x09,0x00,0x0F,0x00,0x00,0xC8,0x42,0x00,0xF0,0x00,
                                      0x90,0x00,0x90,0x00,0xF0,0x00,0x00,0xC8,0x42,0x00,0x0F,0x00,0x09,0x00,0x09,0x00,0x0F,0x00,0x00,0xC8,0x42,0xF0,0x00,0x90,
                                      0x00,0x90,0x00,0xF0,0x00
                                      };
////  рамка вперёд-назад                                      
const uint8_t animation_4[] PROGMEM ={0x04,0x01,0x01,0x06,0x00,0x00,0x00,0xC8,0x42,0x11,0x11,0x01,0x10,0x01,0x10,0x11,0x11,0x00,0x00,0xC8,0x42,0x22,0x22,0x02,
                                      0x20,0x02,0x20,0x22,0x22,0x00,0x00,0xC8,0x42,0x44,0x44,0x04,0x40,0x04,0x40,0x44,0x44,0x00,0x00,0xC8,0x42,0x88,0x88,0x08,
                                      0x80,0x08,0x80,0x88,0x88,0x00,0x00,0xC8,0x42,0x44,0x44,0x04,0x40,0x04,0x40,0x44,0x44,0x00,0x00,0xC8,0x42,0x22,0x22,0x02,
                                      0x20,0x02,0x20,0x22,0x22
                                      };

Адаптировал 4*4*4 куб под работу с симулятором.