Despite the many options and customization possibilities, this device is extremely simple to build and contains a minimal number of components.
December 19, 2024
12728 views
3 respects
Devices and components
Arduino-Nano
WS2812B Addressable RGB LED Light Strip
micro switch
10kOhm potentiometer
Push button
10k resistance
Materials and tools
Soldering kit
Software and tools
Arduino IDE
Project description
Code vu
1/*
2**********************************************************************
3* Stereo VU Meter for 1 or 2 LED rings or strips build by ericBcreator
4* Designed to be used with an Arduino UNO, Nano or compatible device.
5**********************************************************************
6* Notice: search for @EB in the Sketch for important variables to set
7* for the Sketch to work with your setup.
8**********************************************************************
9* Last updated 20180202 by ericBcreator
10*
11* This code is free for personal use, not for commercial purposes.
12* Please leave this header intact.
13*
14* contact: ericBcreator@gmail.com
15**********************************************************************
16*/
17#include <Adafruit_NeoPixel.h>
18#define nonLinearLogAudio
19
20//#define led_strip_60 //uncomment this if you are using a single 60 LED strip (Center to sides mode)
21#define led_2_strip_60 //uncomment this if you are using two 60 LED strips (Left-Right bottom to top mode)
22
23//#define led_strip_30 //uncomment this if you are using a single 30 LED strip
24//#define led_2_strip_30 //uncomment this if you are using two 30 LED strips
25
26//#define led_strip_144 //uncomment this if you are using a single 144 LED strip
27//#define led_2_strip_144 //uncomment this if you are using two 144 LED strips
28
29const int useSensorValues = true; // @EB
30
31
32//
33// setup pins
34//
35
36int leftPin = A0, rightPin = A1; // left audio in on analog 0, right on analog 1
37int brightnessPin = A4, sensitivityPin = A5; // potentiometers for brightness and sensitivity on analog 4 and 5
38int leftStripPin = 5; // DIN of left led strip on digital pin 5
39int rightStripPin = 6; // DIN of right led strip on digital pin 6
40int showPeaksPin = 7; // switch to toggle peaks on or off on digital pin 7 (7, 9 for box version)
41int showPeaksMomentarySwitch = false; // set false for an on/off toggle switch
42int reverseShowPeaks = true; // reverses the on/off setting in case you made a wiring mistake ;-) @EB
43int selectButton1Pin = 8; // push button for changing settings on digital pin 8
44int useSelectButton1 = true; // set to false if no push button1 for selecting the color scheme is connected @EB
45int selectButton2Pin = 9; // push button for changing settings on digital pin 9
46int useSelectButton2 = true; // set to false if no push button2 is connected @EB
47
48
49#if defined (led_strip_60)
50 //settings for a 60 led strip
51
52 int stripNumOfLeds = 60; // the total number of leds
53 int stripsOn2Pins = false; // set to true if the LED strips or rings are connected to 2 input pins
54 uint32_t stripColor[31]; // half of the number of leds + 1
55 int displayMiddleLed = true; // display the middle led (blue). set to true for one strip, false for two strips or rings
56 int splitStrip = false; // set to true when using 2 strips or rings, false for one strip
57 int middleOffset = 1; // offset for the middle led when using one strip
58 int startupAnimationDelay = 6; // delay for the startup animation
59 int orangeLimitAmount = 0; // limit the amount of green of the middle LEDs to make them more orange
60 int swapLeftRight = false; // swap the left and right input values or not
61
62 int dropDelay = 5; // hold time before dropping the leds
63 float dropFactor = .94; // value for dropping the leds
64
65 int peakTimeNoDropDelay = 250; // peak hold time when not dropping the peaks (when droppingPeak is false)
66 int peakTimeFirstDropDelay = 70; // peak hold time when dropping the first peak
67 int peakTimeDropDelay = 7; // peak hold time when dropping the rest of the peaks
68 float peakDropFactor = .94; // value for dropping the peaks
69 int droppingPeakFade = false; // display the dropping peak fading to black or not
70
71 int bouncingPeaksNumOfLeds = 6; // how many leds to bounce up (max)
72 int bouncingPeaksNumOfLedsMin = 3; // how many leds to bounce up (min) when using dynamicBouncingPeaks
73 int bouncingPeakDelay = 4; // delay between peak bounce updates
74 int bouncingPeakCounterInc = 10; // increase counter for each bounce update. note: it uses a 0-180 sin function for the bouncing
75
76#elif defined (led_2_strip_60)
77 //settings for 2 60 led strips
78
79 int stripNumOfLeds = 60;
80 int stripsOn2Pins = true;
81 uint32_t stripColor[61];
82 int displayMiddleLed = false;
83 int splitStrip = true;
84 int middleOffset = 0;
85 int startupAnimationDelay = 1;
86 int orangeLimitAmount = 0;
87 int swapLeftRight = false;
88
89 int dropDelay = 5;
90 float dropFactor = .94;
91
92 int peakTimeNoDropDelay = 250;
93 int peakTimeFirstDropDelay = 70;
94 int peakTimeDropDelay = 7;
95 float peakDropFactor = .94;
96 int droppingPeakFade = false;
97
98 int bouncingPeaksNumOfLeds = 12;
99 int bouncingPeaksNumOfLedsMin = 4;
100 int bouncingPeakDelay = 4;
101 int bouncingPeakCounterInc = 10;
102
103#elif defined (led_strip_30)
104 //settings for a 30 led strip
105
106 int stripNumOfLeds = 30; // the total number of leds
107 int stripsOn2Pins = false; // set to true if the LED strips or rings are connected to 2 input pins
108 uint32_t stripColor[16]; // half of the number of leds + 1
109 int displayMiddleLed = true; // display the middle led (blue). set to true for one strip, false for two strips or rings
110 int splitStrip = false; // set to true when using 2 strips or rings, false for one strip
111 int middleOffset = 1; // offset for the middle led when using one strip
112 int startupAnimationDelay = 10; // delay for the startup animation
113 int orangeLimitAmount = 0; // limit the amount of green of the middle LEDs to make them more orange
114 int swapLeftRight = false; // swap the left and right input values or not
115
116 int dropDelay = 10; // hold time before dropping the leds
117 float dropFactor = .9; // value for dropping the leds
118
119 int peakTimeNoDropDelay = 250; // peak hold time when not dropping the peaks (set droppingPeak true or false)
120 int peakTimeFirstDropDelay = 150; // peak hold time when dropping the first peak
121 int peakTimeDropDelay = 15; // peak hold time when dropping the rest of the peaks
122 float peakDropFactor = .94; // value for dropping the peaks
123 int droppingPeakFade = false; // display the dropping peak fading to black or not
124
125 int bouncingPeaksNumOfLeds = 4; // how many leds to bounce up (max)
126 int bouncingPeaksNumOfLedsMin = 2; // how many leds to bounce up (min) when using dynamicBouncingPeaks
127 int bouncingPeakDelay = 4; // delay between peak bounce updates
128 int bouncingPeakCounterInc = 9; // increase counter for each bounce update. note: it uses a 0-180 sin function for the bouncing
129
130#elif defined (led_2_strip_30)
131 //settings for 2 30 led strips
132
133 int stripNumOfLeds = 30;
134 int stripsOn2Pins = true;
135 uint32_t stripColor[31];
136 int displayMiddleLed = false;
137 int splitStrip = true;
138 int middleOffset = 0;
139 int startupAnimationDelay = 1;
140 int orangeLimitAmount = 0;
141 int swapLeftRight = false;
142
143 int dropDelay = 5;
144 float dropFactor = .94;
145
146 int peakTimeNoDropDelay = 250;
147 int peakTimeFirstDropDelay = 70;
148 int peakTimeDropDelay = 7;
149 float peakDropFactor = .94;
150 int droppingPeakFade = false;
151
152 int bouncingPeaksNumOfLeds = 12;
153 int bouncingPeaksNumOfLedsMin = 4;
154 int bouncingPeakDelay = 4;
155 int bouncingPeakCounterInc = 10;
156
157#elif defined (led_strip_144)
158 //settings for a 144 led strip
159
160 int stripNumOfLeds = 145;
161 int stripsOn2Pins = false;
162 uint32_t stripColor[73];
163 int displayMiddleLed = true;
164 int splitStrip = false;
165 int middleOffset = 1;
166 int startupAnimationDelay = 1;
167 int orangeLimitAmount = 0;
168 int swapLeftRight = false;
169
170 int dropDelay = 4;
171 float dropFactor = .92;
172
173 int peakTimeNoDropDelay = 250;
174 int peakTimeFirstDropDelay = 100;
175 int peakTimeDropDelay = 5;
176 float peakDropFactor = .94;
177 int droppingPeakFade = false;
178
179 int bouncingPeaksNumOfLeds = 10;
180 int bouncingPeaksNumOfLedsMin = 4;
181 int bouncingPeakDelay = 2;
182 int bouncingPeakCounterInc = 10;
183
184#elif defined (led_2_strip_144)
185 //settings for 2 144 led strips
186
187 int stripNumOfLeds = 144;
188 int stripsOn2Pins = true;
189 uint32_t stripColor[145];
190 int displayMiddleLed = false;
191 int splitStrip = true;
192 int middleOffset = 0;
193 int startupAnimationDelay = 1;
194 int orangeLimitAmount = 0;
195 int swapLeftRight = false;
196
197 int dropDelay = 5;
198 float dropFactor = .94;
199
200 int peakTimeNoDropDelay = 250;
201 int peakTimeFirstDropDelay = 70;
202 int peakTimeDropDelay = 7;
203 float peakDropFactor = .94;
204 int droppingPeakFade = false;
205
206 int bouncingPeaksNumOfLeds = 12;
207 int bouncingPeaksNumOfLedsMin = 4;
208 int bouncingPeakDelay = 4;
209 int bouncingPeakCounterInc = 10;
210
211#endif
212//
213// setup other user variables
214//
215
216// basic settings
217int pulsing = false; // pulsing will display from the middle of each strip or ring @EB
218
219int spinCircle = false; // spin the animation. will not work with stripsOn2Pins @EB
220
221int animType = 0; // startup animation selection (1 looks nice for 1 ring) @EB
222int colorScheme = 10; // 0: green-red, 1: blue-green, 2: blue-red, 3: red-blue, 4: green-blue, 5: red-green, 6: blue-white-red
223 // 7: red-white-blue, 8: green-white-red, 9: green-white-blue, 10: color wheel, 11: spinning color wheel,
224 // 12: as 11 but spread with factor colorScheme12Factor @EB
225int maxColorScheme = 12; // used for looping through the color schemes with the switch button
226int colorScheme11SpinDelay = stripNumOfLeds / 4 ; // delay for spinning scheme 11
227int colorScheme12Factor = 3; // wheel spread factor for scheme 12 @EB
228
229int minValue = 10; // min analog input value
230int sensitivityValue = 110; // 0 - 255, initial value (value read from the potentiometer if useSensorValues = true)
231
232#ifdef highLevelInput
233 int maxValue = 700; // max analog input value (0-1023 equals 0-5V). try 300 for low level input, 700 for high
234 int maxSensitivity = 2 * 255; // set to a higher setting to amplify low input levels. try 4 * 255 for low level input, 2 * 255 for high
235#else
236 int maxValue = 300; // max analog input value (0-1023 equals 0-5V). try 300 for low level input, 700 for high
237 int maxSensitivity = 4 * 255; // set to a higher setting to amplify low input levels. try 4 * 255 for low level input, 2 * 255 for high
238#endif
239
240int ledBrightness = 30; // 0 - 255, initial value (value read from the potentiometer if useSensorValues = true)
241int sensorDeviationBrightness = 3; // eliminate fluctuating values
242int overflowDelay = 10; // overflow hold time
243
244// peak settings @EB
245int displayPeaks = false; // value will be set by the switch if useSensorValues = true
246int displayTopAsPeak = true; // always display the top LED in peak color
247int droppingPeak = true; // display dropping peaks or not. note: displayPeaks has to be true
248int bouncingPeaks = false; // display bouncing peaks or not. note: displayPeaks has to be true
249int dynamicBouncingPeaks = false; // bounce less with lower peaks. note: bouncingPeaks has to be true
250
251//
252// initialize other variables
253//
254
255int numOfSegments, halfNumOfSegments, stripMiddle, maxDisplaySegments;
256float sensitivityFactor;
257float nonLinearResponseFactor;
258
259int brightnessValue, prevBrightnessValue;
260float ledFactor, ledFactor_div_numOfSegments;
261
262uint32_t stripMiddleColor, stripOverflowColor, stripHoldColor;
263uint32_t colorValue;
264
265int leftValue = 0, rightValue = 0, maxReadValue = 0;
266int leftValueN = 0, rightValueN = 0;
267int leftAnalogValue = 0, rightAnalogValue = 0;
268float log10MaxDisplaySegments;
269
270int prevLeftValue = 0, prevRightValue = 0;
271int prevLeftAnalogValue = 0, prevRightAnalogValue = 0;
272
273int selectButton1PinState = 0, prevSelectButton1PinState = 0;
274int selectButton2PinState = 0, prevSelectButton2PinState = 0;
275
276int selectButton1PinSetting = colorScheme;
277int selectButton2PinSetting = 0;
278
279int i, j;
280int dropLeft, dropRight;
281int leftDropTime, rightDropTime;
282
283int leftPeak = 0, rightPeak = 0;
284int leftPeakTime = 0, rightPeakTime = 0;
285int leftFirstPeak = true, rightFirstPeak = true;
286int showPeaksPinSetting, prevShowPeaksPinSetting;
287
288int stripPulseMiddle = 0;
289int halfLeftValue, halfRightValue, halfPrevLeftValue, halfPrevRightValue;
290
291int leftPeakBouncing = false, rightPeakBouncing = false;
292int leftPeakBounce = 0, rightPeakBounce = 0;
293int prevLeftPeakBounce = 0, prevRightPeakBounce = 0;
294int leftPeakBounceCounter = 0, rightPeakBounceCounter = 0;
295int leftPeakBounceDelayCounter = 0, rightPeakBounceDelayCounter = 0;
296int leftBouncingPeaksNumOfLeds = 0, rightBouncingPeaksNumOfLeds = 0;
297float bounceFactor;
298
299int colorScheme11SpinValue = 0, colorScheme11SpinDelayValue = 0;
300int colorSchemeFactor = 1;
301long selectButton1Timer;
302
303int spinDelayCounter = 0, spinCounter = 0, spinTurnsCounter = 0, spinTurnsMax = 0, spinTurnsDelay = 0, spinTurnsDelayMax = 0;
304int spinCounterInc = 1;
305int spinDelay = 0;
306//
307// initialize the strip or rings
308//
309
310Adafruit_NeoPixel left_strip = Adafruit_NeoPixel(stripNumOfLeds, leftStripPin, NEO_GRB + NEO_KHZ800);
311Adafruit_NeoPixel right_strip = Adafruit_NeoPixel(stripNumOfLeds, rightStripPin, NEO_GRB + NEO_KHZ800);
312
313//
314// setup
315//
316
317void setup() {
318 #ifdef DEBUG
319 Serial.begin(9600);
320 #endif
321
322 randomSeed(analogRead(2));
323
324 if (stripsOn2Pins) {
325 numOfSegments = stripNumOfLeds;
326 maxDisplaySegments = numOfSegments - 1;
327
328 stripMiddle = stripNumOfLeds;
329 stripPulseMiddle = stripMiddle / 2;
330 spinCircle = false;
331 }
332 else {
333 numOfSegments = stripNumOfLeds / 2;
334 stripMiddle = stripNumOfLeds / 2;
335 maxDisplaySegments = stripMiddle - 1;
336
337 stripPulseMiddle = stripMiddle / 2;
338 }
339
340 halfNumOfSegments = numOfSegments / 2;
341 bounceFactor = (float) bouncingPeaksNumOfLeds / (maxDisplaySegments - bouncingPeaksNumOfLeds);
342 nonLinearResponseFactor = 90 / (float) maxDisplaySegments;
343 log10MaxDisplaySegments = log10(maxDisplaySegments);
344
345 pinMode(showPeaksPin, INPUT);
346
347 if (useSelectButton1)
348 pinMode(selectButton1Pin, INPUT);
349
350 left_strip.begin();
351 if (stripsOn2Pins)
352 right_strip.begin();
353
354 if (useSensorValues) {
355 readSensorValues();
356 setInitialDisplayPeaks();
357 }
358 else {
359 setStripColors();
360 setSensitivityFactor();
361 }
362
363 #ifdef DEBUG_TEST_LEDS
364 displayTest();
365 #endif
366
367 startupAnimation();
368}
369
370//
371// main loop
372//
373
374void loop() {
375 #ifdef DEBUG_PRINT_LOOP_TIME
376 long time = millis();
377 #endif
378
379
380 if (useSensorValues)
381 readSensorValues();
382
383 readValues();
384
385 #if defined (DEBUG_NO_PEAKS)
386 displayPeaks = false;
387 #endif
388
389 #if defined (DEBUG_PEAKS)
390 displayPeaks = true;
391 #endif
392
393 if (pulsing) {
394 drawPulsingValues();
395 }
396 else {
397 drawValues();
398 if (displayPeaks) {
399 getPeaks();
400 drawPeaks();
401 }
402 }
403
404 left_strip.show();
405 if (stripsOn2Pins)
406 right_strip.show();
407
408 storePrevValues();
409
410 checkSpinCircle();
411
412 #ifdef DEBUG_PRINT_LOOP_TIME
413 time = millis() - time;
414 Serial.println(time);
415 #endif
416}
417
418//
419// functions
420//
421
422void setInitialDisplayPeaks() {
423 #if !defined (DEBUG_NO_PEAK_SWITCH)
424 showPeaksPinSetting = digitalRead(showPeaksPin);
425
426 if (showPeaksPinSetting == HIGH)
427 displayPeaks = false;
428 #endif
429
430 if (reverseShowPeaks) {
431 if (!displayPeaks)
432 displayPeaks = true;
433 else
434 displayPeaks = false;
435 }
436
437 prevShowPeaksPinSetting = showPeaksPinSetting;
438}
439
440void readSensorValues() {
441 //
442 // peaks pin
443 //
444
445 #if !defined (DEBUG_NO_PEAK_SWITCH)
446 showPeaksPinSetting = digitalRead(showPeaksPin);
447
448 if (showPeaksMomentarySwitch) {
449 if (showPeaksPinSetting == LOW && prevShowPeaksPinSetting == HIGH) {
450 if (displayPeaks == true) {
451 displayPeaks = false;
452 clearLeftPeak();
453 clearRightPeak();
454 if (showPeaksMomentarySwitch)
455 while (digitalRead(showPeaksPin) == LOW) {}
456 }
457 else {
458 displayPeaks = true;
459 }
460 }
461 }
462 else {
463 if (reverseShowPeaks) {
464 if (showPeaksPinSetting == HIGH && prevShowPeaksPinSetting == LOW)
465 displayPeaks = true;
466 else if (showPeaksPinSetting == LOW && prevShowPeaksPinSetting == HIGH) {
467 displayPeaks = false;
468 clearLeftPeak();
469 clearRightPeak();
470 }
471 }
472 else {
473 if (showPeaksPinSetting == LOW && prevShowPeaksPinSetting == HIGH)
474 displayPeaks = true;
475 else if (showPeaksPinSetting == HIGH && prevShowPeaksPinSetting == LOW) {
476 displayPeaks = false;
477 clearLeftPeak();
478 clearRightPeak();
479 }
480 }
481 }
482 if (pulsing) {
483 if (displayPeaks)
484 displayTopAsPeak = true;
485 else
486 displayTopAsPeak = false;
487 }
488
489 prevShowPeaksPinSetting = showPeaksPinSetting;
490 #endif
491
492
493 //
494 // selectButtonPin 1 and 2
495 //
496 if (useSelectButton1) {
497 selectButton1PinState = digitalRead(selectButton1Pin);
498
499 if (selectButton1PinState == HIGH && prevSelectButton1PinState == LOW)
500 selectButton1Timer = millis();
501
502 if (selectButton1PinState == HIGH && prevSelectButton1PinState == HIGH) {
503 if ((millis() - selectButton1Timer) > 1000) {
504 pulsing = !pulsing;
505 setStripColors();
506 displayNumber(colorScheme, 250);
507
508 while (digitalRead(selectButton1Pin) == HIGH) {}
509 selectButton1PinState = LOW;
510 clearValues();
511 }
512 }
513 else if (selectButton1PinState == LOW && prevSelectButton1PinState == HIGH) {
514 selectButton1PinSetting++;
515 if (selectButton1PinSetting > maxColorScheme) {
516 selectButton1PinSetting = 0;
517 }
518 colorScheme = selectButton1PinSetting;
519
520 if (colorScheme == 12)
521 colorScheme11SpinValue = (colorScheme11SpinValue * colorScheme12Factor);
522
523 setStripColors();
524 displayNumber(colorScheme, 250);
525 }
526 prevSelectButton1PinState = selectButton1PinState;
527 }
528
529 if (useSelectButton2) {
530 selectButton2PinState = digitalRead(selectButton2Pin);
531
532 if (selectButton2PinState == HIGH && prevSelectButton2PinState == LOW) {
533 selectButton2PinSetting++;
534
535 switch(selectButton2PinSetting) {
536 case 0:
537 case 1: {
538 pulsing = true;
539 spinCircle = false;
540 break;
541 }
542 case 2: {
543 pulsing = true;
544 spinCircle = true;
545 break;
546 }
547 case 3: {
548 pulsing = false;
549 spinCircle = false;
550 selectButton2PinSetting = 0;
551 break;
552 }
553 }
554
555 setStripColors();
556 displayNumber(colorScheme, 250);
557 }
558
559 prevSelectButton2PinState = selectButton2PinState;
560 }
561
562 //
563 // brightness
564 //
565 brightnessValue = analogRead(brightnessPin);
566 brightnessValue = map(brightnessValue, 0, 1023, 0, 255);
567
568 if (abs(brightnessValue - prevBrightnessValue) > sensorDeviationBrightness) {
569 ledBrightness = brightnessValue;
570 setStripColors();
571 prevBrightnessValue = brightnessValue;
572 }
573
574 //
575 // colorscheme 11 spinning wheel
576 //
577
578 if (colorScheme == 11 || colorScheme == 12) {
579 colorScheme11SpinDelayValue++;
580 if (colorScheme11SpinDelayValue == colorScheme11SpinDelay) {
581 colorScheme11SpinDelayValue = 0;
582 colorScheme11SpinValue++;
583 if (colorScheme11SpinValue > maxDisplaySegments * colorSchemeFactor)
584 colorScheme11SpinValue = 0;
585 setStripColors();
586 }
587 }
588
589 //
590 // sensitivity
591 //
592 sensitivityValue = analogRead(sensitivityPin);
593 sensitivityValue = map(sensitivityValue, 0, 1023, 0, 255);
594 setSensitivityFactor();
595}
596
597void setSensitivityFactor() {
598 //sensitivityValue_div_numOfSegments = sensitivityValue / numOfSegments;
599 sensitivityFactor = ((float) sensitivityValue / 255 * (float) maxSensitivity / 255);
600}
601
602void readValues() {
603 #ifdef averageReadings
604 leftAnalogValue = 0;
605 rightAnalogValue = 0;
606
607 for (i = 0; i <= averageNumOfReadings; i++) {
608 leftAnalogValue += analogRead(leftPin);
609 rightAnalogValue += analogRead(rightPin);
610 }
611
612 leftAnalogValue /= averageNumOfReadings;
613 rightAnalogValue /= averageNumOfReadings;
614
615 #else
616 leftAnalogValue = analogRead(leftPin);
617 rightAnalogValue = analogRead(rightPin);
618 #endif
619
620 if (swapLeftRight) {
621 int tempValue = leftAnalogValue;
622 leftAnalogValue = rightAnalogValue;
623 rightAnalogValue = tempValue;
624 }
625
626 if (leftAnalogValue < prevLeftAnalogValue) {
627 leftDropTime++;
628 if (leftDropTime > dropDelay) {
629 leftAnalogValue = prevLeftAnalogValue * dropFactor;
630 leftDropTime = 0;
631 }
632 else
633 leftAnalogValue = prevLeftAnalogValue;
634 }
635
636 if (rightAnalogValue < prevRightAnalogValue) {
637 rightDropTime++;
638 if (rightDropTime > dropDelay) {
639 rightAnalogValue = prevRightAnalogValue * dropFactor;
640 rightDropTime = 0;
641 }
642 else
643 rightAnalogValue = prevRightAnalogValue;
644 }
645
646 #ifdef DEBUG_PRINT_ANALOGVALUES
647 Serial.print(leftAnalogValue);
648 Serial.print(" ");
649 Serial.println(rightAnalogValue);
650 #endif
651
652 // map values
653 leftValue = map(leftAnalogValue * sensitivityFactor, minValue, maxValue, 0, maxDisplaySegments);
654 rightValue = map(rightAnalogValue * sensitivityFactor, minValue, maxValue, 0, maxDisplaySegments);
655
656 // if defined, convert to (reverse) non linear response
657 boolean flagNonLinear = false;
658
659 #if defined (nonLinearSinAudio)
660 flagNonLinear = true;
661 leftValueN = ((sin(((leftValue * nonLinearResponseFactor) + 270) * 0.0174533) + 1) * maxDisplaySegments);
662 rightValueN = ((sin(((rightValue * nonLinearResponseFactor) + 270) * 0.0174533) + 1) * maxDisplaySegments);
663
664 #elif defined (nonLinearReverseSinAudio)
665 flagNonLinear = true;
666 leftValueN = ((sin(((leftValue * nonLinearResponseFactor)) * 0.0174533)) * maxDisplaySegments);
667 rightValueN = ((sin(((rightValue * nonLinearResponseFactor)) * 0.0174533)) * maxDisplaySegments);
668
669 #elif defined (nonLinearLogAudio)
670 flagNonLinear = true;
671 leftValueN = ((log10(leftValue + 1) / log10MaxDisplaySegments * maxDisplaySegments));
672 rightValueN = ((log10(rightValue + 1) / log10MaxDisplaySegments * maxDisplaySegments));
673
674 #endif
675
676 if (flagNonLinear == true) {
677 #if defined (nonLinearAvr2)
678 leftValue = (leftValue + leftValueN) / 2;
679 rightValue = (rightValue + rightValueN) / 2;
680 #else
681 leftValue = leftValueN;
682 rightValue = rightValueN;
683 #endif
684 }
685
686// @EB_DEBUG
687
688 #ifdef displayOverflow
689 #ifdef compressOverflowPeaks
690 for (i = 1; i <= compressOverflowNumOfTimes; i++) {
691 if (leftValue > maxDisplaySegments) {
692// Serial.print(i);
693// Serial.print(" ");
694// Serial.print(leftValue);
695// Serial.print(" ");
696 leftValue = leftValue - leftValue * compressOverflowFactor * i;
697// Serial.print(leftValue);
698// Serial.print(" ");
699// Serial.println(maxDisplaySegments);
700 }
701 }
702 #endif
703 #endif
704
705 if (leftValue > maxDisplaySegments) {
706 leftValue = maxDisplaySegments;
707 #ifdef displayOverflow
708 drawOverflow();
709 #endif
710 }
711
712 #ifdef displayOverflow
713 #ifdef compressOverflowPeaks
714 if (rightValue > maxDisplaySegments)
715 rightValue = rightValue - rightValue * compressOverflowFactor;
716 #endif
717 #endif
718
719 if (rightValue > maxDisplaySegments) {
720 rightValue = maxDisplaySegments;
721 #ifdef displayOverflow
722 drawOverflow();
723 #endif
724 }
725}
726
727void storePrevValues() {
728 prevLeftAnalogValue = leftAnalogValue;
729 prevRightAnalogValue = rightAnalogValue;
730
731 prevLeftValue = leftValue;
732 prevRightValue = rightValue;
733}
734
735void getPeaks() {
736 if (leftValue > leftPeak) {
737 if (dynamicBouncingPeaks || prevLeftPeakBounce > 0)
738 clearLeftBouncePeak();
739
740 leftPeak = leftValue;
741 leftPeakTime = 0;
742 leftFirstPeak = true;
743
744 if (bouncingPeaks) {
745 leftPeakBouncing = true;
746 leftPeakBounceCounter = 0;
747 leftPeakBounceDelayCounter = 0;
748
749 if (dynamicBouncingPeaks)
750 leftBouncingPeaksNumOfLeds = max(bouncingPeaksNumOfLedsMin, (leftPeak * bounceFactor));
751 else
752 leftBouncingPeaksNumOfLeds = bouncingPeaksNumOfLeds;
753 }
754 }
755 else {
756 leftPeakTime++;
757 if (droppingPeak) {
758 if (leftFirstPeak) {
759 if (leftPeakTime > peakTimeFirstDropDelay) {
760 clearLeftPeak();
761 leftFirstPeak = false;
762 }
763 }
764 else {
765 if (leftPeakTime > peakTimeDropDelay) {
766 clearLeftPeak();
767 }
768 }
769 }
770 else {
771 if (leftPeakTime > peakTimeNoDropDelay) {
772 clearLeftPeak();
773 }
774 }
775 }
776
777 if (leftPeakBouncing) {
778 if (leftFirstPeak) {
779 leftPeakBounceDelayCounter++;
780 if (leftPeakBounceDelayCounter >= bouncingPeakDelay) {
781 leftPeakBounceDelayCounter = 0;
782 leftPeakBounceCounter += bouncingPeakCounterInc;
783 if (leftPeakBounceCounter >= 180) {
784 clearLeftBouncePeak();
785 clearLeftBounce();
786 }
787 else {
788 leftPeakBounce = min((sin(leftPeakBounceCounter * 0.0174533) * leftBouncingPeaksNumOfLeds), (maxDisplaySegments - leftPeak));
789 if (leftPeakBounce != prevLeftPeakBounce) {
790 clearLeftBouncePeak();
791 }
792 prevLeftPeakBounce = leftPeakBounce;
793 }
794 }
795 }
796 }
797
798 if (rightValue > rightPeak) {
799 if (dynamicBouncingPeaks || prevRightPeakBounce > 0)
800 clearRightBouncePeak();
801
802 rightPeak = rightValue;
803 rightPeakTime = 0;
804 rightFirstPeak = true;
805
806 if (bouncingPeaks) {
807 rightPeakBouncing = true;
808 rightPeakBounceCounter = 0;
809 rightPeakBounceDelayCounter = 0;
810
811 if (dynamicBouncingPeaks)
812 rightBouncingPeaksNumOfLeds = max(bouncingPeaksNumOfLedsMin, (rightPeak * bounceFactor));
813 else
814 rightBouncingPeaksNumOfLeds = bouncingPeaksNumOfLeds;
815 }
816 }
817 else {
818 rightPeakTime++;
819 if (droppingPeak) {
820 if (rightFirstPeak) {
821 if (rightPeakTime > peakTimeFirstDropDelay) {
822 clearRightPeak();
823 rightFirstPeak = false;
824 }
825 }
826 else {
827 if (rightPeakTime > peakTimeDropDelay)
828 clearRightPeak();
829 }
830 }
831 else {
832 if (rightPeakTime > peakTimeNoDropDelay)
833 clearRightPeak();
834 }
835 }
836
837 if (rightPeakBouncing) {
838 if (rightFirstPeak) {
839 rightPeakBounceDelayCounter++;
840 if (rightPeakBounceDelayCounter >= bouncingPeakDelay) {
841 rightPeakBounceDelayCounter = 0;
842 rightPeakBounceCounter += bouncingPeakCounterInc;
843
844 if (rightPeakBounceCounter >= 180) {
845 clearRightBouncePeak();
846 clearRightBounce();
847 }
848 else {
849 rightPeakBounce = min((sin(rightPeakBounceCounter * 0.0174533) * rightBouncingPeaksNumOfLeds), (maxDisplaySegments - rightPeak));
850 if (rightPeakBounce != prevRightPeakBounce) {
851 clearRightBouncePeak();
852 }
853 prevRightPeakBounce = rightPeakBounce;
854 }
855 }
856 }
857 }
858}
859
860void checkSpinCircle () {
861 if (spinCircle) {
862 if (spinTurnsMax == 0) {
863 spinTurnsMax = random(stripNumOfLeds / 4, stripNumOfLeds * 3); // spin at least a quarter turn, max 3 turns
864
865 if (random(10) > 4)
866 spinCounterInc = -spinCounterInc;
867
868 spinTurnsDelayMax = random(100, 1000); // @EB_DEBUG
869
870 spinDelay = random(20, 75); // @EB_DEBUG
871 }
872
873 if (spinTurnsCounter == spinTurnsMax) {
874 spinTurnsDelay++;
875 if (spinTurnsDelay == spinTurnsDelayMax) {
876 spinTurnsDelay = 0;
877 spinTurnsCounter = 0;
878 spinTurnsMax = 0;
879 }
880 }
881 else {
882 spinDelayCounter++;
883
884 if (spinDelayCounter > spinDelay) {
885 clearZeroAndPeaks();
886
887 spinCounter += spinCounterInc;
888 if (spinCounter > stripNumOfLeds)
889 spinCounter = 0;
890 else if (spinCounter < 0)
891 spinCounter = stripNumOfLeds;
892
893 spinTurnsCounter++;
894 spinDelayCounter = 0;
895 }
896 }
897 }
898}
899
900int getSpinCircleValue(int value) {
901 if (!spinCircle)
902 return value;
903 else {
904 int calcValue = value + spinCounter;
905 if (calcValue >= stripNumOfLeds)
906 calcValue -= stripNumOfLeds;
907 return calcValue;
908 }
909}
910
911void drawValues() {
912 if (splitStrip) {
913 for (i = middleOffset; i < leftValue; i++)
914 left_strip.setPixelColor(getSpinCircleValue(i), stripColor[i]);
915
916 if (!displayPeaks && displayTopAsPeak)
917 left_strip.setPixelColor(getSpinCircleValue(leftValue), stripHoldColor);
918
919 for (i = prevLeftValue; i >= leftValue; i--)
920 left_strip.setPixelColor(getSpinCircleValue(i), 0);
921
922 if (stripsOn2Pins) {
923 for (i = middleOffset; i < rightValue; i++)
924 right_strip.setPixelColor(i, stripColor[i]);
925
926 if (!displayPeaks && displayTopAsPeak)
927 right_strip.setPixelColor(rightValue, stripHoldColor);
928
929 for (i = prevRightValue; i >= rightValue; i--)
930 right_strip.setPixelColor(i, 0);
931 }
932 else {
933 for (i = middleOffset; i < rightValue; i++)
934 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + i), stripColor[i]);
935
936 if (!displayPeaks && displayTopAsPeak)
937 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + rightValue), stripHoldColor);
938
939 for (i = prevRightValue; i >= rightValue; i--)
940 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + i), 0);
941 }
942 }
943 else {
944 for (i = middleOffset; i < leftValue; i++)
945 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + i), stripColor[i]);
946
947 if (!displayPeaks && displayTopAsPeak)
948 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + leftValue), stripHoldColor);
949
950 for (i = prevLeftValue; i >= leftValue; i--)
951 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + i), 0);
952
953 for (i = middleOffset; i < rightValue; i++)
954 left_strip.setPixelColor(getSpinCircleValue(stripMiddle - i), stripColor[i]);
955
956 if (!displayPeaks && displayTopAsPeak)
957 left_strip.setPixelColor(getSpinCircleValue(stripMiddle - rightValue), stripHoldColor);
958
959 for (i = prevRightValue; i >= rightValue; i--)
960 left_strip.setPixelColor(getSpinCircleValue(stripMiddle - i), 0);
961 }
962
963 if (displayMiddleLed)
964 left_strip.setPixelColor(getSpinCircleValue(stripMiddle), stripMiddleColor);
965}
966
967void drawPulsingValues() {
968 halfLeftValue = (leftValue + 1) / 2;
969 halfRightValue = (rightValue + 1) / 2;
970 halfPrevLeftValue = (prevLeftValue + 1)/ 2;
971 halfPrevRightValue = (prevRightValue + 1) / 2;
972
973 if (splitStrip) {
974 for (i = 0; i < halfLeftValue; i++) {
975 colorValue = stripColor[i * 2];
976 left_strip.setPixelColor(getSpinCircleValue(stripPulseMiddle + i), colorValue);
977 left_strip.setPixelColor(getSpinCircleValue(stripPulseMiddle - i), colorValue);
978 }
979
980 if (displayTopAsPeak) {
981 left_strip.setPixelColor(getSpinCircleValue(stripPulseMiddle + halfLeftValue), stripHoldColor);
982 left_strip.setPixelColor(getSpinCircleValue(stripPulseMiddle - halfLeftValue), stripHoldColor);
983 }
984
985 for (i = halfPrevLeftValue; i >= halfLeftValue; i--) {
986 left_strip.setPixelColor(getSpinCircleValue(stripPulseMiddle + i), 0);
987 left_strip.setPixelColor(getSpinCircleValue(stripPulseMiddle - i), 0);
988 }
989
990 if (stripsOn2Pins) {
991 for (i = 0; i < halfRightValue; i++) {
992 colorValue = stripColor[i * 2];
993 right_strip.setPixelColor((stripPulseMiddle + i), colorValue);
994 right_strip.setPixelColor((stripPulseMiddle - i), colorValue);
995 }
996
997 if (displayTopAsPeak) {
998 right_strip.setPixelColor(getSpinCircleValue(stripPulseMiddle + halfRightValue), stripHoldColor);
999 right_strip.setPixelColor(getSpinCircleValue(stripPulseMiddle - halfRightValue), stripHoldColor);
1000 }
1001
1002 for (i = halfPrevRightValue; i >= halfRightValue; i--) {
1003 right_strip.setPixelColor((stripPulseMiddle + i), 0);
1004 right_strip.setPixelColor((stripPulseMiddle - i), 0);
1005 }
1006 }
1007 else {
1008 for (i = 0; i < halfRightValue; i++) {
1009 colorValue = colorValue = stripColor[i * 2];
1010 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + stripPulseMiddle + i), colorValue);
1011 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + stripPulseMiddle - i), colorValue);
1012 }
1013
1014 if (displayTopAsPeak) {
1015 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + stripPulseMiddle + halfRightValue), stripHoldColor);
1016 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + stripPulseMiddle - halfRightValue), stripHoldColor);
1017 }
1018
1019 for (i = halfPrevRightValue; i >= halfRightValue; i--) {
1020 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + stripPulseMiddle + i), 0);
1021 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + stripPulseMiddle - i), 0);
1022 }
1023 }
1024 }
1025 else {
1026 for (i = 0; i < halfLeftValue; i++) {
1027 colorValue = colorValue = stripColor[i * 2];
1028 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + stripPulseMiddle + i), colorValue);
1029 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + stripPulseMiddle - i), colorValue);
1030 }
1031
1032 if (displayTopAsPeak) {
1033 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + stripPulseMiddle + halfLeftValue), stripHoldColor);
1034 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + stripPulseMiddle - halfLeftValue), stripHoldColor);
1035 }
1036
1037 for (i = halfPrevLeftValue; i >= halfLeftValue; i--) {
1038 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + stripPulseMiddle + i), 0);
1039 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + stripPulseMiddle - i), 0);
1040 }
1041
1042 for (i = 0; i < halfRightValue; i++) {
1043 colorValue = colorValue = stripColor[i * 2];
1044 left_strip.setPixelColor(getSpinCircleValue(stripMiddle - (stripPulseMiddle + i)), colorValue);
1045 left_strip.setPixelColor(getSpinCircleValue(stripMiddle - (stripPulseMiddle - i)), colorValue);
1046 }
1047
1048 if (displayTopAsPeak) {
1049 left_strip.setPixelColor(getSpinCircleValue(stripMiddle - (stripPulseMiddle + halfRightValue)), stripHoldColor);
1050 left_strip.setPixelColor(getSpinCircleValue(stripMiddle - (stripPulseMiddle - halfRightValue)), stripHoldColor);
1051 }
1052
1053 for (i = halfPrevRightValue; i >= halfRightValue; i--) {
1054 left_strip.setPixelColor(getSpinCircleValue(stripMiddle - (stripPulseMiddle + i)), 0);
1055 left_strip.setPixelColor(getSpinCircleValue(stripMiddle - (stripPulseMiddle - i)), 0);
1056 }
1057 }
1058
1059 if (displayMiddleLed) {
1060 left_strip.setPixelColor(getSpinCircleValue(stripMiddle - stripPulseMiddle), stripMiddleColor);
1061 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + stripPulseMiddle), stripMiddleColor);
1062 }
1063}
1064
1065void clearZeroAndPeaks() {
1066 left_strip.setPixelColor(getSpinCircleValue(middleOffset), 0);
1067 left_strip.setPixelColor(getSpinCircleValue(stripMiddle), 0);
1068
1069 if (displayTopAsPeak) {
1070 if (splitStrip) {
1071 left_strip.setPixelColor(getSpinCircleValue(stripPulseMiddle + halfLeftValue), 0);
1072 left_strip.setPixelColor(getSpinCircleValue(stripPulseMiddle - halfLeftValue), 0);
1073
1074 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + stripPulseMiddle + halfRightValue), 0);
1075 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + stripPulseMiddle - halfRightValue), 0);
1076 }
1077 else {
1078 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + stripPulseMiddle + halfLeftValue), 0);
1079 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + stripPulseMiddle - halfLeftValue), 0);
1080
1081 left_strip.setPixelColor(getSpinCircleValue(stripMiddle - (stripPulseMiddle + halfRightValue)), 0);
1082 left_strip.setPixelColor(getSpinCircleValue(stripMiddle - (stripPulseMiddle - halfRightValue)), 0);
1083 }
1084 }
1085}
1086
1087void drawPeaks() {
1088 if (leftPeak > 0) {
1089 if (droppingPeakFade && leftPeakBouncing == false)
1090 stripHoldColor = left_strip.Color(max(1, (255 * leftPeak * ledFactor_div_numOfSegments)), 0, 0);
1091 else
1092 stripHoldColor = stripColor[numOfSegments];
1093
1094 if (splitStrip)
1095 left_strip.setPixelColor(getSpinCircleValue(leftPeak + leftPeakBounce), stripHoldColor);
1096 else
1097 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + (leftPeak + leftPeakBounce)), stripHoldColor);
1098 }
1099
1100 if (rightPeak > 0) {
1101 if (droppingPeakFade && rightPeakBouncing == false)
1102 stripHoldColor = left_strip.Color(max(1, (255 * rightPeak * ledFactor_div_numOfSegments)), 0, 0);
1103 else
1104 stripHoldColor = stripColor[numOfSegments];
1105
1106 if (splitStrip) {
1107 if (stripsOn2Pins) {
1108 right_strip.setPixelColor(getSpinCircleValue(rightPeak + rightPeakBounce), stripHoldColor);
1109 }
1110 else {
1111 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + rightPeak + rightPeakBounce), stripHoldColor);
1112 }
1113 }
1114 else {
1115 left_strip.setPixelColor(getSpinCircleValue(stripMiddle - (rightPeak + rightPeakBounce)), stripHoldColor);
1116 }
1117 }
1118
1119 //if (leftPeak > 0 || rightPeak > 0)
1120 // left_strip.show();
1121}
1122
1123void clearLeftPeak() {
1124 if (splitStrip)
1125 left_strip.setPixelColor(getSpinCircleValue(leftPeak + prevLeftPeakBounce), 0);
1126 else
1127 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + (leftPeak + prevLeftPeakBounce)), 0);
1128
1129 if (droppingPeak)
1130 leftPeak = leftPeak * peakDropFactor;
1131 else
1132 leftPeak = 0;
1133 leftPeakTime = 0;
1134}
1135
1136void clearRightPeak() {
1137 if (splitStrip) {
1138 if( stripsOn2Pins) {
1139 right_strip.setPixelColor(getSpinCircleValue(rightPeak + prevRightPeakBounce), 0);
1140 }
1141 else {
1142 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + rightPeak + prevRightPeakBounce), 0);
1143 }
1144 }
1145 else {
1146 left_strip.setPixelColor(getSpinCircleValue(stripMiddle - (rightPeak + prevRightPeakBounce)), 0);
1147 }
1148
1149 if (droppingPeak)
1150 rightPeak = rightPeak * peakDropFactor;
1151 else
1152 rightPeak = 0;
1153 rightPeakTime = 0;
1154}
1155
1156void clearLeftBouncePeak() {
1157 if (splitStrip)
1158 left_strip.setPixelColor(getSpinCircleValue(leftPeak + prevLeftPeakBounce), 0);
1159 else
1160 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + (leftPeak + prevLeftPeakBounce)), 0);
1161}
1162
1163void clearRightBouncePeak() {
1164 if (splitStrip) {
1165 if (stripsOn2Pins) {
1166 right_strip.setPixelColor(getSpinCircleValue(rightPeak + prevRightPeakBounce), 0);
1167 }
1168 else {
1169 left_strip.setPixelColor(getSpinCircleValue((stripMiddle + rightPeak + prevRightPeakBounce)), 0);
1170 }
1171 }
1172 else {
1173 left_strip.setPixelColor(getSpinCircleValue(stripMiddle - (rightPeak + prevRightPeakBounce)), 0);
1174 }
1175}
1176
1177void clearLeftBounce() {
1178 leftPeakBouncing = false;
1179 leftPeakBounceCounter = 0;
1180 leftPeakBounce = 0;
1181 prevLeftPeakBounce = 0;
1182 leftBouncingPeaksNumOfLeds = 0;
1183}
1184
1185void clearRightBounce() {
1186 rightPeakBouncing = false;
1187 rightPeakBounceCounter = 0;
1188 rightPeakBounce = 0;
1189 prevRightPeakBounce = 0;
1190 leftBouncingPeaksNumOfLeds = 0;
1191}
1192
1193void clearValues() {
1194 leftAnalogValue = 0;
1195 rightAnalogValue = 0;
1196 prevLeftAnalogValue = 0;
1197 prevRightAnalogValue = 0;
1198 leftPeak = 0;
1199 rightPeak = 0;
1200}
1201
1202
1203void drawOverflow() {
1204 for (i = 0; i <= numOfSegments; i++) {
1205 left_strip.setPixelColor(getSpinCircleValue(stripMiddle - i), stripOverflowColor);
1206 if (stripsOn2Pins) {
1207 right_strip.setPixelColor(i, stripOverflowColor);
1208 }
1209 else {
1210 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + i), stripOverflowColor);
1211 }
1212 }
1213 left_strip.show();
1214 if (stripsOn2Pins)
1215 right_strip.show();
1216
1217 delay(overflowDelay);
1218
1219 for (i = 0; i <= numOfSegments; i++) {
1220 left_strip.setPixelColor(getSpinCircleValue(stripMiddle - i), 0);
1221 if (stripsOn2Pins) {
1222 right_strip.setPixelColor(i, 0);
1223 }
1224 else {
1225 left_strip.setPixelColor(getSpinCircleValue(stripMiddle + i), 0);
1226 }
1227 }
1228 left_strip.show();
1229 if (stripsOn2Pins)
1230 right_strip.show();
1231}
1232
1233void setStripColors() {
1234 int r, g, b;
1235 int p1, p2;
1236
1237 ledFactor = (float) ledBrightness / 255;
1238 ledFactor_div_numOfSegments = (float) ledFactor / (float) numOfSegments;
1239 stripMiddleColor = left_strip.Color(0, 0, 255 * ledFactor);
1240
1241 switch (colorScheme) {
1242 case 0: {
1243 int orangeLimit;
1244 float orangeFactor = orangeLimitAmount / halfNumOfSegments;
1245
1246 for (i = 0; i <= numOfSegments; i++) {
1247 if (i <= halfNumOfSegments)
1248 orangeLimit = (i * orangeFactor);
1249 else
1250 orangeLimit = ((numOfSegments - i) * orangeFactor);
1251
1252 stripColor[i] = left_strip.Color((255 * i * ledFactor_div_numOfSegments), ((255 - orangeLimit) * (numOfSegments - i) * ledFactor_div_numOfSegments), 0);
1253 }
1254 break;
1255 }
1256
1257 case 1: {
1258 for (i = 0; i <= numOfSegments; i++) {
1259 stripColor[i] = left_strip.Color(0, (255 * i * ledFactor_div_numOfSegments), (255 * (numOfSegments - i) * ledFactor_div_numOfSegments));
1260 }
1261 break;
1262 }
1263
1264 case 2: {
1265 for (i = 0; i <= numOfSegments; i++) {
1266 stripColor[i] = left_strip.Color((255 * i * ledFactor_div_numOfSegments), 0, (255 * (numOfSegments - i) * ledFactor_div_numOfSegments));
1267 }
1268 break;
1269 }
1270
1271 case 3: {
1272 for (i = 0; i <= numOfSegments; i++) {
1273 stripColor[i] = left_strip.Color((255 * (numOfSegments - i) * ledFactor_div_numOfSegments), 0, (255 * i * ledFactor_div_numOfSegments));
1274 }
1275 break;
1276 }
1277
1278 case 4: {
1279 for (i = 0; i <= numOfSegments; i++) {
1280 stripColor[i] = left_strip.Color(0, (255 * (numOfSegments - i) * ledFactor_div_numOfSegments), (255 * i * ledFactor_div_numOfSegments));
1281 }
1282 break;
1283 }
1284
1285 case 5: {
1286 for (i = 0; i <= numOfSegments; i++) {
1287 stripColor[i] = left_strip.Color((255 * (numOfSegments - i) * ledFactor_div_numOfSegments), (255 * i * ledFactor_div_numOfSegments), 0);
1288 }
1289 break;
1290 }
1291
1292 case 6: {
1293 for (i = 0; i <= numOfSegments; i++) {
1294 r = (255 * i * ledFactor_div_numOfSegments);
1295 g = (255 * min(i, numOfSegments - i) * ledFactor_div_numOfSegments);
1296 b = (200 * (numOfSegments - i) * ledFactor_div_numOfSegments);
1297 stripColor[i] = left_strip.Color(r, g, b);
1298 }
1299 break;
1300 }
1301
1302 case 7: {
1303 for (i = 0; i <= numOfSegments; i++) {
1304 b = (255 * i * ledFactor_div_numOfSegments);
1305 g = (255 * min(i, numOfSegments - i) * ledFactor_div_numOfSegments);
1306 r = (255 * (numOfSegments - i) * ledFactor_div_numOfSegments);
1307 stripColor[i] = left_strip.Color(r, g, b);
1308 }
1309 break;
1310 }
1311
1312 case 8: {
1313 for (i = 0; i <= numOfSegments; i++) {
1314 r = (255 * i * ledFactor_div_numOfSegments);
1315 b = (255 * min(i, numOfSegments - i) * ledFactor_div_numOfSegments);
1316 g = (255 * (numOfSegments - i) * ledFactor_div_numOfSegments);
1317 stripColor[i] = left_strip.Color(r, g, b);
1318 }
1319 break;
1320 }
1321
1322 case 9: {
1323 for (i = 0; i <= numOfSegments; i++) {
1324 b = (255 * i * ledFactor_div_numOfSegments);
1325 r = (255 * min(i, numOfSegments - i) * ledFactor_div_numOfSegments);
1326 g = (255 * (numOfSegments - i) * ledFactor_div_numOfSegments);
1327 stripColor[i] = left_strip.Color(r, g, b);
1328 }
1329 break;
1330 }
1331
1332 case 10:
1333 colorScheme11SpinValue = 0;
1334
1335 case 11:
1336
1337 case 12: {
1338 p1 = (85 * numOfSegments / 255);
1339 p2 = (170 * numOfSegments / 255);
1340 int wheel;
1341
1342 if (colorScheme == 12)
1343 colorSchemeFactor = colorScheme12Factor;
1344 else
1345 colorSchemeFactor = 1;
1346
1347 for (i = 0; i <= numOfSegments; i++) {
1348 //wheel = int(float(i + colorScheme11SpinValue) / colorSchemeFactor) % numOfSegments; // reverse wheel
1349
1350 wheel = int(float(i - colorScheme11SpinValue) / colorSchemeFactor + numOfSegments) % numOfSegments;
1351
1352 if (wheel < p1) {
1353 wheel = map(wheel, 0, p1, 0, 255);
1354 r = (wheel * ledFactor);
1355 g = ((255 - wheel) * ledFactor);
1356 b = 0;
1357 }
1358 else if (wheel < p2) {
1359 wheel = map(wheel, p1, p2, 0, 255);
1360 r = ((255 - wheel) * ledFactor);
1361 g = 0;
1362 b = (wheel * ledFactor);
1363 }
1364 else {
1365 wheel = map(wheel, p2, numOfSegments, 0, 255);
1366 r = 0;
1367 g = (wheel * ledFactor);
1368 b = ((255 - wheel) * ledFactor);
1369 }
1370
1371 stripColor[i] = left_strip.Color(r, g, b);
1372 }
1373 break;
1374 }
1375 }
1376
1377 if (colorScheme >= 10)
1378 stripHoldColor = left_strip.Color(255 * ledFactor, 0, 0); // set to red for the color wheels
1379 else
1380 stripHoldColor = stripColor[numOfSegments];
1381
1382 stripOverflowColor = stripHoldColor; // left_strip.Color(min(255, 255 * ledFactor * 1.5), 0, 0);
1383}
1384
1385void startupAnimation() {
1386 for (j = 0; j < 2; j++) {
1387 for (i = 0; i <= numOfSegments; i++) {
1388 if (animType == 1)
1389 left_strip.setPixelColor(stripMiddle - (numOfSegments - i), stripColor[i]);
1390 else
1391 left_strip.setPixelColor(stripMiddle - i, stripColor[i]);
1392
1393 if (stripsOn2Pins)
1394 right_strip.setPixelColor(i, stripColor[i]);
1395 else
1396 left_strip.setPixelColor(stripMiddle + i, stripColor[i]);
1397
1398 left_strip.show();
1399 if (stripsOn2Pins)
1400 right_strip.show();
1401
1402 delay(startupAnimationDelay);
1403 }
1404
1405 for (i = 0; i <= numOfSegments; i++) {
1406 if (animType == 1)
1407 left_strip.setPixelColor(stripMiddle - (numOfSegments - i), 0);
1408 else
1409 left_strip.setPixelColor(stripMiddle - i, 0);
1410
1411 if (stripsOn2Pins)
1412 right_strip.setPixelColor(i, 0);
1413 else
1414 left_strip.setPixelColor(stripMiddle + i, 0);
1415
1416 left_strip.show();
1417 if (stripsOn2Pins)
1418 right_strip.show();
1419
1420 delay(startupAnimationDelay);
1421 }
1422 }
1423}
1424
1425void displayNumber (int number, int displayDelay) {
1426 left_strip.clear();
1427 if (stripsOn2Pins)
1428 right_strip.clear();
1429
1430 number++; // @EB_DEBUG : display value 0 at led 1
1431
1432 for (i = 0; i <= number; i++) {
1433 if (i % 5 == 0)
1434 colorValue = stripMiddleColor;
1435 else
1436 colorValue = stripColor[0];
1437
1438 left_strip.setPixelColor(middleOffset + i, colorValue);
1439
1440 if (stripsOn2Pins)
1441 right_strip.setPixelColor(middleOffset + i, colorValue);
1442 else
1443 left_strip.setPixelColor(stripMiddle + middleOffset + i, colorValue);
1444
1445 delay(45 - number * 3); // @EB_DEBUG
1446
1447 left_strip.show();
1448 if (stripsOn2Pins)
1449 right_strip.show();
1450 }
1451
1452 if (pulsing) {
1453 left_strip.setPixelColor(middleOffset + maxDisplaySegments, stripMiddleColor);
1454
1455 if (stripsOn2Pins)
1456 right_strip.setPixelColor(maxDisplaySegments, stripMiddleColor);
1457 else
1458 left_strip.setPixelColor(stripMiddle + maxDisplaySegments, stripMiddleColor);
1459
1460 left_strip.show();
1461 if (stripsOn2Pins)
1462 right_strip.show();
1463 }
1464
1465 delay(displayDelay);
1466
1467 left_strip.clear();
1468 if (stripsOn2Pins)
1469 right_strip.clear();
1470}
1471
1472
1473//
1474// for debugging
1475//
1476
1477#ifdef DEBUG_TEST_LEDS
1478 void displayTest() {
1479 for (i = 0; i <= numOfSegments; i++) {
1480 left_strip.setPixelColor(stripMiddle - i, stripColor[i]);
1481
1482 if (stripsOn2Pins)
1483 right_strip.setPixelColor(i, stripColor[i]);
1484 else
1485 left_strip.setPixelColor(stripMiddle + i, stripColor[i]);
1486
1487 left_strip.show();
1488 if (stripsOn2Pins)
1489 right_strip.show();
1490
1491 delay(50);
1492 }
1493 delay(5000);
1494
1495 for (i = 0; i <= numOfSegments; i++) {
1496 left_strip.setPixelColor(stripMiddle - i, 0);
1497
1498 if (stripsOn2Pins)
1499 right_strip.setPixelColor(i, 0);
1500 else
1501 left_strip.setPixelColor(stripMiddle + i, 0);
1502
1503 left_strip.show();
1504 if (stripsOn2Pins)
1505 right_strip.show();
1506 }
1507 }
1508
1509 void serialDisplayRGB(int r, int g, int b) {
1510 Serial.print(i);
1511 Serial.print(" ");
1512 Serial.print(r);
1513 Serial.print(" ");
1514 Serial.print(g);
1515 Serial.print(" ");
1516 Serial.println(b);
1517 }
1518#endif
Documentation
Schematic
Note: Content and images are from: https://projecthub.arduino.cc/, with some modifications.
If you want it removed due to copyright reasons, please leave a comment. Thank you.
I want to share this article more widely so that everyone knows about Arduino and your project.