Files
2019-07-11 19:28:21 +03:00

394 lines
8.5 KiB
Arduino

#include <FastLED.h>
// Parametri LED matricai
#define LED_PIN 5
#define COLOR_ORDER GRB
#define CHIPSET WS2812B
#define BRIGHTNESS 20
// Params for width and height
const uint8_t kMatrixWidth = 10;
const uint8_t kMatrixHeight = 14;
// Param for different pixel layouts
const bool kMatrixSerpentineLayout = true;
uint16_t XY( uint8_t x, uint8_t y)
{
uint16_t i;
if( kMatrixSerpentineLayout == false) {
i = (y * kMatrixWidth) + x;
}
if( kMatrixSerpentineLayout == true) {
if( y & 0x01) {
// Odd rows run backwards
uint8_t reverseX = (kMatrixWidth - 1) - x;
i = (y * kMatrixWidth) + reverseX;
} else {
// Even rows run forwards
i = (y * kMatrixWidth) + x;
}
}
return i;
}
#define NUM_LEDS (kMatrixWidth * kMatrixHeight)
CRGB leds_plus_safety_pixel[ NUM_LEDS + 1];
CRGB* const leds( leds_plus_safety_pixel + 1);
uint16_t XYsafe( uint8_t x, uint8_t y)
{
if( x >= kMatrixWidth) return -1;
if( y >= kMatrixHeight) return -1;
return XY(x,y);
}
//----------------------------------
//Parametri MSGEQ7
int Reset=10;
int Strobe=9;
int InputL=0;
int InputR=1;
//---------------------------------
//parametri RoteryEncoder
const int encoderPinA = 2;
const int encoderPinB = 4;
const int switchPin = 3;
//--------------------------------
int animation; // animacijas rezims
int color; // krasas rezims
bool mode; // mode=0 - rezimu maina; mode=1 - krasas maina
void setup() {
Serial.begin(9600);
//---------
FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalSMD5050);
FastLED.setBrightness( BRIGHTNESS );
//---------
pinMode(Reset, OUTPUT);
pinMode(Strobe, OUTPUT);
pinMode(InputL, INPUT);
pinMode(InputR, INPUT);
attachInterrupt(digitalPinToInterrupt(encoderPinA), doEncoder, CHANGE); // interupt 0(pin2)
pinMode(switchPin, INPUT);
attachInterrupt(digitalPinToInterrupt(switchPin), doSwitch, RISING); // interupt 1(pin3)
//-------------
pinMode(encoderPinA,INPUT);
pinMode(encoderPinB,INPUT);
digitalWrite(encoderPinA, HIGH);
digitalWrite(encoderPinB, HIGH);
// reset equalizer
digitalWrite(Reset, HIGH);
delayMicroseconds(100);
digitalWrite(Reset, LOW);
digitalWrite(Strobe, HIGH);
delayMicroseconds(40);
}
void doEncoder()
{
if(mode==0){
if(digitalRead(encoderPinA) == digitalRead(encoderPinB)){
animation++;
if(animation>3){
animation=3;
}
Serial.println(animation);
}
else{
animation--;
if(animation<0){
animation=0;
}
Serial.println(animation);
}
} else {
if(digitalRead(encoderPinA) == digitalRead(encoderPinB)){
color++;
if(color>7){
color=7;
}
Serial.println(color);
}
else{
color--;
if(color<0){
color=0;
}
Serial.println(color);
}
}
}
void doSwitch(){
mode= !mode;
}
void getcolor(int Cred[], int Cgreen[], int Cblue[]){
if (color==0){
if(animation==0 || animation==1 ){
for(int a=0;a<4;a++){
Cred[a]=0;
Cgreen[a]=255;
Cblue[a]=0;
}
for(int a=3;a<8;a++){
Cred[a]=255;
Cgreen[a]=255;
Cblue[a]=0;
}
for(int a=8;a<10;a++){
Cred[a]=255;
Cgreen[a]=0;
Cblue[a]=0;
}
} else {//if(animation==2 || animation==3){
Cred[9]=255;
Cgreen[9]=0;
Cblue[9]=0;
Cred[4]=255;
Cgreen[4]=0;
Cblue[4]=0;
for(int a=2;a<4;a++){
Cred[a]=255;
Cgreen[a]=255;
Cblue[a]=0;
}
for(int a=7;a<9;a++){
Cred[a]=255;
Cgreen[a]=255;
Cblue[a]=0;
}
for(int a=0;a<2;a++){
Cred[a]=0;
Cgreen[a]=255;
Cblue[a]=0;
}
for(int a=5;a<7;a++){
Cred[a]=0;
Cgreen[a]=255;
Cblue[a]=0;
}
}
} else if(color==1) {
for(int a=0;a<10;a++){
Cred[a]=0;
Cgreen[a]=255;
Cblue[a]=0;
}
} else if(color==2) {
for(int a=0;a<10;a++){
Cred[a]=0;
Cgreen[a]=0;
Cblue[a]=255;
}
} else if(color==3) {
for(int a=0;a<10;a++){
Cred[a]=255;
Cgreen[a]=0;
Cblue[a]=0;
}
} else if(color==4) {
for(int a=0;a<10;a++){
Cred[a]=255;
Cgreen[a]=255;
Cblue[a]=0;
}
} else if(color==5) {
for(int a=0;a<10;a++){
Cred[a]=0;
Cgreen[a]=255;
Cblue[a]=255;
}
} else if(color==6) {
for(int a=0;a<10;a++){
Cred[a]=255;
Cgreen[a]=0;
Cblue[a]=255;
}
} else if(color==7) {
for(int a=0;a<10;a++){
Cred[a]=255;
Cgreen[a]=255;
Cblue[a]=255;
}
}
}
void getdata(int ValueL[], int ValueR[]) {
for (int i=0;i<7;i++){
digitalWrite(Strobe, LOW);
delayMicroseconds(20);
ValueL[i]=analogRead(InputL);
ValueL[i]=map(ValueL[i], 0, 1023, 0, 11);
ValueR[i]=analogRead(InputR);
ValueR[i]=map(ValueR[i], 0, 1023, 0, 11);
delayMicroseconds(20);
digitalWrite(Strobe, HIGH);
delayMicroseconds(40);
}
}
void steriomode(){
int dataL[7];
int dataR[7];
getdata(dataL, dataR);
int red[10];
int green[10];
int blue[10];
getcolor(red, green, blue) ;
for (int y=0;y<7;y++){
for (int x=0;x<10;x++){
if (dataL[y]-1>=x){
leds[ XYsafe( x, y ) ] = CRGB(red[x],green[x],blue[x]);
}else{
leds[ XYsafe( x, y ) ] = CRGB(0,0,0);
}
}
}
for (int y=7;y<14;y++){
for (int x=0;x<10;x++){
if (dataR[y-7]-1>=x){
leds[ XYsafe( x, y ) ] = CRGB(red[x],green[x],blue[x]);
}else{
leds[ XYsafe( x, y ) ] = CRGB(0,0,0);
}
}
}
FastLED.show();
}
void monomode(){
int dataL[7];
int dataR[7];
getdata(dataL, dataR);
int data[7];
for (int a=0;a<7;a++){
data[a]=(dataL[a]+dataR[a])/2;
}
int red[10];
int green[10];
int blue[10];
getcolor(red, green, blue);
for (int y=0;y<14;y=y+2){
for (int x=0;x<10;x++){
if (data[y/2]-1>=x){
leds[ XYsafe( x, y ) ] = CRGB(red[x],green[x],blue[x]);
leds[ XYsafe( x, y+1 ) ] = CRGB(red[x],green[x],blue[x]);
}else{
leds[ XYsafe( x, y ) ] = CRGB(0,0,0);
leds[ XYsafe( x, y+1 ) ] = CRGB(0,0,0);
}
}
}
FastLED.show();
}
void steriomode2(){
int red[10];
int green[10];
int blue[10];
getcolor(red, green, blue) ;
int dataL[7];
int dataR[7];
getdata(dataL, dataR);
for (int a=0;a<7;a++){
dataL[a]=dataL[a]/2;
dataR[a]=dataR[a]/2;
}
for (int y=0;y<7;y++){
for (int x=4;x<10;x++){
if (dataL[y]-1>=x-5){
leds[ XYsafe( x, y ) ] = CRGB(red[x],green[x],blue[x]);
}else{
leds[ XYsafe( x, y ) ] = CRGB(0,0,0);
}
}
for (int x=4;x>-1;x--){
if (dataL[y]-1>=x){
leds[ XYsafe( 4-x, y ) ] = CRGB(red[x],green[x],blue[x]);
}else{
leds[ XYsafe( 4-x, y ) ] = CRGB(0,0,0);
}
}
}
for (int y=7;y<14;y++){
for (int x=4;x<10;x++){
if (dataR[y-7]-1>=x-5){
leds[ XYsafe( x, y ) ] = CRGB(red[x],green[x],blue[x]);
}else{
leds[ XYsafe( x, y ) ] = CRGB(0,0,0);
}
}
for (int x=4;x>-1;x--){
if (dataR[y]-1>=x){
leds[ XYsafe( 4-x, y ) ] = CRGB(red[x],green[x],blue[x]);
}else{
leds[ XYsafe( 4-x, y ) ] = CRGB(0,0,0);
}
}
}
FastLED.show();
}
void monomode2(){
int red[10];
int green[10];
int blue[10];
getcolor(red, green, blue);
int dataL[7];
int dataR[7];
getdata(dataL, dataR);
for (int a=0;a<7;a++){
dataL[a]=dataL[a]/2;
dataR[a]=dataR[a]/2;
}
int data[7];
for (int a=0;a<7;a++){
data[a]=(dataL[a]+dataR[a])/2;
}
for (int y=0;y<14;y=y+2){
for (int x=4;x<10;x++){
if (data[y/2]-1>=x-5){
leds[ XYsafe( x, y ) ] = CRGB(red[x],green[x],blue[x]);
leds[ XYsafe( x, y+1 ) ] = CRGB(red[x],green[x],blue[x]);
}else{
leds[ XYsafe( x, y ) ] = CRGB(0,0,0);
leds[ XYsafe( x, y+1 ) ] = CRGB(0,0,0);
}
}
for (int x=4;x>-1;x--){
if (data[y/2]-1>=x){
leds[ XYsafe( 4-x, y ) ] = CRGB(red[x],green[x],blue[x]);
leds[ XYsafe( 4-x, y+1 ) ] = CRGB(red[x],green[x],blue[x]);
}else{
leds[ XYsafe( 4-x, y ) ] = CRGB(0,0,0);
leds[ XYsafe( 4-x, y+1 ) ] = CRGB(0,0,0);
}
}
}
FastLED.show();
}
void loop() {
if(animation==0){
monomode();
} else if(animation==1) {
steriomode();
}else if(animation==2){
steriomode2();
}else {
monomode2();
}
}