neopixel lampe

Hi ich bräuchte mal dringend Hilfe von jemandem der sich mit den neopixel leds aus kennt :slight_smile:

ich habe letzte Woche ein Projekt gestartet in dem ich mir eine tisch Lampe gebaut habe. diese ist nun bis auf die Programierung fertig. bei der Programierung habe ich jetzt allerdings noch grose Probleme :o

in der Lampe steckt ein arduino nano an diesen ist ein ws2812b led Strip angeschlossen mit 48 leds. außerdem habe ich einen ir Sensor mit eingebaut um die Lampe mit einer Fernbedienung zu steuern. Die Verkabelung hat gut geklappt aktuell kann ich die Lampe an und aus schalten und die Farben mit der Fernbedienung ändern. ich möchte aber nicht das die Lampe einfach nur rot gelb blau etc leuchtet sondern ich möchte verschieden Effekte ablaufen lassen. das Heist wen ich bei der Fernbedienung auf 1 drücke soll z.b. ein feuer Effekt kommen auf der 2 dann Sternen funkeln auf der 3 ein Kometen Effekt. Mit den Pfeil tasten auf der Fernbedienung möchte ich dann die Farben durch schalten also das ich nicht nur den feuer Effekt auf der 1 habe sondern diesen in den Farben blau rot grün etc laufen lassen kann. eine dimm Funktion wäre dann auch noch super :confused: . Leider sind meine programier skills eher bei 0 und ich bekomme nichts zum laufen sobald Effekte mit ins spiel kommen geht nichts mehr.

Diesen Code habe ich bis jetzt benutzt und solange ich keine Effekte nutze geht der auch nur eben nicht mit Effekten

//import the necessary libraries
#include "FastLED.h"
#include "IRremote.h"

//define some variables
#define LEDPIN     6
#define RECV_PIN  3
#define LED_TYPE     NEOPIXEL
#define NUM_LEDS    15
#define BRIGHTNESS  200
CRGB leds[NUM_LEDS];
CRGB endclr;
CRGB midclr;

//set up IR receiver information
IRrecv irrecv(RECV_PIN);
decode_results results;

//<————————————————————————————SETUP————————————————————————————>
void setup()
{
//begin serial communication
  Serial.begin(9600);
//sanity delay
  delay(3000); 
//start the receiver
  irrecv.enableIRIn(); 
  
//set up LED strip information
FastLED.addLeds<LED_TYPE,LEDPIN>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(BRIGHTNESS);
}

//<—————————————————————————LOOP———————————————————————————————>
void loop() {
if (irrecv.decode(&results)) {
  
//rotating base colour used by many of the patterns
uint8_t gHue = 0; 
FastLED.delay(1000/120);
EVERY_N_MILLISECONDS( 20 ) { gHue++; }  

//<——————————————————BUTTON FUNCTIONS—————————————————————————>
//power button = plain white
if (results.value == 0xFD00FF){
fill_solid(leds,NUM_LEDS,CRGB::White);
FastLED.show();}

//vol+ = brightness up
if (results.value == 0xFD807F){
FastLED.setBrightness(255);
FastLED.show();}

//vol- = brightness down
if (results.value == 0xFD906F){
fadeLightBy(leds, NUM_LEDS, 30);
FastLED.show();}

//play/pause = cycles through colours
if (results.value == 0xFDA05F) {
uint8_t i = beatsin8(130, 0, 150);
fill_solid(leds, NUM_LEDS, CHSV(i, 255, 150));
FastLED.show();
}

//left = Custom gradient blend
if (results.value == 0xFD20DF) {
uint8_t speed = beatsin8(10,0,255);
endclr = blend(CHSV(160,185,255), CRGB::Pink, speed);
midclr = blend(CRGB::Purple, CRGB::Green, speed);

fill_gradient_RGB(leds, 0, endclr, NUM_LEDS/2, midclr);
fill_gradient_RGB(leds, NUM_LEDS/2+1, midclr, NUM_LEDS, endclr);
FastLED.show();}

//right = Custom solid colour
if (results.value == 0xFD609F) {
fill_solid(leds,NUM_LEDS,CRGB::Purple);
FastLED.show();}


//func/stop = xmas
if (results.value == 0xFD40BF) {
uint8_t dot = beatsin8(50, 0, NUM_LEDS);
leds[dot] = CRGB::Red;
leds[dot+1] = CRGB::Green;
FastLED.show();}


//up = bpm 
if (results.value == 0xFD50AF) {
CRGBPalette16 palette = PartyColors_p;
uint8_t beat = beatsin8( 70, 64, 255);
for( int i = 0; i < NUM_LEDS; i++) { 
leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10));}
FastLED.show();
}

//down = fire
if (results.value == 0xFD10EF) {
CRGBPalette16 palette = HeatColors_p;
uint8_t beat = beatsin8( 50, 64, 255);
for( int i = 0; i < NUM_LEDS; i++) { 
leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10)); }
FastLED.show();}

//eq = rainbow
if (results.value == 0xFDB04F) {
fill_rainbow( leds, NUM_LEDS-3, gHue, 7);
leds[12] = CRGB::Blue;   //adjust the rainbow slightly towards the purple end
leds[13] = CRGB::Purple;
leds[14] = CRGB::Purple;
FastLED.show();}

//st/rept = rainbow w stars
if (results.value == 0xFD708F) {
fill_rainbow( leds, NUM_LEDS-3, gHue, 7);
leds[12] = CRGB::Blue;
leds[13] = CRGB::Purple;
leds[14] = CRGB::Purple;
addGlitter(70);
FastLED.show();}

// 0 = day
if (results.value == 0xFD30CF) {
uint8_t speed = beatsin8(8,0,255);
endclr = blend(CRGB::Yellow, CHSV(0,0,170), speed);
midclr = blend(CHSV(0,0,150), CRGB::Yellow, speed);

fill_gradient_RGB(leds, 0, endclr, NUM_LEDS/2, midclr);
fill_gradient_RGB(leds, NUM_LEDS/2+1, midclr, NUM_LEDS, endclr);
FastLED.show();}

// 1 = sunrise (pink & blue)
if (results.value == 0xFD08F7) {
fill_gradient(leds, 0, CHSV(160,185,210), NUM_LEDS-1, CHSV(237,141,255));
FastLED.show();}

// 2 = sunset (orange & blue)
if (results.value == 0xFD8877) {
fill_gradient_RGB(leds, 0, CHSV(150,255,200), NUM_LEDS-1, CHSV(25,255,255));
FastLED.show();}

// 3 = sunrise to sunset
if (results.value == 0xFD48B7) {
uint8_t speed = beatsin8(10,0,255);
endclr = blend(CHSV(150,255,210), CHSV(160,185,200), speed);
midclr = blend(CHSV(25,255,255), CHSV(237,141,255), speed);

fill_gradient_RGB(leds, 0, endclr, NUM_LEDS/2, midclr);
fill_gradient_RGB(leds, NUM_LEDS/2+1, midclr, NUM_LEDS, endclr);
FastLED.show();}

// 4 = night
if (results.value == 0xFD28D7) {
fill_gradient_RGB(leds, 0, CHSV(160,255,150), NUM_LEDS-1, CHSV(180,230,80));
FastLED.show();}

// 5 = starry night
if (results.value == 0xFDA857) {
fill_gradient_RGB(leds, 0, CHSV(160,255,150), NUM_LEDS-1, CHSV(180,230,80)); 
addGlitter(80);
FastLED.show();}
  
// 6 = rain
if (results.value == 0xFD6897) {
fadeToBlackBy( leds, NUM_LEDS, 30);
int pos = random16(NUM_LEDS);
leds[pos] = CHSV(135,80,200);
FastLED.show(); }
  
// 7 = acid rain
if (results.value == 0xFD18E7) {
fadeToBlackBy( leds, NUM_LEDS, 130);
int pos = random16(NUM_LEDS);
leds[pos] = CRGB::Green;
FastLED.show(); }

// 8 = snow
if (results.value == 0xFD9867) {
fadeToBlackBy( leds, NUM_LEDS, 30);
addGlitter(50);
FastLED.show();}

// 9 = storm
if (results.value == 0xFD58A7) {
fadeToBlackBy( leds, NUM_LEDS, 30);
fill_solid(leds,NUM_LEDS,CHSV(0,0,50));
addGlitter(60);
lightning();
FastLED.show();}

irrecv.resume(); // Receive the next value
}}

//<——————————————————————OTHER FUNCTIONS————————————————————>

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

void lightning ()
{EVERY_N_MILLISECONDS (4000) {
uint8_t i = beatsin8(6, 0, 255);
fill_solid(leds, NUM_LEDS, CHSV(160, 10, i));
} }

Kann mir jemand sagen wie ich da jetzt Effekte einbinden kann das diese auch ablaufen geht das überhaupt ?

ich hoffe man versteht was ich möchte das ist Gar nicht so leicht zu beschreiben :frowning:

Eins Deiner Probleme wird es werden, dass Du bei Effekten oft Daten in kurzen Abständen an die Neopixel-LEDs schicken musst.
Während dieser Zeit werden die Interrupts abgeschaltet und Dein IR-Empfänger kann nicht auf die Fernbedienung reagieren.

WS2812B und IR-Empfänger ist eine ungünstige Kombination.

Ansonsten würde ich Dir empfehlen, die Effekte erst mal zu planen, also was soll mit welcher LED wie passieren und die dann einzeln in eigenen Sketchen austesten.
Wenn das funktioniert, kannst Du sie zusammen legen.

Gruß Tommy

Hallo,

hier ein Link den ich gerade durchgekaut habe.

Wiki FastLED

Gundsätzlich gibt es mal wieder das Problem das die meisten einfachen Beispiele der Lib mit delay und oder Schleifen arbeiten. Damit ist alle andere erst mal tot.

Also musst Du alle delays durch millis() ersetzten können und die meisten Schleifen durch Zähler und If Abgragen.

Heinz

Sry das ich erst jetzt antworte hatte leider wegen der Arbeit die letzten Tage viel zu tun :frowning:

Erstmal danke für die Antworten :slight_smile:

Wie schaut es den aus wen ich an Stelle der ir Fernbedienung 3 Potis benutze?
Also einer für die Effekte, einen für die Farben und einen für die Helligkeit
Hab ich da das selbe Problem wie bei der ir Fernbedienung oder werden Knöpfe und potis besser erkannt ?

Nein, mit Potis wirst du keine Probleme haben. Beim IR ist es einfach der Interrupt, der durch die Neopixel ausgeschaltet wird. Das Problem habe ich auch gerade. Meine Lösung ist eine Pause der Pixelanimation, sobald ein IR Signal erkannt wird. Dadurch muss man aber 2 mal auf die Fernbedienung drücken... 1. damit die Pixel in Pause gehen und der Interrupt wieder 'frei' wird und das 2. mal um die Taste dann wirklich zu erkennen.

Bei Potis brauchst du keinen Interrupt... deswegen sollten die funktionieren.

gut dann bastel ich notfalls mit den potis rum :smiley:
aber deine Lösung mit dem 2 mal drücken wäre auch nicht schlecht ist es möglich das du mir das Programm senden kannst? dann bastel ich mir mit deinem code ein Programm zusamen was für meine Lampe passt :smiley:

Hallo,

ich bin nicht ganz sicher , aber ich sehe in deinem Sketch keine Wartezeit bei der der IR Sensor mal etwas Zeit bekäme. Du hast ja in jedem Umlauf des loop ein FastLED.show() drin, damit sind die Interupts fast ständig abgeschaltet.

bau doch mal um Deine Abfragen eine Konstrktion mit millis() damit Du nur alle 50ms einmal in die Abfragen kommst. Wenn das dann geht kannst Du die zeit ja schrittweise runter nehmen.

Heinz

das werde ich gleich mal ausprobieren