Paso 6: El código.
Este código fue proporcionado por Adafruit para su LED Ampli-corbata. He cambiado algunas cosas para mi proyecto./*
LED VU-metro para Arduino y LEDs de NeoPixel Adafruit.
Requisitos de hardware:
-La mayoría Arduino Arduino-compatible con tablas o (ATmega 328p o mejor).
-Amplificador de micrófono Electret Adafruit (ID: 1063)
-Adafruit Flora RGB inteligente de píxeles (ID: 1260)
O
-Tira LED Digital de NeoPixel Adafruit (ID: 1138)
-Opcional: batería para uso portátil (más energía a través de USB o adaptador)
Requisitos de software:
-Biblioteca Adafruit NeoPixel
Conexiones:
-3.3V al amplificador de mic +
-Toma de tierra para amplificador de mic-
-Pin analógico a la salida del micrófono (configurable por debajo)
-Pin digital para entrada de datos del LED (configurable por debajo)
Ver notas en setup() respecto a 5V y 3.3V juntas - puede haber un
conexión adicional para hacer y una línea de código para activar o desactivar.
Escrito por Adafruit Industries. Distribuido bajo la licencia BSD.
Este apartado debe incluirse en cualquier redistribución.
*/
#include < Adafruit_NeoPixel.h >
#define N_PIXELS 30 / / número de píxeles en filamento
#define MIC_PIN A5 / / micrófono está conectado a este pin analógico
#define LED_PIN 6 / filamento de NeoPixel LED está conectado a este pin
#define DC_OFFSET 0 / / DC offset en señal de mic - si unusure, deja 0
#define ruido 20 / / zumbido/ruido/interferencia en señal de micrófono
#define 40 muestras / / longitud del búfer para el ajuste dinámico del nivel de
#define superior (N_PIXELS + 2) / / permitir a punto ir un poco fuera de escala
#define PEAK_FALL 60 / / tasa de pico cayendo punto
bytes
pico = 0, / usa para punto cae
dotCount = 0, / / marco contador para retrasar la velocidad de caída por el punto
volCount = 0; Contador para almacenar los últimos datos del volumen
int
Vol [muestras], / / colección de muestras de volumen previa
LVL = 20 / / corriente "humedecido" nivel de audio
minLvlAvg = 0, / / para el ajuste dinámico del gráfico baja y alta
maxLvlAvg = 512;
Adafruit_NeoPixel
tira = Adafruit_NeoPixel (N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {}
Esto es necesario sólo en 5V Arduinos (ONU, Leonardo, etc.).
Conectar 3, 3V al mic y a AREF en ARDUINO y habilitar esta
línea. Muestras de audio son 'limpiador' a 3.3V.
COMENTE ESTA LÍNEA DE 3.3V ARDUINOS (FLORA, ETC.):
analogReference(EXTERNAL);
memset (vol, 0, sizeof(vol));
Strip.Begin();
}
void loop() {}
uint8_t.
uint16_t minLvl, maxLvl;
int n, altura;
n = analogRead(MIC_PIN); Primas de mic
n = abs (n - 512 - DC_OFFSET); Centro en el cero
¿n = (n < = ruido)? 0: (n - ruido); Sacar ruido/zumbido
LVL = ((lvl * 7) + n) >> 3. "Humedecido" lectura (otro aspecto de TICs)
Calcular altura mín/máx dinámica niveles (punto fijo) de la barra:
altura = superior * (lvl - minLvlAvg) / (largo) (maxLvlAvg - minLvlAvg);
Si (< 0L) altura = 0; Clip salida
otra cosa if(height > TOP) altura = superior;
if(height > Peak) pico = altura; Mantener punto de 'pico' en la parte superior
Pixeles de color basados en degradado de arco iris
para (i = 0; i < N_PIXELS; i ++) {}
Si (i > = altura) strip.setPixelColor (i, 0, 0, 0);
strip.setPixelColor(i,Wheel(map(i,0,strip.numPixels()-1,30,150))) otra cosa;
}
Dibujar punto pico
Si (pico > 0 & & pico < = N_PIXELS-1) strip.setPixelColor(peak,Wheel(map(peak,0,strip.numPixels()-1,30,150)));
Strip.Show(); Tira de actualización
Cada pocos marcos, hacer el pixel pico caer por 1:
Si (++ dotCount > = PEAK_FALL) {//fall tasa
Si pico (pico > 0)--;
dotCount = 0;
}
Vol [volCount] = n; Guardar muestra para nivelación dinámica
Si (++ volCount > = muestras) volCount = 0; Contador de avance/rollover muestra
Obtener rango de fotogramas anteriores
minLvl = maxLvl = vol [0];
para (i = 1; i < muestras; i ++) {}
Si (vol [i] < minLvl) minLvl = vol [i];
else if (vol [i] > maxLvl) maxLvl = vol [i];
}
minLvl y maxLvl indican el rango de volumen sobre marcos previos, utilizados
para escalar verticalmente la gráfica de salida (por lo que parece interesante
independientemente del nivel de volumen). Si están demasiado juntos aunque
(por ejemplo a niveles muy bajos) el gráfico se convierte en súper grueso
y 'nerviosos'... así que mantenga cierta distancia mínima entre ellos (esto
también permite el gráfico va a cero cuando no se reproduce sonido):
Si ((maxLvl-minLvl) < TOP) maxLvl = minLvl + tapa;
minLvlAvg = (minLvlAvg * 63 + minLvl) >> 6; Reducir niveles de min/max
maxLvlAvg = (maxLvlAvg * 63 + maxLvl) >> 6; (falso media acumulada)
}
Un valor de 0 a 255, para obtener un valor de color de entrada.
Los colores son una transición r - g - b - a r.
uint32_t rueda (bytes WheelPos) {}
if(WheelPos < 85) {}
volver la tira. Color (WheelPos * 3, 255 - WheelPos * 3, 0);
} else if(WheelPos < 170) {}
WheelPos-= 85;
volver la tira. Color (255 - WheelPos * 3, 0, WheelPos * 3);
} else {}
WheelPos-= 170;
volver la tira. Color (0, WheelPos * 3, 255 - WheelPos * 3);
}
}