A "classic" light organ (2X3 12V led strips) based on a Sparkfun Spectrum Shield.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SparkFun_Spectrum_Light_Organ.ino 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include <SoftPWM.h>
  2. #include <SoftPWM_timer.h>
  3. // Dimmer potentiometer pin
  4. #define DIMMER A5
  5. // LED strip V- pins
  6. // The idea was that LED pins would be PWM, but board only has six, including pin 5
  7. // (used as the spectrum shield's RESET pin [arggghhh]), so we use the SoftPWM library
  8. // which allows us to replace pin 5 with 13
  9. int leds[6] = { 9, 10, 11, 3, 13 /* don't you hate desoldering? */, 7};
  10. // Spectrum Shield pin connections
  11. #define STROBE 4
  12. #define RESET 5 // See [arggghhh] above
  13. #define AUDIO_LEFT A0
  14. #define AUDIO_RIGHT A1
  15. //Define spectrum variables
  16. int Frequencies_Left[7] = {0};
  17. int Frequencies_Right[7] = {0};
  18. #define NOISE_LEVEL 32 // even "silence" has frequencies ;)
  19. int loud = 0; // dynamically determined from sound
  20. int dimmer; // DIMMER pot value scaled to 8 bit
  21. int quiet; // level below which LED is off (computed from dimmer and loud)
  22. #define LOUDNESS_DECAY 0.01
  23. #define NORMALIZE(level) level>NOISE_LEVEL ? constrain(map(level, quiet, max(loud, (quiet * 5 / 4)), 0, dimmer), 0, 255) : 0
  24. /********************Setup*************************/
  25. void setup() {
  26. Serial.begin(9600);
  27. // init led pins, and flash them (to help check wiring)
  28. SoftPWMBegin();
  29. for (int i = 0; i < 6; i++) {
  30. pinMode(leds[i], OUTPUT);
  31. SoftPWMSetFadeTime(leds[i], 23, 42);
  32. SoftPWMSet(leds[i], 63);
  33. delay(250);
  34. SoftPWMSet(leds[i], 0);
  35. }
  36. //Set spectrum Shield pin configurations
  37. pinMode(STROBE, OUTPUT);
  38. pinMode(RESET, OUTPUT);
  39. pinMode(AUDIO_LEFT, INPUT);
  40. pinMode(AUDIO_RIGHT, INPUT);
  41. digitalWrite(STROBE, HIGH);
  42. digitalWrite(RESET, HIGH);
  43. //Initialize Spectrum Analyzers
  44. digitalWrite(STROBE, LOW);
  45. delay(1);
  46. digitalWrite(RESET, HIGH);
  47. delay(1);
  48. digitalWrite(STROBE, HIGH);
  49. delay(1);
  50. digitalWrite(STROBE, LOW);
  51. delay(1);
  52. digitalWrite(RESET, LOW);
  53. }
  54. /**************************Main Loop*****************************/
  55. void loop() {
  56. Read_Frequencies();
  57. dimmer = 255 - (analogRead(DIMMER) >> 2);
  58. quiet = map(dimmer, 255, 0, NOISE_LEVEL, max((loud * 9) / 10, (NOISE_LEVEL * 10) / 9));
  59. Graph_Frequencies();
  60. Serial.print(loud);
  61. Serial.print(' ');
  62. Serial.println(quiet);
  63. }
  64. /*******************Pull frquencies from Spectrum Shield********************/
  65. void Read_Frequencies() {
  66. int level = 0;
  67. //Read frequencies for each band
  68. for (int freq_amp = 0; freq_amp < 7; freq_amp++)
  69. {
  70. // a crude low-pass to smooth out noises
  71. Frequencies_Left[freq_amp] = (Frequencies_Left[freq_amp] + (Frequencies_Left[freq_amp] + analogRead(AUDIO_LEFT)) >> 1) >> 1;
  72. Frequencies_Right[freq_amp] = (Frequencies_Right[freq_amp] + (Frequencies_Right[freq_amp] + analogRead(AUDIO_RIGHT)) >> 1) >> 1;
  73. digitalWrite(STROBE, HIGH);
  74. digitalWrite(STROBE, LOW);
  75. level += Frequencies_Left[freq_amp] + Frequencies_Right[freq_amp];
  76. }
  77. level /= 12;
  78. Serial.print(level);
  79. Serial.print(' ');
  80. if (level > loud) {
  81. loud = level;
  82. } else {
  83. loud = max(level, int(round(float(loud) * (1.0 - LOUDNESS_DECAY))));
  84. }
  85. }
  86. /*******************Light LEDs based on frequencies*****************************/
  87. void Graph_Frequencies() {
  88. for (int i = 0; i < 3; i++)
  89. {
  90. int l = (Frequencies_Left[i * 2] + Frequencies_Left[i * 2 + 1]) / 2;
  91. int r = (Frequencies_Right[i * 2] + Frequencies_Right[i * 2 + 1]) / 2;
  92. SoftPWMSet(leds[i], NORMALIZE(l));
  93. SoftPWMSet(leds[i + 3], NORMALIZE(r));
  94. }
  95. }