A sound-reactive wearable accessory
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.

flora-mic2color.ino 1.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include <Adafruit_NeoPixel.h>
  2. #ifdef __AVR__
  3. #include <avr/power.h>
  4. #endif
  5. #define NUMLEDS 1
  6. #define LEDPIN 8
  7. #define MICPIN A9
  8. #define FAKEVCCPIN 6
  9. Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMLEDS, LEDPIN, NEO_GRB + NEO_KHZ800);
  10. #define BUFFSIZE 115
  11. #define AVGSIZE 23
  12. int rawBuff[BUFFSIZE];
  13. int notHighBuff[BUFFSIZE];
  14. int lowBuff[BUFFSIZE];
  15. int index, minLow, maxLow, minMid, maxMid, minHigh, maxHigh;
  16. #define RAWLOW(i) (lowBuff[i])
  17. #define RAWMID(i) (notHighBuff[i]-lowBuff[i])
  18. #define RAWHIGH(i) (rawBuff[i]-notHighBuff[i])
  19. #define NORMLOW(i) constrain(map(RAWLOW(i), minLow, maxLow, 0, 255), 0, 255)
  20. #define NORMMID(i) constrain(map(RAWMID(i), minMid, maxMid, 0, 255), 0, 255)
  21. #define NORMHIGH(i) constrain(map(RAWHIGH(i), minHigh, maxHigh, 0, 255), 0, 255)
  22. void setup() {
  23. pinMode(FAKEVCCPIN, OUTPUT);
  24. digitalWrite(FAKEVCCPIN, HIGH);
  25. index = 0;
  26. strip.begin();
  27. strip.show(); // Initialize all pixels to 'off'
  28. for (int i = 0; i < BUFFSIZE; i++) {
  29. rawBuff[i] = notHighBuff[i] = lowBuff[i] = 512;
  30. }
  31. }
  32. void loop() {
  33. rawBuff[index] = analogRead(MICPIN);
  34. notHighBuff[index] = 0;
  35. int nextIndex = (index + 1) % BUFFSIZE;
  36. for (int i = nextIndex + BUFFSIZE - AVGSIZE; i % BUFFSIZE != nextIndex; i++) {
  37. notHighBuff[index] += rawBuff[i % BUFFSIZE];
  38. }
  39. notHighBuff[index] /= AVGSIZE;
  40. lowBuff[index] = (notHighBuff[index] + notHighBuff[(index + BUFFSIZE - AVGSIZE) % BUFFSIZE]) / 2;
  41. minLow = minMid = minHigh = 1024;
  42. maxLow = maxMid = maxHigh = -1;
  43. for (int i = 0; i < BUFFSIZE; i++) {
  44. minLow = min(minLow, RAWLOW(i));
  45. minMid = min(minMid, RAWMID(i));
  46. minHigh = min(minHigh, RAWHIGH(i));
  47. maxLow = max(maxLow, RAWLOW(i));
  48. maxMid = max(maxMid, RAWMID(i));
  49. maxHigh = max(maxHigh, RAWHIGH(i));
  50. }
  51. strip.setPixelColor(0, strip.Color(NORMHIGH(index), NORMMID(index), NORMLOW(index)));
  52. strip.show();
  53. index = nextIndex;
  54. };