#include #ifdef __AVR__ #include #endif #define NUMLEDS 1 #define LEDPIN 8 #define MICPIN A9 #define FAKEVCCPIN 6 Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMLEDS, LEDPIN, NEO_GRB + NEO_KHZ800); #define BUFFSIZE 115 #define AVGSIZE 23 int rawBuff[BUFFSIZE]; int notHighBuff[BUFFSIZE]; int lowBuff[BUFFSIZE]; int index, minLow, maxLow, minMid, maxMid, minHigh, maxHigh; #define RAWLOW(i) (lowBuff[i]) #define RAWMID(i) (notHighBuff[i]-lowBuff[i]) #define RAWHIGH(i) (rawBuff[i]-notHighBuff[i]) #define NORMLOW(i) constrain(map(RAWLOW(i), minLow, maxLow, 0, 255), 0, 255) #define NORMMID(i) constrain(map(RAWMID(i), minMid, maxMid, 0, 255), 0, 255) #define NORMHIGH(i) constrain(map(RAWHIGH(i), minHigh, maxHigh, 0, 255), 0, 255) void setup() { pinMode(FAKEVCCPIN, OUTPUT); digitalWrite(FAKEVCCPIN, HIGH); index = 0; strip.begin(); strip.show(); // Initialize all pixels to 'off' for (int i = 0; i < BUFFSIZE; i++) { rawBuff[i] = notHighBuff[i] = lowBuff[i] = 512; } } void loop() { rawBuff[index] = analogRead(MICPIN); notHighBuff[index] = 0; int nextIndex = (index + 1) % BUFFSIZE; for (int i = nextIndex + BUFFSIZE - AVGSIZE; i % BUFFSIZE != nextIndex; i++) { notHighBuff[index] += rawBuff[i % BUFFSIZE]; } notHighBuff[index] /= AVGSIZE; lowBuff[index] = (notHighBuff[index] + notHighBuff[(index + BUFFSIZE - AVGSIZE) % BUFFSIZE]) / 2; minLow = minMid = minHigh = 1024; maxLow = maxMid = maxHigh = -1; for (int i = 0; i < BUFFSIZE; i++) { minLow = min(minLow, RAWLOW(i)); minMid = min(minMid, RAWMID(i)); minHigh = min(minHigh, RAWHIGH(i)); maxLow = max(maxLow, RAWLOW(i)); maxMid = max(maxMid, RAWMID(i)); maxHigh = max(maxHigh, RAWHIGH(i)); } strip.setPixelColor(0, strip.Color(NORMHIGH(index), NORMMID(index), NORMLOW(index))); strip.show(); index = nextIndex; };