驴友花雕 发表于 2022-10-23 21:22:10




驴友花雕 发表于 2022-10-23 21:32:27

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十四:WS2812B全彩RGB像素屏 8x32点阵LED显示屏 硬屏模块
项目程序十八:应用Adafruit_NeoPixel库的入门极简程序

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十四:WS2812B全彩RGB像素屏 8x32点阵LED显示屏 硬屏模块
项目程序十八:应用Adafruit_NeoPixel库的入门极简程序
*/

#include <Adafruit_NeoPixel.h>
#define PIN      6 //接脚
#define NUMPIXELS 256 //数量
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define DELAYVAL 100 //延时

void setup() {
pixels.setBrightness(22);//亮度
pixels.begin();//启动
}

void loop() {
pixels.clear();
for (int i = 0; i < NUMPIXELS; i++) {
    pixels.setPixelColor(i, pixels.Color(50, 250, 0));
    pixels.show();
    delay(2);
}
}

驴友花雕 发表于 2022-10-24 07:10:02

实验场景图



驴友花雕 发表于 2022-10-24 08:03:37

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十四:WS2812B全彩RGB像素屏 8x32点阵LED显示屏 硬屏模块
项目程序十九:FHT音乐反应256位动态频谱灯

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十四:WS2812B全彩RGB像素屏 8x32点阵LED显示屏 硬屏模块
项目程序十九:FHT音乐反应256位动态频谱灯
*/

#include "FastLED.h"

#define OCTAVE 1 //   // Group buckets into octaves(use the log output function LOG_OUT 1)
#define OCT_NORM 0 // Don't normalise octave intensities by number of bins
#define FHT_N 256 // set to 256 point fht
#include <FHT.h> // include the library
//int noise[] = {204,188,68,73,150,98,88,68}; // noise level determined by playing pink noise and seeing levels {204,188,68,73,150,98,88,68}


// int noise[] = {204,190,108,85,65,65,55,60}; // noise for mega adk
int noise[] = {204, 195, 100, 90, 85, 80, 75, 75}; // noise for NANO
//int noise[] = {204,198,100,85,85,80,80,80};
float noise_fact[] = {15, 7, 1.5, 1, 1.2, 1.4, 1.7, 3}; // noise level determined by playing pink noise and seeing levels {204,188,68,73,150,98,88,68}
float noise_fact_adj[] = {15, 7, 1.5, 1, 1.2, 1.4, 1.7, 3}; // noise level determined by playing pink noise and seeing levels {204,188,68,73,150,98,88,68}


#define LED_PIN   6
#define LED_TYPE    WS2812
#define COLOR_ORDER GRB


// Params for width and height
const uint8_t kMatrixWidth = 8;
const uint8_t kMatrixHeight = 32;//----------was 27
//#define NUM_LEDS (kMatrixWidth * kMatrixHeight)
#define NUM_LEDS    256

CRGB leds;

int counter2 = 0;



void setup() {
Serial.begin(9600);
delay(1000);
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );

FastLED.setBrightness (133);
fill_solid(leds, NUM_LEDS, CRGB::Black);
FastLED.show();
// TIMSK0 = 0; // turn off timer0 for lower jitter
ADCSRA = 0xe5; // set the adc to free running mode
ADMUX = 0x40; // use adc0
DIDR0 = 0x01; // turn off the digital input for adc0

}




void loop() {
int prev_j;
int beat = 0;
int prev_oct_j;
int counter = 0;
int prev_beat = 0;
int led_index = 0;
int saturation = 0;
int saturation_prev = 0;
int brightness = 0;
int brightness_prev = 0;

while (1) { // reduces jitter

    cli();// UDRE interrupt slows this way down on arduino1.0

    for (int i = 0 ; i < FHT_N ; i++) { // save 256 samples
      while (!(ADCSRA & 0x10)); // wait for adc to be ready
      ADCSRA = 0xf5; // restart adc
      byte m = ADCL; // fetch adc data
      byte j = ADCH;
      int k = (j << 8) | m; // form into an int
      k -= 0x0200; // form into a signed int
      k <<= 6; // form into a 16b signed int
      fht_input = k; // put real data into bins
    }
    fht_window(); // window the data for better frequency response
    fht_reorder(); // reorder the data before doing the fht
    fht_run(); // process the data in the fht
    fht_mag_octave(); // take the output of the fhtfht_mag_log()

    // every 50th loop, adjust the volume accourding to the value on A2 (Pot)
    if (counter >= 50) {
      ADMUX = 0x40 | (1 & 0x07); // set admux to look at Analogpin A1 - Master Volume


      while (!(ADCSRA & 0x10)); // wait for adc to be ready
      ADCSRA = 0xf5; // restart adc
      delay(10);
      while (!(ADCSRA & 0x10)); // wait for adc to be ready
      ADCSRA = 0xf5; // restart adc
      byte m = ADCL; // fetch adc data
      byte j = ADCH;
      int k = (j << 8) | m; // form into an int
      float master_volume = (k + 0.1) / 1000 + .75; // so the valu will be between ~0.5 and 1.---------------------+.75 was .5
      Serial.println (master_volume);


      for (int i = 1; i < 8; i++) {
      noise_fact_adj = noise_fact * master_volume;
      }

      ADMUX = 0x40 | (0 & 0x07); // set admux back to look at A0 analog pin (to read the microphone input
      counter = 0;
    }

    sei();
    counter++;


    // End of Fourier Transform code - output is stored in fht_oct_out.

    // i=0-7 frequency (octave) bins (don't use 0 or 1), fht_oct_out= amplitude of frequency for bin 1
    // for loop a) removes background noise average and takes absolute value b) low / high pass filter as still very noisy
    // c) maps amplitude of octave to a colour between blue and red d) sets pixel colour to amplitude of each frequency (octave)

    for (int i = 1; i < 8; i++) {// goes through each octave. skip the first 1, which is not useful

      int j;
      j = (fht_oct_out - noise); // take the pink noise average level out, take the asbolute value to avoid negative numbers
      if (j < 10) {
      j = 0;
      }
      j = j * noise_fact_adj;

      if (j < 10) {
      j = 0;
      }
      else {
      j = j * noise_fact_adj;
      if (j > 180) {
          if (i >= 7) {
            beat += 2;
          }
          else {
            beat += 1;
          }
      }
      j = j / 30;
      j = j * 30; // (force it to more discrete values)
      }

      prev_j = j;

      //   Serial.print(j);
      //   Serial.print(" ");


      // this fills in 11 LED's with interpolated values between each of the 8 OCT values
      if (i >= 2) {
      led_index = 2 * i - 3;
      prev_oct_j = (j + prev_j) / 2;

      saturation = constrain(j + 50, 0, 255); //-----------50 was 30
      saturation_prev = constrain(prev_oct_j + 50, 0, 255);
      brightness = constrain(j, 0, 255);
      brightness_prev = constrain(prev_oct_j, 0, 255);
      if (brightness == 255) {
          saturation = 50;
          brightness = 200;
      }
      if (brightness_prev == 255) {
          saturation_prev = 50;
          brightness_prev = 200;
      }


      for (uint8_t y = 0; y < kMatrixHeight; y++) {
          leds = CHSV(j + y * 30, saturation, brightness);
          if (i > 2) {
            prev_oct_j = (j + prev_j) / 2;
            leds[ XY(led_index - 2, y)] = CHSV(prev_oct_j + y * 30, saturation_prev, brightness_prev);
          }
      }
      }
    }



    if (beat >= 7) {
      fill_solid(leds, NUM_LEDS, CRGB::Gray);
      FastLED.setBrightness(200);



    }
    else {
      if (prev_beat != beat) {
      FastLED.setBrightness(40 + beat * beat * 5);
      prev_beat = beat;
      }

    }

    FastLED.show();
    if (beat) {
      counter2 += ((beat + 4) / 2 - 2);
      if (counter2 < 0) {
      counter2 = 1000;
      }
      if (beat > 3 && beat < 7) {
      FastLED.delay (20);
      }
      beat = 0;
    }

    // Serial.println();
}
}



// Param for different pixel layouts
const bool    kMatrixSerpentineLayout = false;
// Set 'kMatrixSerpentineLayout' to false if your pixels are
// laid out all running the same way, like this:

// Set 'kMatrixSerpentineLayout' to true if your pixels are
// laid out back-and-forth, like this:

uint16_t XY( uint8_t x, uint8_t y)
{
uint16_t i;

if ( kMatrixSerpentineLayout == false) {
    i = (y * kMatrixWidth) + x;
}

if ( kMatrixSerpentineLayout == true) {
    if ( y & 0x01) {
      // Odd rows run backwards
      uint8_t reverseX = (kMatrixWidth - 1) - x;
      i = (y * kMatrixWidth) + reverseX;

    } else {
      // Even rows run forwards
      i = (y * kMatrixWidth) + x;

    }
}

i = (i + counter2) % NUM_LEDS;
return i;
}

驴友花雕 发表于 2022-10-24 09:26:36

实验场景图动态图



驴友花雕 发表于 2022-10-24 09:33:24

实验的视频记录
优酷:https://v.youku.com/v_show/id_XNTkxMjYwODI2NA==.html?spm=a2hcb.playlsit.page.1
B站:https://www.bilibili.com/video/BV1FG411j7Vr/?vd_source=98c6b1fc23b2787403d97f8d3cc0b7e5

https://v.youku.com/v_show/id_XNTkxMjYwODI2NA==.html?spm=a2hcb.playlsit.page.1

驴友花雕 发表于 2022-10-27 10:21:35

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十四:WS2812B全彩RGB像素屏 8x32点阵LED显示屏 硬屏模块
项目程序二十:Arduino 和 FastLED多彩音乐灯

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十四:WS2812B全彩RGB像素屏 8x32点阵LED显示屏 硬屏模块
项目程序二十:Arduino 和 FastLED多彩音乐灯
*/

#include <FastLED.h>
#define SAMPLEPERIODUS 200
#define MIC_PIN A0
#define LED_DT 6
#define COLOR_ORDER GRB
#define LED_TYPE WS2812
#define NUM_LEDS 256
uint8_t max_bright = 33;
struct CRGB leds;
CRGBPalette16 currentPalette = RainbowColors_p;
CRGBPalette16 targetPalette;

void setup() {
pinMode(LED_BUILTIN, OUTPUT);
LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(max_bright);
}

float bassFilter(float sample) {
static float xv = {0, 0, 0}, yv = {0, 0, 0};
xv = xv; xv = xv;
xv = sample / 9.1f;
yv = yv; yv = yv;
yv = (xv - xv) + (-0.7960060012f * yv) + (1.7903124146f * yv);
return yv;
}

float envelopeFilter(float sample) {
static float xv = {0, 0}, yv = {0, 0};
xv = xv;
xv = sample / 160.f;
yv = yv;
yv = (xv + xv) + (0.9875119299f * yv);
return yv;
}

float beatFilter(float sample) {
static float xv = {0, 0, 0}, yv = {0, 0, 0};
xv = xv; xv = xv;
xv = sample / 7.015f;
yv = yv; yv = yv;
yv = (xv - xv) + (-0.7169861741f * yv) + (1.4453653501f * yv);
return yv;
}

void loop() {
unsigned long time = micros();
float sample, value, envelope, beat, thresh, micLev;
for (uint8_t i = 0; ; ++i) {
    sample = (float)analogRead(MIC_PIN);
    micLev = ((micLev * 67) + sample) / 68;
    sample -= micLev;
    value = bassFilter(sample);
    value = abs(value);
    envelope = envelopeFilter(value);
    if (i == 200) {
      beat = beatFilter(envelope);
      thresh = 0.02f * 75.;

      if (beat > thresh) {
      digitalWrite(LED_BUILTIN, LOW);

      int strt = random8(NUM_LEDS / 2);
      int ende = strt + random8(NUM_LEDS / 2);
      for (int i = strt; i < ende; i++) {
          uint8_t index = inoise8(i * 30, millis() + i * 30);
          leds = ColorFromPalette(currentPalette, index, 255, LINEARBLEND);
      }
      } else {
      digitalWrite(LED_BUILTIN, HIGH);
      }
      i = 0;
    }

    EVERY_N_SECONDS(5) {
      uint8_t baseC = random8();
      targetPalette = CRGBPalette16(CHSV(baseC + random8(32), 255, random8(128, 255)),
                                    CHSV(baseC + random8(64), 255, random8(128, 255)),
                                    CHSV(baseC + random8(64), 192, random8(128, 255)),
                                    CHSV(baseC + random8(),   255, random8(128, 255)));
    }

    EVERY_N_MILLISECONDS(50) {
      uint8_t maxChanges = 24;
      nblendPaletteTowardPalette(currentPalette, targetPalette, maxChanges);
    }

    EVERY_N_MILLIS(50) {
      fadeToBlackBy(leds, NUM_LEDS, 64);
      FastLED.show();
    }

    for (unsigned long up = time + SAMPLEPERIODUS; time > 20 && time < up; time = micros()) {}

} // for i
} // loop()

驴友花雕 发表于 2022-10-27 10:24:13

实验的视频记录
优酷:
B站:https://www.bilibili.com/video/BV1L14y157PU/?vd_source=98c6b1fc23b2787403d97f8d3cc0b7e5

https://www.bilibili.com/video/BV1L14y157PU/?vd_source=98c6b1fc23b2787403d97f8d3cc0b7e5

驴友花雕 发表于 2022-10-27 19:51:05

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十四:WS2812B全彩RGB像素屏 8x32点阵LED显示屏 硬屏模块
项目程序二十一:通过快速傅里叶变换在8*32灯板上显示频谱

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十四:WS2812B全彩RGB像素屏 8x32点阵LED显示屏 硬屏模块
项目程序二十一:通过快速傅里叶变换在8*32灯板上显示频谱
*/

#include"arduinoFFT.h"
#include <FastLED.h>   

#define NUM_LEDS 256   
#define LED_TYPE WS2812
#define COLOR_ORDER GRB

arduinoFFT FFT = arduinoFFT();
CRGB leds;         

#define CHANNEL A0
#define DATA_PIN 6

const uint8_t max_bright = 2;         
const uint16_t samples = NUM_LEDS / 4;
const byte halfsamples = samples / 2;
uint8_t gHue;                        
int value;                           
double vReal;               
double vImag;               
char toData;            

int pointJump;
int uJump;   
int dJump;   

int uValue;               
int dValue;               
int tValue;               
int toDown = 0;            
uint8_t toDownSpeed = 3;   
int pointDown = 0;         
uint8_t pointDownSpeed = 9;

void setup(){
delay(100);            
Serial.println("Ready");
FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(max_bright);
}

void loop(){
FastLED.clear();                        
EVERY_N_MILLISECONDS(10) {
    gHue += 10;
}
for (int i = 0; i < samples; i++)      
{
    value = analogRead(CHANNEL);
    vReal = value;      
    vImag = 0.0;         
}

FFT.Windowing(vReal, samples, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
FFT.Compute(vReal, vImag, samples, FFT_FORWARD);
FFT.ComplexToMagnitude(vReal, vImag, samples);

for (int i = 0; i < halfsamples; i++)
{
    toData = vReal;   
    toData = constrain(toData, 0, 100);
    toData = map(toData, 0, 100, 1, 7);
}
for (int i = 0; i < halfsamples; i++)
{
    uValue = toData;   
    uJump++;            
    if (uValue > uJump)
    {
      uValue = uJump;
    }
    else
    {
      uJump = uValue;
    }
    dValue = uValue;
    toDown++;                     
    if (toDown % toDownSpeed == 0)
    {
      dJump--;
      toDown = 0;
    }
    if (dValue > pointJump)
    {
      dJump = dValue;
    }
    else
    {
      dValue = dJump;
    }
    tValue = uValue;                     
    pointDown++;                        
    if (pointDown % pointDownSpeed == 0)
    {
      pointJump--;
      pointDown = 0;
    }
    if (tValue > pointJump)
    {
      pointJump = tValue;
    }
    else
    {
      tValue = pointJump;
    }
    fill_rainbow(leds + 8 * i, uValue, gHue, 30);
    fill_rainbow(leds + 8 * i, dValue, gHue, 30);
    fill_solid(leds + 8 * i + tValue, 1, CRGB::White);
   
}
FastLED.show();
delay(10);      
}

驴友花雕 发表于 2022-10-27 19:55:30

实验场景图动态图



驴友花雕 发表于 2022-10-27 20:03:59

实验的视频记录
优酷:
B站:https://www.bilibili.com/video/BV1ge4y127bD/?vd_source=98c6b1fc23b2787403d97f8d3cc0b7e5

https://www.bilibili.com/video/BV1ge4y127bD/?vd_source=98c6b1fc23b2787403d97f8d3cc0b7e5

驴友花雕 发表于 2022-10-27 20:05:29

实验场景图



页: 1 2 3 [4]
查看完整版本: 【Arduino】168种传感器系列实验(214)---8x32位全彩WS2812B屏