RGB renkleri arasında daha iyi gezinme

RGB'nin bu LED şeridi için sunduğu 16 milyon renge dokunmanın bir yolunu bulmaya çalışıyorum. LEDS.setBrightness (); 'ı kullanmayı düşündüm ama denemelerimde başarılı olamadım. renk solması ile ilgili belgeleri okudum ancak bu yazıyı yazamadım Arduino Leonardo’ya. İşte benim kodum, 0-255 ilk gökkuşağı arasında geçiş yapan. Tüm renkler olmasa bile 0-255'ten daha fazlasını nasıl elde edeceğimi merak ediyordum.

#include 

#define LED_COUNT 60
#define LED_OUT       13
#define BUTTON_IN     10
#define ANALOG_INPUT  A9
#define EXTRA_PIN_A    7
#define EXTRA_PIN_B   11

struct CRGB leds[LED_COUNT];
int wait_time = 5;

void setup() {
  Serial.begin(57600);
  LEDS.addLeds(leds, LED_COUNT);
  LEDS.show();
}

void loop() {
  //start from red
  for(int colorStep=0; colorStep <= 255; colorStep++) {
    int r = 255;
    int g = 0;
    int b = colorStep;
   //Now loop though each of the LEDs and set each one to the current color
    for(int x = 0; x < LED_COUNT; x++) {
      leds[x] = CRGB(r,g,b);
    }
   //Display the colors we just set on the actual LEDs
    delay(wait_time);
    LEDS.show();
  }

  //into blue
  for(int colorStep=255; colorStep >= 0; colorStep--) {
    int r = colorStep;
    int g = 0;
    int b = 255;
   //Now loop though each of the LEDs and set each one to the current color
    for(int x = 0; x < LED_COUNT; x++) {
      leds[x] = CRGB(r,g,b);
    }
   //Display the colors we just set on the actual LEDs
    delay(wait_time);
    LEDS.show();
  }
  //start from blue
  for(int colorStep=0; colorStep <= 255; colorStep++) {
    int r = 0;
    int g = colorStep;
    int b = 255;
   //Now loop though each of the LEDs and set each one to the current color
    for(int x = 0; x < LED_COUNT; x++) {
      leds[x] = CRGB(r,g,b);
    }
   //Display the colors we just set on the actual LEDs
    delay(wait_time);
    LEDS.show();
  }
  //into green
  for(int colorStep=255; colorStep >= 0; colorStep--) {
    int r = 0;
    int g = 255;
    int b = colorStep;
   //Now loop though each of the LEDs and set each one to the current color
    for(int x = 0; x < LED_COUNT; x++) {
      leds[x] = CRGB(r,g,b);
    }
   //Display the colors we just set on the actual LEDs
    delay(wait_time);
    LEDS.show();
  }
  //start from green
  for(int colorStep=0; colorStep <= 255; colorStep++) {
    int r = colorStep;
    int g = 255;
    int b = 0;
   //Now loop though each of the LEDs and set each one to the current color
    for(int x = 0; x < LED_COUNT; x++) {
      leds[x] = CRGB(r,g,b);
    }
   //Display the colors we just set on the actual LEDs
    delay(wait_time);
    LEDS.show();
  }
  //into yellow
  for(int colorStep=255; colorStep >= 0; colorStep--) {
    int r = 255;
    int g = colorStep;
    int b = 0;
   //Now loop though each of the LEDs and set each one to the current color
    for(int x = 0; x < LED_COUNT; x++) {
      leds[x] = CRGB(r,g,b);
    }
   //Display the colors we just set on the actual LEDs
    delay(wait_time);
    LEDS.show();
  }
} //end main loop
2
ancak RGB'nin 0-255 seviyeleri tüm renkler , tüm renkleri ne yapmaya çalışıyorsunuz?
katma yazar Alastair, kaynak
Ahh, görüyorum; sonra sadece döngülerinizi yuvalayın ...
katma yazar Alastair, kaynak
bu doğru, fakat döngülerimi takip edersen rgb için sadece 0 <255 ve 0> 255 kombinasyonlarını yaptığımı göreceksin. I.E. 0, 0, 255//mavi veya 255, 0, 0//kırmızı, bu yüzden ilk gökkuşağını söyledim. Diyelim ki 128, 64, 250 diyelim.
katma yazar Oddacon, kaynak
w/@ 6v6gt cevabı gibi denedim. maalesef, LED'lerden düzgün şekilde geçmiyor. FastLED sınıfının iç içe geçirme biçiminde olduğu gibi, ilk yuvalanmış döngüde (sağlanan kod değil) yineleme sorunu var gibi görünüyor.
katma yazar Oddacon, kaynak

6 cevap

RGB renk alanı için üç 255 değerinin, 255 ^ 3 (16,581,375) renklerini kodlamanın yalnızca bir yolu olduğuna dikkat çekmek gerektiğini düşünüyorum. Bunlar, her parlaklık seviyesini de içerir.

Gökkuşağı efekti elde etmeye çalışıyorsanız, daha başarılı olabilir veya HSL veya HSV renk boşluğu kullanmayı daha kolay bulabilirsiniz.

HSV, RGB yerine Ton, Doygunluk ve Değer kullanır. FastLED, HSV uygulamasını Hue (360 yerine) için 0-255 adresleme kullanacak ve mikro denetleyicilerde yayınlanan animasyonlar için hızlı tutacak şekilde optimize etti:

https://github.com/FastLED/FastLED/wiki/FastLED-HSV- Renkler

2
katma
Fastled'i tekrar kullanmak gerçekten çok iyi bir seçenek! Tekerleği yeniden icat ederek üstesinden gelecek ve daha verimli bir tekerleğe sahip olacaksınız; p
katma yazar dotnetengineer, kaynak

Sinüs solma tekniğini kullanarak tek bir RGB ledini döndürebilecek basit bir çizim ekledim

// Cycle a single RGB led using the sine fade technique
// For common cathode led

const uint8_t lights[360]={
  0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 15, 17, 18, 20, 22, 24, 26, 28, 30, 32, 35, 37, 39,
 42, 44, 47, 49, 52, 55, 58, 60, 63, 66, 69, 72, 75, 78, 81, 85, 88, 91, 94, 97, 101, 104, 107, 111, 114, 117, 121, 124, 127, 131, 134, 137,
141, 144, 147, 150, 154, 157, 160, 163, 167, 170, 173, 176, 179, 182, 185, 188, 191, 194, 197, 200, 202, 205, 208, 210, 213, 215, 217, 220, 222, 224, 226, 229,
231, 232, 234, 236, 238, 239, 241, 242, 244, 245, 246, 248, 249, 250, 251, 251, 252, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255, 254, 254, 253, 253,
252, 251, 251, 250, 249, 248, 246, 245, 244, 242, 241, 239, 238, 236, 234, 232, 231, 229, 226, 224, 222, 220, 217, 215, 213, 210, 208, 205, 202, 200, 197, 194,
191, 188, 185, 182, 179, 176, 173, 170, 167, 163, 160, 157, 154, 150, 147, 144, 141, 137, 134, 131, 127, 124, 121, 117, 114, 111, 107, 104, 101, 97, 94, 91,
 88, 85, 81, 78, 75, 72, 69, 66, 63, 60, 58, 55, 52, 49, 47, 44, 42, 39, 37, 35, 32, 30, 28, 26, 24, 22, 20, 18, 17, 15, 13, 12,
 11, 9, 8, 7, 6, 5, 4, 3, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

const byte redpin = 3;  
const byte greenpin = 5;  
const byte bluepin = 6;  
int loopdelay = 5000;//ms  
int displaylength = 50;//ms  

boolean showiterations = false;  

//_______________________________  
void setup() {  
      Serial.begin(9600);  
}

void loop() {  
for (int k=0; k<360; k++)  
{  
    if (showiterations) {  
    Serial.print(k);  
    Serial.print(F(","));  
    }
analogWrite(redpin, lights[(k+120)%360]);  
analogWrite(greenpin, lights[k]);  
analogWrite(bluepin, lights[(k+240)%360]);  
delay(displaylength);  
}
if (showiterations) {  
Serial.println("  ");  
}
delay(loopdelay);  
}

Bu taslak, "RGB Renk Modeliyle Doğru Gökkuşağı ve Rastgele Renklerin Nasıl Yapılacağı" başlıklı Talimatlar yayınından elde edilmiştir, http://www.instructables.com/id/How-to-Make-Proper-Rainbow-and-Random-Colors-With-/
Ek olarak, bisiklet renkleri için farklı tekniklerin arkasında bilgi ve mantık sağlar.


Eğer bir gökkuşağı efekti yaratırken şerit boyunca renkleri şaşırtmaya çalışıyorsanız, [Adafruit'ten, bunun yapılacağını] başka bir eskizim var. Farklı Neopixel yüzük konfigürasyonları ile etkili bir şekilde kullandım. Çizim birkaç farklı teknik göstermektedir. Şu anda theatreChaseRainbow dışındaki tüm kişilerin çağrılarını yorumladım, ancak hepsini keşfetmek isteyebilirsiniz.

#include 
// following atatement should be wrapped with an ifdef for __AVR__, but this facility botches it up.
// As it is, formatting for the sketch is not quite right, and I do not have a solution for that.
  #include 

const  byte PIN = 7;

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
// Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800)`
Adafruit_NeoPixel strip = Adafruit_NeoPixel(16, 6, NEO_GRB + NEO_KHZ800);

// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel.  Avoid connecting
// on a live circuit...if you must, connect GND first.

void setup() {
 //This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
 //End of trinket special code


  strip.begin();
   colorWipe(strip.Color(0, 0, 0), 50);//blank
  strip.show();//Initialize all pixels to 'off'
}

void loop() {
 //Some example procedures showing how to display to the pixels:
//  colorWipe(strip.Color(255, 0, 0), 50);//Red
//  colorWipe(strip.Color(0, 255, 0), 50);//Green
//  colorWipe(strip.Color(0, 0, 255), 50);//Blue
//colorWipe(strip.Color(0, 0, 0, 255), 50);//White RGBW
 //Send a theater pixel chase in...
//  theaterChase(strip.Color(127, 127, 127), 50);//White
//  theaterChase(strip.Color(127, 0, 0), 50);//Red
//  theaterChase(strip.Color(0, 0, 127), 50);//Blue

//  rainbow(20);
//  delay(50000);
//  colorWipe(strip.Color(0, 0, 0), 50);//blank
//  rainbowCycle(10);
//  delay(5000);
//    colorWipe(strip.Color(0, 0, 0), 50);//blank
//   delay(5000);
  theaterChaseRainbow(50);
//  delay(5000);
//    colorWipe(strip.Color(0, 0, 0), 50);//blank
//   delay(5000);
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i
1
katma
Cevabınız% 100 doğru olsa da, eğer bu bağlantı taşınırsa, değiştirilirse, bir başkasına birleştirilirse ya da ana site kaybolursa% 100 yararsız hale gelebilir ... :( Bu nedenle, lütfen cevabınızı düzenleyin ve bağlantıdaki ilgili adımları cevabınıza kopyalayın, böylece cevabınızı ömür boyu% 100 garanti altına alın. bu sitenin! ;) Bağlantıyı her zaman materyalinin kaynağı olarak cevabın altında bırakabilirsin ...
katma yazar user67244, kaynak
Güzel görünüyor, teşekkürler!
katma yazar user67244, kaynak
@Avamander, öneri alınan, lütfen yeniden değerlendirin.
katma yazar Richard, kaynak

Bloke etmemeyi düşünmelisin :)

loop(){
   //if(millis() > previous+100){//uncomment this part to only do a step of the rainbow effect every 100ms
   rainbowEffect();
   //previous = millis();
   //}

   //you can do other stuff, like check a buttons' state here.
   //using the same structure as above, you can choose to give it a higher or lower priority.
}

unsigned char r,g,b;
void rainbowEffect(){
   if(r>254){
      r=0;
      g++;
   }
   if(g>254){
      g=0;
      b++;
   }
   if(b>254){
      b=0;
   }
   r++;
   ledStrip.set(r,g,b);
}
0
katma

Sanırım @ Mazaryk haklıydı, HSV bunun için gitmek yoludur. RGB'nin 16+ milyon rengi parlaklık içeriyor ve bazıları şeritte görünmüyor, bu yüzden en azından solgunlaşmanın bir yolunu buldum:

int thissat = 255;           //- LOOPS DELAY VAR
int idex = 0;                //-LED INDEX
int ihue = 0;                //-hue (0-255)

void rainbow_fade() {
    ihue++;
    if (ihue > 255) {ihue = 0;}
    for(int idex = 0 ; idex < LED_COUNT; idex++ ) {
      leds[idex] = CHSV(ihue, thissat, 255);
    }
    LEDS.show();    
    delay(wait_time);
}
0
katma

Rgb renginin imzasız bir uzunlukta gösterilmesi avantajından yararlanabilirsiniz. Ve bir sayaç kullanın. Ama yinelemede 1ms ile 16 mio renkler arasında döngü sabır biraz zaman alır :-). (yaklaşık 4-5 saat: 16581375/(1000 [ms] * 60 [m] * 60 [s]) = 4,6)

void loopThrougAllColors(){
 //The trick here is to use a unsigned long value as the color representation. 
 //Each byte represent a color (except the first)
 //         none, R  G  B
 //         0x00 00 00 00                     
 //Note: static means it is a global variable - but only seen in thisfunction.                                            
  static unsigned long ledColor = 0;        
  static int ledIndex = 0;

  ledColor++;
  ledColor &= 0x00FFFFFF; /* Overflow preventing (instead of if sentence checking the boundaries). */           

  leds[0] = ledColor;

  FastLED.show();
  FastLED.delay(1);
  //delay(10);
} 
0
katma

Yaklaşık 16 milyon olası rengin her birini görüntülemek istiyorsanız, bu örnekteki gibi döngüler için iç içe geçmeniz gerekir:

x = 1 ; //only for testing
for ( int redx = 0 ; redx <= 255 ; redx ++ ) {
    for ( int greenx = 0 ; greenx <= 255 ; greenx ++ ) {
        for ( int bluex = 0 ; bluex <= 255 ; bluex ++ ) {
             leds[ x ] = CRGB(redx,greenx,bluex);
             delay(wait_time); 
             LEDS.show(); 
        }
    }
}
0
katma
Alternatif olarak, RGB yerine HSB veya HSV kullanmak olabilir, bu şekilde gökkuşağı efekti elde etmek için zamanla renk tonunu artırabilirsiniz.
katma yazar dotnetengineer, kaynak