|

楼主 |
发表于 2021-12-14 20:40
|
显示全部楼层
【花雕动手做】有趣好玩的音乐可视化系列小项目(10)---WS2812硬板屏
项目之一:使用Adafruit_NeoPixel库的音乐可视化多彩节奏灯
实验开源代码
- /*
- 【花雕动手做】有趣好玩的音乐可视化系列小项目(10)---WS2812硬板屏
- 项目之一:使用Adafruit_NeoPixel库的音乐可视化多彩节奏灯
- */
- #include <Adafruit_NeoPixel.h>
- #define MIC A0 // 麦克风与A0相连接
- #define LED_PIN 6 // LED are connected to D6
- #define N_PIXELS 16 // Number of LED
- #define N 100 //样本数
- #define fadeDelay 10 // 淡出量
- #define noiseLevel 40 // 降噪下限
- Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);
- int samples[N]; // 存储样本
- int periodFactor = 0; // 用于周期计算
- int t1 = -1;
- int T;
- int slope;
- byte periodChanged = 0;
- void setup() {
- // Serial.begin(9600);
- strip.begin();
- ledsOff();
- delay(500);
- displayColor(Wheel(100));
- strip.show();
- delay(500);
- }
- void loop() {
- Samples();
- }
- void Samples() {
- for (int i = 0; i < N; i++) {
- samples[i] = analogRead(0);
- if (i > 0) {
- slope = samples[i] - samples[i - 1];
- }
- else {
- slope = samples[i] - samples[N - 1];
- }
- if (abs(slope) > noiseLevel) {
- if (slope < 0) {
- calculatePeriod(i);
- if (periodChanged == 1) {
- displayColor(getColor(T));
- }
- }
- }
- else {
- ledsOff();
- }
- periodFactor += 1;
- delay(1);
- }
- }
- void calculatePeriod(int i) {
- if (t1 == -1) {
- t1 = i;
- }
- else {
- int period = periodFactor * (i - t1);
- periodChanged = T == period ? 0 : 1;
- T = period;
- // Serial.println(T);
- t1 = i;
- periodFactor = 0;
- }
- }
- uint32_t getColor(int period) {
- if (period == -1)
- return Wheel(0);
- else if (period > 400)
- return Wheel(5);
- else
- return Wheel(map(-1 * period, -400, -1, 50, 255));
- }
- void fadeOut()
- {
- for (int i = 0; i < 5; i++) {
- strip.setBrightness(110 - i * 20);
- strip.show(); // Update strip
- delay(fadeDelay);
- periodFactor += fadeDelay;
- }
- }
- void fadeIn() {
- strip.setBrightness(100);
- strip.show();
- for (int i = 0; i < 5; i++) {
- //strip.setBrightness(20*i + 30);
- //strip.show();
- delay(fadeDelay);
- periodFactor += fadeDelay;
- }
- }
- void ledsOff() {
- fadeOut();
- for (int i = 0; i < N_PIXELS; i++) {
- strip.setPixelColor(i, 0, 0, 0);
- }
- }
- void displayColor(uint32_t color) {
- for (int i = 0; i < N_PIXELS; i++) {
- strip.setPixelColor(i, color);
- }
- fadeIn();
- }
- uint32_t Wheel(byte WheelPos) {
- // Serial.println(WheelPos);
- if (WheelPos < 85) {
- return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
- }
- else if (WheelPos < 170) {
- WheelPos -= 85;
- return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
- }
- else {
- WheelPos -= 170;
- return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
- }
- }
复制代码
|
|