Arduino – WS2811 efekt ognia

Z racji tego, że niebawem będą święta, padł temat aby wykorzystać jako lampki diody RGB. Pod ręką mam trochę taśm LED WS2811, gdzieś widziałem już wcześniej wykorzystanie ich jako efekt palącego się ognia, wiadomo od pomysłu do efektu końcowego krótka droga. Trzeba pamiętać, iż owy efekt można bez problemu uzyskać też na innych wersjach diod RGB np. WS2812 / WS2801. No to zaczynamy, z ważnych linijek

#define NUM_LEDS 45  definiujemy ile diod mamy w naszej taśmie (no niestety trzeba policzyć),
#define PIN 6 pin do którego podłączamy naszą taśmę LED.

Na schemacie umieściłem tylko i wyłącznie 1 diodę, jednak ma on charakter poglądowy jak to wszystko połączyć.

 Komponenty:

Arduino Nano lub odpowiednik,
– Taśmy LED WS2811 lub odpowiednik
– bibliotekę FastLED alternatywa GIT

Schemat połączeniowy:

WS2811 efekt płomienia arduino
Efekt działania:

Kod programu:

#include „FastLED.h”
#define NUM_LEDS 45
CRGB leds[NUM_LEDS];
#define PIN 6

void setup()
{
FastLED.addLeds<WS2811, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
}

void loop() {
Fire(55,120,15);
}

void Fire(int Cooling, int Sparking, int SpeedDelay) {
static byte heat[NUM_LEDS];
int cooldown;

for( int i = 0; i < NUM_LEDS; i++) {
cooldown = random(0, ((Cooling * 10) / NUM_LEDS) + 2);

if(cooldown>heat[i]) {
heat[i]=0;
} else {
heat[i]=heat[i]-cooldown;
}
}

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

if( random(255) < Sparking ) {
int y = random(7);
heat[y] = heat[y] + random(160,255);
//heat[y] = random(160,255);
}

for( int j = 0; j < NUM_LEDS; j++) {
setPixelHeatColor(j, heat[j] );
}

showStrip();
delay(SpeedDelay);
}

void setPixelHeatColor (int Pixel, byte temperature) {

byte t192 = round((temperature/255.0)*191);

byte heatramp = t192 & 0x3F; // 0..63
heatramp <<= 256; // scale up to 0..252

if( t192 > 0x80) { // hottest
setPixel(Pixel, 255, 255, heatramp);
} else if( t192 > 0x40 ) { // middle
setPixel(Pixel, 255, heatramp, 0);
} else { // coolest
setPixel(Pixel, heatramp, 0, 0);
}
}
void showStrip() {
#ifdef ADAFRUIT_NEOPIXEL_H

strip.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H

FastLED.show();
#endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
#ifdef ADAFRUIT_NEOPIXEL_H

strip.setPixelColor(Pixel, strip.Color(red, green, blue));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H

leds[Pixel].r = red;
leds[Pixel].g = green;
leds[Pixel].b = blue;
#endif
}

void setAll(byte red, byte green, byte blue) {
for(int i = 0; i < NUM_LEDS; i++ ) {
setPixel(i, red, green, blue);
}
showStrip();
}

 

Post Author: swistak

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Potwierdz, że nie jesteś botem. *