云天 发表于 2022-9-25 13:39:52

自发电无线开关(三)炫彩灯环开关

本帖最后由 云天 于 2022-10-2 19:52 编辑



【项目设计】
使用自发电无线开关,控制变换灯环炫彩效果。
【硬件】
主板使用Arduino,灯环为93灯/6环 WS2812B RGB 圆环灯。

【fastled库】
FastLED 是一款功能强大,简单易用的控制WS2812, LPD8806, 等LED光带的Arduino第三方库。 目前FastLED是公认的Arduino开发者应用最为广泛的LED控制库之一。下载地址:https://github.com/FastLED/FastLED/releases
【库安装】
使用“加载库”,加载库文件“FastLED-3.5.0.zip”。

【测试】
1、点亮一个灯,灯环接12引脚。
#include <FastLED.h>
#define NUM_LEDS 1
#define DATA_PIN 12
#define CLOCK_PIN 13
CRGB leds;
void setup() {
    FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);// GRB ordering is assumed
}
void loop() {
leds = CRGB::Red;
FastLED.show();
delay(500);
leds = CRGB::Black;
FastLED.show();
delay(500);
}2、同时点亮两个灯环,两灯环分别接12,11引脚。
#define DATA_PIN1    12
#define DATA_PIN2    11
void setup() {

FastLED.addLeds<LED_TYPE,DATA_PIN1,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.addLeds<LED_TYPE,DATA_PIN2,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
}【制作灯盒】






【程序代码】

#include <FastLED.h>

FASTLED_USING_NAMESPACE

#define DATA_PIN1    12
#define DATA_PIN2    11
//#define CLK_PIN   4
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
#define NUM_LEDS    93
CRGB leds;

#define BRIGHTNESS          96
#define FRAMES_PER_SECOND120
CRGBPalette16 gPal;
bool gReverseDirection = false;
int bs;
void setup() {
bs=0;
delay(3000); // 3 second delay for recovery
gPal = HeatColors_p;

FastLED.addLeds<LED_TYPE,DATA_PIN1,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.addLeds<LED_TYPE,DATA_PIN2,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);

FastLED.setBrightness(BRIGHTNESS);
}

typedef void (*SimplePatternList[])();
SimplePatternList gPatterns = { rainbow, rainbowWithGlitter, confetti, sinelon, juggle, bpm };

uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current
uint8_t gHue = 0; // rotating "base color" used by many of the patterns

void loop()
{
   if (digitalRead(4)) {
    bs += 1;
    if(bs==3){
      bs=0;
    }
    delay(3000);
}
if(bs==0){
    random16_add_entropy( random());
    Fire2012WithPalette(); // run simulation frame, using palette colors
}
if(bs==1){
    pride();
}
if(bs==2){
   gPatterns();
}

FastLED.show();

FastLED.delay(1000/FRAMES_PER_SECOND);
   

EVERY_N_MILLISECONDS( 20 ) { gHue++; } // slowly cycle the "base color" through the rainbow
EVERY_N_SECONDS( 10 ) { nextPattern(); } // change patterns periodically
}

#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)))

void nextPattern()
{

gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns);
}

void rainbow()
{

fill_rainbow( leds, NUM_LEDS, gHue, 7);
}

void rainbowWithGlitter()
{

rainbow();
addGlitter(80);
}

void addGlitter( fract8 chanceOfGlitter)
{
if( random8() < chanceOfGlitter) {
    leds[ random16(NUM_LEDS) ] += CRGB::White;
}
}

void confetti()
{

fadeToBlackBy( leds, NUM_LEDS, 10);
int pos = random16(NUM_LEDS);
leds += CHSV( gHue + random8(64), 200, 255);
}

void sinelon()
{

fadeToBlackBy( leds, NUM_LEDS, 20);
int pos = beatsin16( 13, 0, NUM_LEDS-1 );
leds += CHSV( gHue, 255, 192);
}

void bpm()
{

uint8_t BeatsPerMinute = 62;
CRGBPalette16 palette = PartyColors_p;
uint8_t beat = beatsin8( BeatsPerMinute, 64, 255);
for( int i = 0; i < NUM_LEDS; i++) { //9948
    leds = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10));
}
}

void juggle() {

fadeToBlackBy( leds, NUM_LEDS, 20);
uint8_t dothue = 0;
for( int i = 0; i < 8; i++) {
    leds |= CHSV(dothue, 200, 255);
    dothue += 32;
}
}
void pride()
{
static uint16_t sPseudotime = 0;
static uint16_t sLastMillis = 0;
static uint16_t sHue16 = 0;

uint8_t sat8 = beatsin88( 87, 220, 250);
uint8_t brightdepth = beatsin88( 341, 96, 224);
uint16_t brightnessthetainc16 = beatsin88( 203, (25 * 256), (40 * 256));
uint8_t msmultiplier = beatsin88(147, 23, 60);

uint16_t hue16 = sHue16;//gHue * 256;
uint16_t hueinc16 = beatsin88(113, 1, 3000);

uint16_t ms = millis();
uint16_t deltams = ms - sLastMillis ;
sLastMillis= ms;
sPseudotime += deltams * msmultiplier;
sHue16 += deltams * beatsin88( 400, 5,9);
uint16_t brightnesstheta16 = sPseudotime;

for( uint16_t i = 0 ; i < NUM_LEDS; i++) {
    hue16 += hueinc16;
    uint8_t hue8 = hue16 / 256;

    brightnesstheta16+= brightnessthetainc16;
    uint16_t b16 = sin16( brightnesstheta16) + 32768;

    uint16_t bri16 = (uint32_t)((uint32_t)b16 * (uint32_t)b16) / 65536;
    uint8_t bri8 = (uint32_t)(((uint32_t)bri16) * brightdepth) / 65536;
    bri8 += (255 - brightdepth);
   
    CRGB newcolor = CHSV( hue8, sat8, bri8);
   
    uint16_t pixelnumber = i;
    pixelnumber = (NUM_LEDS-1) - pixelnumber;
   
    nblend( leds, newcolor, 64);
}
}
#define COOLING55

#define SPARKING 120


void Fire2012WithPalette()
{

static uint8_t heat;


    for( int i = 0; i < NUM_LEDS; i++) {
      heat = qsub8( heat,random8(0, ((COOLING * 10) / NUM_LEDS) + 2));
    }


    for( int k= NUM_LEDS - 1; k >= 2; k--) {
      heat = (heat + heat + heat ) / 3;
    }
   

    if( random8() < SPARKING ) {
      int y = random8(7);
      heat = qadd8( heat, random8(160,255) );
    }


    for( int j = 0; j < NUM_LEDS; j++) {

      uint8_t colorindex = scale8( heat, 240);
      CRGB color = ColorFromPalette( gPal, colorindex);
      int pixelnumber;
      if( gReverseDirection ) {
      pixelnumber = (NUM_LEDS-1) - j;
      } else {
      pixelnumber = j;
      }
      leds = color;
    }
}



【演示视频】
https://www.bilibili.com/video/BV1Ag411e78n?share_source=copy_web
页: [1]
查看完整版本: 自发电无线开关(三)炫彩灯环开关