Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <FastLED.h> //https://github.com/FastLED/FastLED
- #include <LEDMatrix.h> //https://github.com/Jorgen-VikingGod/LEDMatrix
- #define DATA_PIN 6
- #define COLOR_ORDER RGB
- #define CHIPSET WS2811
- #define MATRIX_WIDTH -21
- #define MATRIX_HEIGHT 11
- #define MATRIX_TYPE 3
- #define MATRIX_SIZE (MATRIX_WIDTH*MATRIX_HEIGHT)
- #define NUMPIXELS MATRIX_SIZE
- #define STROBE 4
- #define RESET 5
- cLEDMatrix<MATRIX_WIDTH, MATRIX_HEIGHT, MATRIX_TYPE> leds;
- unsigned long int myTimeOffset;
- int hpoints[21];
- int vpoints[11];
- int arrAmplitudes[10];
- int arrPeaks[10];
- byte myStep;
- byte iBand;
- bool myInit=false;
- void setup()
- {
- FastLED.addLeds<CHIPSET, DATA_PIN, COLOR_ORDER>(leds[0], leds.Size()).setCorrection(TypicalSMD5050);
- FastLED.setCorrection(TypicalLEDStrip);
- FastLED.setBrightness(255);
- Serial.begin(9600);
- pinMode(STROBE, OUTPUT);
- pinMode(RESET, OUTPUT);
- pinMode(A0, INPUT);
- pinMode(A1, INPUT);
- digitalWrite(STROBE, false);
- digitalWrite(RESET, false);
- delay(5);
- }
- void Read_Frequencies() {
- digitalWrite(RESET, true);
- delayMicroseconds(200);
- digitalWrite(RESET, false);
- delayMicroseconds(200);
- for (iBand = 0; iBand < 7; iBand++)
- {
- digitalWrite(STROBE, true);
- delayMicroseconds(50);
- digitalWrite(STROBE, false);
- delayMicroseconds(50);
- arrAmplitudes[iBand] = (int)((analogRead(A0) + analogRead(A1))/2);
- }
- arrAmplitudes[7]=(arrAmplitudes[0]+arrAmplitudes[1]+arrAmplitudes[2]+arrAmplitudes[3]+arrAmplitudes[4]+arrAmplitudes[5]+arrAmplitudes[6])/7;
- arrAmplitudes[8]=(arrAmplitudes[0]+arrAmplitudes[1]+arrAmplitudes[2]+arrAmplitudes[3])/4;
- arrAmplitudes[9]=(arrAmplitudes[4]+arrAmplitudes[5]+arrAmplitudes[6])/3;
- }
- boolean detectSilence(int myInput) {
- static unsigned long myOffset;
- unsigned long myTime;
- if (myInput>80) myOffset = millis();
- myTime=millis()-myOffset;
- return (myTime>1500);
- }
- boolean detectLoudness(int myInput) {
- static unsigned long myOffset;
- unsigned long myTime;
- if (myInput<95) myOffset = millis();
- myTime=millis()-myOffset;
- return (myTime>200);
- }
- void shiftArrayAndInsertValueH(byte count, int newValue){
- int points_mem[21];
- memcpy(points_mem, hpoints, count*sizeof(int));
- for(byte i=0; i<count-1;i++) {
- hpoints[i]=points_mem[i+1];
- }
- hpoints[count-1]=newValue;
- }
- void shiftArrayAndInsertValueV(byte count, int newValue){
- int points_mem[11];
- memcpy(points_mem, vpoints, count*sizeof(int));
- for(byte i=0; i<count-1;i++) {
- vpoints[i]=points_mem[i+1];
- }
- vpoints[count-1]=newValue;
- }
- void movingCircles(float rfactor, float tsummand) {
- static float t1=0.00000;
- static float t2=0.33333;
- static float t3=0.66666;
- static float t4=0.99999;
- static float t5=1.33332;
- static float t6=1.66665;
- float r1;
- float r2;
- float r3;
- float r4;
- float r5;
- float r6;
- float rx=9;
- float ry=4;
- byte x1;
- byte x2;
- byte x3;
- byte x4;
- byte x5;
- byte x6;
- byte y1;
- byte y2;
- byte y3;
- byte y4;
- byte y5;
- byte y6;
- r1=arrAmplitudes[0]/200;
- r2=arrAmplitudes[1]/200;
- r3=arrAmplitudes[2]/200;
- r4=arrAmplitudes[3]/200;
- r5=arrAmplitudes[4]/200;
- r6=arrAmplitudes[5]/200;
- x1=10.5+ rfactor*rx * sin(t1*PI);
- y1= 5.5+ rfactor*ry * cos(t1*PI);
- x2=10.5+ rfactor*rx * sin(t2*PI);
- y2= 5.5+ rfactor*ry * cos(t2*PI);
- x3=10.5+ rfactor*rx * sin(t3*PI);
- y3= 5.5+ rfactor*ry * cos(t3*PI);
- x4=10.5+ rfactor*rx * sin(t4*PI);
- y4= 5.5+ rfactor*ry * cos(t4*PI);
- x5=10.5+ rfactor*rx * sin(t5*PI);
- y5= 5.5+ rfactor*ry * cos(t5*PI);
- x6=10.5+ rfactor*rx * sin(t6*PI);
- y6= 5.5+ rfactor*ry * cos(t6*PI);
- t1+=tsummand;
- t2+=tsummand;
- t3+=tsummand;
- t4+=tsummand;
- t5+=tsummand;
- t6+=tsummand;
- if (t1>1.99999) t1=0.00000;
- if (t2>2.33331) t2=0.33333;
- if (t3>2.66664) t3=0.66666;
- if (t4>2.99997) t4=0.99999;
- if (t5>3.33333) t5=1.33332;
- if (t6>3.66666) t6=1.66665;
- leds.DrawCircle(x1, y1, r1, CRGB::Red);
- leds.DrawCircle(x2, y2, r2, CRGB::Blue);
- leds.DrawCircle(x3, y3, r3, CRGB::Yellow);
- leds.DrawCircle(x4, y4, r4, CRGB::Green);
- leds.DrawCircle(x5, y5, r5, CRGB::Magenta);
- leds.DrawCircle(x6, y6, r6, CRGB::Cyan);
- }
- void spectrumAnalyzerBottom(int iPeakDecay) {
- int iAmplitude1=arrAmplitudes[0]/90;
- int iAmplitude2=arrAmplitudes[1]/90;
- int iAmplitude3=arrAmplitudes[2]/90;
- int iAmplitude4=arrAmplitudes[3]/90;
- int iAmplitude5=arrAmplitudes[4]/90;
- int iAmplitude6=arrAmplitudes[5]/90;
- int iAmplitude7=arrAmplitudes[6]/90;
- int iPeak1=arrPeaks[0]/90;
- int iPeak2=arrPeaks[1]/90;
- int iPeak3=arrPeaks[2]/90;
- int iPeak4=arrPeaks[3]/90;
- int iPeak5=arrPeaks[4]/90;
- int iPeak6=arrPeaks[5]/90;
- int iPeak7=arrPeaks[6]/90;
- byte treshold=2;
- if (!myInit) memcpy(arrPeaks, arrAmplitudes, 10*sizeof(int));
- myInit=true;
- for(int i=0; i<10; i++) {
- if (arrAmplitudes[i]>=arrPeaks[i]) arrPeaks[i]=arrAmplitudes[i];
- if (arrPeaks[i]>=0) arrPeaks[i]-=iPeakDecay;
- }
- if(iAmplitude1>=treshold) for(byte i1=0; i1<=iAmplitude1; i1++) leds.DrawLine( 0,i1, 2,i1,CHSV(i1*15,255,255));
- if(iAmplitude2>=treshold) for(byte i2=0; i2<=iAmplitude2; i2++) leds.DrawLine( 3,i2, 5,i2,CHSV(150+i2*15,255,255));
- if(iAmplitude3>=treshold) for(byte i3=0; i3<=iAmplitude3; i3++) leds.DrawLine( 6,i3, 8,i3,CHSV(i3*15,255,255));
- if(iAmplitude4>=treshold) for(byte i4=0; i4<=iAmplitude4; i4++) leds.DrawLine( 9,i4,11,i4,CHSV(150+i4*15,255,255));
- if(iAmplitude5>=treshold) for(byte i5=0; i5<=iAmplitude5; i5++) leds.DrawLine(12,i5,14,i5,CHSV(i5*15,255,255));
- if(iAmplitude6>=treshold) for(byte i6=0; i6<=iAmplitude6; i6++) leds.DrawLine(15,i6,17,i6,CHSV(150+i6*15,255,255));
- if(iAmplitude7>=treshold) for(byte i7=0; i7<=iAmplitude7; i7++) leds.DrawLine(18,i7,20,i7,CHSV(i7*15,255,255));
- if (iPeakDecay>0) {
- leds.DrawLine( 0,iPeak1, 2,iPeak1,CHSV(iPeak1*15,255,255));
- leds.DrawLine( 3,iPeak2, 5,iPeak2,CHSV(150+iPeak2*15,255,255));
- leds.DrawLine( 6,iPeak3, 8,iPeak3,CHSV(iPeak3*15,255,255));
- leds.DrawLine( 9,iPeak4,11,iPeak4,CHSV(150+iPeak4*15,255,255));
- leds.DrawLine(12,iPeak5,14,iPeak5,CHSV(iPeak5*15,255,255));
- leds.DrawLine(15,iPeak6,17,iPeak6,CHSV(150+iPeak6*15,255,255));
- leds.DrawLine(18,iPeak7,20,iPeak7,CHSV(iPeak7*15,255,255));
- }
- }
- void spectrumAnalyzerCenter(int iPeakDecay) {
- int iAmplitude1=arrAmplitudes[0]/180;
- int iAmplitude2=arrAmplitudes[1]/180;
- int iAmplitude3=arrAmplitudes[2]/180;
- int iAmplitude4=arrAmplitudes[3]/180;
- int iAmplitude5=arrAmplitudes[4]/180;
- int iAmplitude6=arrAmplitudes[5]/180;
- int iAmplitude7=arrAmplitudes[6]/180;
- int iPeak1=arrPeaks[0]/180;
- int iPeak2=arrPeaks[1]/180;
- int iPeak3=arrPeaks[2]/180;
- int iPeak4=arrPeaks[3]/180;
- int iPeak5=arrPeaks[4]/180;
- int iPeak6=arrPeaks[5]/180;
- int iPeak7=arrPeaks[6]/180;
- byte treshold=1;
- if (!myInit) memcpy(arrPeaks, arrAmplitudes, 10*sizeof(int));
- myInit=true;
- for(int i=0; i<10; i++) {
- if (arrAmplitudes[i]>=arrPeaks[i]) arrPeaks[i]=arrAmplitudes[i];
- if (arrPeaks[i]>=0) arrPeaks[i]-=iPeakDecay;
- }
- if(iAmplitude1>=treshold) for(byte i1=0; i1<=iAmplitude1; i1++) leds.DrawLine( 0,i1+5, 2,i1+5,CHSV(i1*20,255,255));
- if(iAmplitude2>=treshold) for(byte i2=0; i2<=iAmplitude2; i2++) leds.DrawLine( 3,i2+5, 5,i2+5,CHSV(120+i2*20,255,255));
- if(iAmplitude3>=treshold) for(byte i3=0; i3<=iAmplitude3; i3++) leds.DrawLine( 6,i3+5, 8,i3+5,CHSV(i3*20,250,255));
- if(iAmplitude4>=treshold) for(byte i4=0; i4<=iAmplitude4; i4++) leds.DrawLine( 9,i4+5,11,i4+5,CHSV(120+i4*20,255,255));
- if(iAmplitude5>=treshold) for(byte i5=0; i5<=iAmplitude5; i5++) leds.DrawLine(12,i5+5,14,i5+5,CHSV(i5*20,255,255));
- if(iAmplitude6>=treshold) for(byte i6=0; i6<=iAmplitude6; i6++) leds.DrawLine(15,i6+5,17,i6+5,CHSV(120+i6*20,255,255));
- if(iAmplitude7>=treshold) for(byte i7=0; i7<=iAmplitude7; i7++) leds.DrawLine(18,i7+5,20,i7+5,CHSV(i7*20,255,255));
- if(iAmplitude1>=treshold) for(byte i1=0; i1<=iAmplitude1; i1++) leds.DrawLine( 0,5-i1, 2,5-i1,CHSV(i1*20,255,255));
- if(iAmplitude2>=treshold) for(byte i2=0; i2<=iAmplitude2; i2++) leds.DrawLine( 3,5-i2, 5,5-i2,CHSV(120+i2*20,255,255));
- if(iAmplitude3>=treshold) for(byte i3=0; i3<=iAmplitude3; i3++) leds.DrawLine( 6,5-i3, 8,5-i3,CHSV(i3*20,255,255));
- if(iAmplitude4>=treshold) for(byte i4=0; i4<=iAmplitude4; i4++) leds.DrawLine( 9,5-i4,11,5-i4,CHSV(120+i4*20,255,255));
- if(iAmplitude5>=treshold) for(byte i5=0; i5<=iAmplitude5; i5++) leds.DrawLine(12,5-i5,14,5-i5,CHSV(i5*20,255,255));
- if(iAmplitude6>=treshold) for(byte i6=0; i6<=iAmplitude6; i6++) leds.DrawLine(15,5-i6,17,5-i6,CHSV(120+i6*20,255,255));
- if(iAmplitude7>=treshold) for(byte i7=0; i7<=iAmplitude7; i7++) leds.DrawLine(18,5-i7,20,5-i7,CHSV(i7*20,255,255));
- if (iPeakDecay>0) {
- leds.DrawLine( 0,iPeak1+5, 2,iPeak1+5,CHSV(iPeak1*20,255,255));
- leds.DrawLine( 3,iPeak2+5, 5,iPeak2+5,CHSV(120+iPeak2*20,255,255));
- leds.DrawLine( 6,iPeak3+5, 8,iPeak3+5,CHSV(iPeak3*20,250,255));
- leds.DrawLine( 9,iPeak4+5,11,iPeak4+5,CHSV(120+iPeak4*20,255,255));
- leds.DrawLine(12,iPeak5+5,14,iPeak5+5,CHSV(iPeak5*20,255,255));
- leds.DrawLine(15,iPeak6+5,17,iPeak6+5,CHSV(120+iPeak6*20,255,255));
- leds.DrawLine(18,iPeak7+5,20,iPeak7+5,CHSV(iPeak7*20,255,255));
- leds.DrawLine( 0,5-iPeak1, 2,5-iPeak1,CHSV(iPeak1*20,255,255));
- leds.DrawLine( 3,5-iPeak2, 5,5-iPeak2,CHSV(120+iPeak2*20,255,255));
- leds.DrawLine( 6,5-iPeak3, 8,5-iPeak3,CHSV(iPeak3*20,255,255));
- leds.DrawLine( 9,5-iPeak4,11,5-iPeak4,CHSV(120+iPeak4*20,255,255));
- leds.DrawLine(12,5-iPeak5,14,5-iPeak5,CHSV(iPeak5*20,255,255));
- leds.DrawLine(15,5-iPeak6,17,5-iPeak6,CHSV(120+iPeak6*20,255,255));
- leds.DrawLine(18,5-iPeak7,20,5-iPeak7,CHSV(iPeak7*20,255,255));
- }
- }
- void lissajousFigure(float f1_1, float f2_1, float f1_2, float f2_2) {
- static float p1;
- static float p2;
- float t1;
- float t2;
- float r1;
- float r2;
- int x1;
- int x2;
- int y1;
- int y2;
- static int xOld1;
- static int xOld2;
- static int yOld1;
- static int yOld2;
- int iHue1;
- int iHue2;
- r1=(float)arrAmplitudes[8]/150;
- t1=0;
- iHue1=0;
- do {
- x1 = 10.5 + 2*r1 * sin(f1_1*t1*PI + p1);
- y1 = 05.5 + 1*r1 * sin(f2_1*t1*PI);
- if ((t1>0) & (r1<=4) & (r1>=1)) leds.DrawLine(xOld1, yOld1, x1, y1, CRGB::Red );
- if ((t1>0) & (r1> 4)) leds.DrawLine(xOld1, yOld1, x1, y1, CHSV(iHue1,255,255));
- t1+=0.05;
- iHue1+=6;
- xOld1=x1;
- yOld1=y1;
- } while (t1<2.1);
- r2=(float)(arrAmplitudes[9])/130;
- t2=0;
- p2=PI/2;
- iHue2=0;
- do {
- x2 = 10.5 + 2*r2 * sin(f1_2*t2*PI + p2);
- y2 = 05.5 + 1*r2 * sin(f2_2*t2*PI);
- if ((t2>0) & (r2<=4) & (r2>=1)) leds.DrawLine(xOld2, yOld2, x2, y2,CRGB::Blue);
- if ((t2>0) & (r2> 4)) leds.DrawLine(xOld2, yOld2, x2, y2,CHSV(iHue2,255,255));
- t2 += 0.05;
- iHue2+=6;
- xOld2=x2;
- yOld2=y2;
- } while (t2<2.1);
- p1 +=0.05;
- if (p1==PI) p1=0;
- }
- void waveFormVisualizerHorizontal() {
- shiftArrayAndInsertValueH(21, arrAmplitudes[7]);
- for(int i=0; i<21; i++) {
- leds.DrawPixel(i,4+hpoints[i]/85,CHSV(hpoints[i]/3,255,255));
- leds.DrawPixel(i,6-hpoints[i]/85,CHSV(hpoints[i]/3,255,255));
- leds.DrawLine(i,4+hpoints[i]/85,i,6-hpoints[i]/85,CHSV(hpoints[i]/3,255,255));
- }
- delay(10);
- }
- void waveFormVisualizerVertical() {
- shiftArrayAndInsertValueV(11, arrAmplitudes[7]);
- for(int i=0; i<11; i++) {
- //leds.DrawPixel( 9+vpoints[i]/67,i,CHSV(vpoints[i]/3,255,255));
- //leds.DrawPixel(11-vpoints[i]/67,i,CHSV(vpoints[i]/3,255,255));
- leds.DrawLine(9+vpoints[i]/67,i,11-vpoints[i]/67,i,CHSV(vpoints[i]/3,255,255));
- }
- delay(10);
- }
- void loop()
- {
- FastLED.clear();
- unsigned long int myTime=millis()-myTimeOffset;
- unsigned long int animationTime=180000;
- Read_Frequencies();
- switch (myStep) {
- case 0:
- if (detectLoudness(arrAmplitudes[7])) myStep=10;
- myTimeOffset=millis();
- break;
- case 10:
- movingCircles((float)(arrAmplitudes[7])/500, 0.005);
- if (detectSilence(arrAmplitudes[7]) || myTime>animationTime) myStep=20;
- break;
- case 20:
- if (detectLoudness(arrAmplitudes[7])) myStep=30;
- myTimeOffset=millis();
- break;
- case 30:
- spectrumAnalyzerCenter(0);
- if (detectSilence(arrAmplitudes[7]) || myTime>animationTime) myStep=40;
- break;
- case 40:
- if (detectLoudness(arrAmplitudes[7])) myStep=50;
- myTimeOffset=millis();
- break;
- case 50:
- movingCircles(1, (float)arrAmplitudes[0]/50000);
- if (detectSilence(arrAmplitudes[7]) || myTime>animationTime) myStep=60;
- break;
- case 60:
- if (detectLoudness(arrAmplitudes[7])) myStep=70;
- myTimeOffset=millis();
- break;
- case 70:
- waveFormVisualizerHorizontal();
- if (detectSilence(arrAmplitudes[7]) || myTime>animationTime) myStep=80;
- break;
- case 80:
- if (detectLoudness(arrAmplitudes[7])) myStep=90;
- myTimeOffset=millis();
- break;
- case 90:
- lissajousFigure(1,2,1,1);
- if (detectSilence(arrAmplitudes[7]) || myTime>animationTime) myStep=100;
- break;
- case 100:
- if (detectLoudness(arrAmplitudes[7])) myStep=110;
- myTimeOffset=millis();
- break;
- case 110:
- waveFormVisualizerVertical();
- if (detectSilence(arrAmplitudes[7]) || myTime>animationTime) myStep=120;
- break;
- case 120:
- if (detectLoudness(arrAmplitudes[7])) myStep=130;
- myTimeOffset=millis();
- break;
- case 130:
- spectrumAnalyzerBottom(10);
- if (detectSilence(arrAmplitudes[7]) || myTime>animationTime) myStep=0;
- break;
- }
- FastLED.show();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement