Hallo ich bräuchte da mal eure Hilfe. Ich hab über eine IR Fernbedienung neopixel strip's programmiert.
Ich kann die Farben weiterschlafen oder halt zurück.
Nur gehen die einfach an. Ich hätte das gerne das pixel für Pixel an geht. Kann mir jemand helfen? Code stell ich gleich online
#include <IRremote.h>
#include <FastLED.h>
#define LED_PIN 6 //pin the LEDS are connected to
#define NUM_LEDS 144 //quantity of leds
#define LED_TYPE WS2812 //type of leds
#define COLOR_ORDER GRB //colour order
CRGB leds[NUM_LEDS]; //array of leds
uint8_t brightness = 114; //initial brightness
uint8_t colourscheme;
uint8_t colourschemeqty;
//static uint8_t startIndex = 0;
#define UPDATES_PER_SECOND 100
CRGBPalette16 currentPalette;
TBlendType currentBlending;
extern CRGBPalette16 static_WhitePalette;
extern const TProgmemPalette16 static_WhitePalette_p PROGMEM;
//ir stuff
int RECV_PIN = 11; //IR Receiving LED connected to this pin
bool onoff; //defines the current state of the LEDs
unsigned long command; //stores the latest input command
unsigned long lastcommand; //stores the most recent command if the remote button is held and command repeated
IRrecv irrecv(RECV_PIN); //initialise the IR module
decode_results results; //store results from decoding remote signal
void setup() {
delay( 3000 ); // power-up safety delay
//Control scheme
Serial.begin(9600);// Serial Output
irrecv.enableIRIn(); // Start the IR receiver
//FastLED stuff
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.setBrightness( brightness );
SetupBlackPalette();
onoff = false;
}
void loop()
{
if (irrecv.decode(&results)) {//if a new command is received from the IR sensor
command = results.value; //store in command variable
//Serial.println(results.value, HEX); //print result in hex to serial port
Serial.println(command); //print result to serial port - use to figure out what commands are being sent by your remote
switch (command) { //here is where you use the commands received from the remote (seen through serial monitor). Each code must be listed here for anything to happen
case 0xFF906F: //power button EQ
if (onoff == false){
colourscheme=1;
colourschemecycle(colourscheme);
onoff = true;
delay(1000);
}else{
colourscheme=0;
colourschemecycle(colourscheme);
onoff = false;
}
break;
//colour schemes
case 0xFFE21D: //up arrow - change colour scheme CH+
if (colourscheme < colourschemeqty && colourscheme > 0){
colourscheme += 1;
}else if (colourscheme == colourschemeqty){
colourscheme=1;
}
colourschemecycle(colourscheme);
break;
case 0xFFA25D: //down arrow - change colour scheme CH-
if (colourscheme > 1){
colourscheme -= 1;
}else if (colourscheme == 1){
colourscheme = colourschemeqty;
}
colourschemecycle(colourscheme);
break;
//brightness controls
case 0xFFE01F: //brightness down vol-
if (brightness > 25){
brightness = brightness - 20;
}
colourschemecycle(colourscheme);
break;
case 0xFFA857: //brightness up vol+
if (brightness < 254){
brightness = brightness + 20;
}
colourschemecycle(colourscheme);
break;
}
irrecv.resume(); // Receive the next value
}
/* for motion of leds - still testing
static uint8_t startIndex = 0;
startIndex = startIndex + 1; //defines motion speed
FillLEDsFromPaletteColors( startIndex);*/
FastLED.show();//display the leds
//FastLED.delay(1000 / UPDATES_PER_SECOND);
delay(250);//delay for effect to finish processing. reduce to make smoother, but currently causes issues with remote response
}
void FillLEDsFromPaletteColors( uint8_t colorIndex)//fill the leds with palette colours
{
//uint8_t brightness = 255;
for( int i = 0; i < NUM_LEDS; i++) {
leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
colorIndex += 3;
}
}
//function to cycle colour schemes.
//Add your colour schemes here.
//Remember to update the colourschemeqty to the largest case number
void colourschemecycle(uint8_t currentscheme)
{
colourschemeqty = 13;
switch (currentscheme)
{
case 0: fill_solid( currentPalette, 16, CRGB::Black); currentBlending = LINEARBLEND; FillLEDsFromPaletteColors( 1); break;
case 1: fill_solid( currentPalette, 16, CRGB::White); currentBlending = LINEARBLEND; FillLEDsFromPaletteColors( 1); break;
case 2: fill_solid( currentPalette, 16, CRGB::Red); currentBlending = LINEARBLEND; FillLEDsFromPaletteColors( 1); break;
case 3: fill_solid( currentPalette, 16, CRGB::Green); currentBlending = LINEARBLEND; FillLEDsFromPaletteColors( 1); break;
case 4: fill_solid( currentPalette, 16, CRGB::Blue); currentBlending = LINEARBLEND; FillLEDsFromPaletteColors( 1); break;
case 5: fill_solid( currentPalette, 16, CRGB::Purple); currentBlending = LINEARBLEND; FillLEDsFromPaletteColors( 1); break;
case 6: fill_solid( currentPalette, 16, CRGB::Orange); currentBlending = LINEARBLEND; FillLEDsFromPaletteColors( 1); break;
case 7: fill_solid( currentPalette, 16, CRGB::Yellow); currentBlending = LINEARBLEND; FillLEDsFromPaletteColors( 1); break;
case 8: fill_solid( currentPalette, 16, CRGB::DarkRed); currentBlending = LINEARBLEND; FillLEDsFromPaletteColors( 1); break;
}
}
void SetupBlackPalette()
{
fill_solid( currentPalette, 16, CRGB::Black);
}
Dann solltest Du Das SO programmieren.
Meine Frage bezog sich nämlich GENAU auf diesen Punkt!
Wenn DU z.B. bei case 0 DEN GANZEN STRIPE SCHWARZ FÄRBST - solltest Du Dich nicht wundern, daß der ganze Stripe schwarz gefärbt wird.
Gleiches bei den anderen Cases - wenn Du ALLE LEDs eine Farbe zuweist, dann werden hoffentlich auch alle LEDs diese Farbe anzeigen.
Wenn Du Das nicht willst: Programmiere Das um.
Wenn Du alle 100ms jeweils nur eine weitere LED rot färbst, werden pro Sekunde 10 LEDs nacheinander angehen.
Dazu ist Es aber ungemein hilfreich, wenn man VERSTEHT, was der Sketch Da macht - C&P bringt Dich hier leider nur von einer Schotter-Piste zur Nächsten.
Siehe Dir die Beispiele an, darin wird wohl ein Sketch enthalten sein, Der zumindest grob Das macht, was Du willst.
Den Sinn darin erkennen und bei Dir einbauen - nennt sich Programmieren.
i ist der Index also die nummer der LED. Lese die Beschreibung auf dem Link von mir das steht alles drin.
Delay darfst du nicht verwenden, dann wird das mit der IR Fernbedienung nix mehr, also ein milli() konstrukt verwenden.
Sowas in der Art müsste es sein.
!!!! ungetestet!!!!!
uint32_t altzeit; // im allgemein Teil
int i =0;
if (millis()-altzeit >=100UL){ // alle 100 ms die nächste LED ansteuern
leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
altzeit=millis();
colorIndex += 3;
FastLED.show();
i++
if ( i > NUM_LEDS) i=0;
}
Dann solltest Du Das SO programmieren.
Meine Frage bezog sich nämlich GENAU auf diesen Punkt!
Wenn DU z.B. bei case 0 DEN GANZEN STRIPE SCHWARZ FÄRBST - solltest Du Dich nicht wundern, daß der ganze Stripe schwarz gefärbt wird.
Gleiches bei den anderen Cases - wenn Du ALLE LEDs eine Farbe zuweist, dann werden hoffentlich auch alle LEDs diese Farbe anzeigen.
Wenn Du Das nicht willst: Programmiere Das um.
Wenn Du alle 100ms jeweils nur eine weitere LED rot färbst, werden pro Sekunde 10 LEDs nacheinander angehen.
Dazu ist Es aber ungemein hilfreich, wenn man VERSTEHT, was der Sketch Da macht - C&P bringt Dich hier leider nur von einer Schotter-Piste zur Nächsten.
Siehe Dir die Beispiele an, darin wird wohl ein Sketch enthalten sein, Der zumindest grob Das macht, was Du willst.
Den Sinn darin erkennen und bei Dir einbauen - nennt sich Programmieren.
MfG
ich denke du hast es hast es falsch verstanden.
case0 scahltet nur an oder aus, wie ein lichschalter
ich habe ein sketch der macht was er soll. nur das da ein taster ist. nur bekomme ich das nicht so geändert das das funktioniert. ich lade den gleich mal hoch
#include <Adafruit_NeoPixel.h>
#define BUTTON_PIN 2
#define PIXEL_PIN 6
#define PIXEL_COUNT 144
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
bool oldState = LOW;
int showType = 0;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
strip.begin();
strip.show(); // Initialize all pixels to 'off'
}
void loop() {
// Get current button state.
bool newState = digitalRead(BUTTON_PIN);
// Check if state changed from high to low (button press).
if (newState == HIGH && oldState == LOW) {
// Short delay to debounce button.
delay(20);
// Check if button is still low after debounce.
newState = digitalRead(BUTTON_PIN);
if (newState == HIGH) {
showType++;
if (showType > 2)
showType=0;
startShow(showType);
}
}
// Set the last button state to the old state.
oldState = newState;
}
void startShow(int i) {
switch(i){
case 0: colorWipe(strip.Color(0, 0, 0), 50); // Black/off
break;
case 1: colorWipe(strip.Color(255, 0, 0), 50); // Red
break;
case 2: colorWipe(strip.Color(0, 255, 0), 50); // Green
break;
}
}
// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
for(uint16_t i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}
void FillLEDsFromPaletteColors( uint8_t colorIndex)//fill the leds with palette colours
{
for ( int i = 0; i < NUM_LEDS; i++) {
leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
colorIndex += 3;
delay(100);
FastLED.show();//display the leds
}
}
Ich habe allerdings eine schlechte Nachricht: IR-Fernbedienung und WS2812b (Neopixel) passen nicht zusammen. Die Auswertung der Fernbedienung bringt häufig Müll. Altrernativ habe ich APA102 verwendet, da geht es problemlos.
agmue:
Bezogen auf den Sketch in #0: Meinst Du sowas?
void FillLEDsFromPaletteColors( uint8_t colorIndex)//fill the leds with palette colours
{
for ( int i = 0; i < NUM_LEDS; i++) {
leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
colorIndex += 3;
delay(100);
FastLED.show();//display the leds
}
}
Ich habe allerdings eine schlechte Nachricht: IR-Fernbedienung und WS2812b (Neopixel) passen nicht zusammen. Die Auswertung der Fernbedienung bringt häufig Müll. Altrernativ habe ich APA102 verwendet, da geht es problemlos.
agmue:
Bezogen auf den Sketch in #0: Meinst Du sowas?
void FillLEDsFromPaletteColors( uint8_t colorIndex)//fill the leds with palette colours
{
for ( int i = 0; i < NUM_LEDS; i++) {
leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
colorIndex += 3;
delay(100);
FastLED.show();//display the leds
}
}
Ich habe allerdings eine schlechte Nachricht: IR-Fernbedienung und WS2812b (Neopixel) passen nicht zusammen. Die Auswertung der Fernbedienung bringt häufig Müll. Altrernativ habe ich APA102 verwendet, da geht es problemlos.
Perfekt danke das hat geklappt jetzt macht er was er machen soll;)
Hast Du wenigstens verstanden, warum Das (ungefähr so) funktioniert, wie Du Das wolltest?
Ganz nebenbei: Während des 'Voll-Laufen' reagiert der Sketch in keinster Weise auf die IR-Fernbedienung, da Er in einer FOR-Schleife gefangen ist, Die mittels delay() auch noch schön lange dauert.
Klar - man will ja auch sehen, daß der Streifen langsam voll läuft - kein Thema.
Klar: Deine Anforderung wurde hiermit erfüllt, aber willst Du nicht selber über den Tellerrand schauen können und verstehen, Was Da abläuft?
Bisher machst Du den Eindruck nicht!
MfG
PS: Mir ist schon klar, das die Cases den ganzen Stripe um färben (eben auch in Schwarz=Aus) - Dir aber nicht, daß genau darin Dein Problem bestand - daß Du nämlich ALLE Pixel um färbst, statt 'Einen nach dem Anderen'.
ja das hab ich schon verstanden. und die fernbedienung muss auch nicht reagieren . das wird ehh verbaut und denn sind es vielleicht noch 20 Ledś. selbst wenn es auf die länge geblieben wäre es kei problem die zeit nehm ich mir
klar will ich über mein Tellerand gehen, aber ich hab den fehler irgendwie nicht gefunden.
ich hatte es schon so nur mit dem unterschied das ich das" FastLED.show();" nucht unten drunter geschrieben habe.
Und genau für sowas ist doch solch ein Forum da. um zu helfen und geholfen werden. Oder nicht
Und wenn es für fortschrittene oder profis einfacher und offensichtlicher ist das doch gut.