Help needed Plasma 16X32 color control

Hi all

I am fairly new to the LED matrix world and need a bit of help here

I built the project around the 16*32 LED matrix sold by adafruit and ran the plasma example.

Video of the code running here

I now want to tweak the code so the color range is only going from blueish to greenish and the patterns move slower.

I manage to find the variables to change in order to get the movement I desired but i can t find for the life of me how to set the color correctly - at the moment it is always red-ish no matter what I do on this

matrix.drawPixel(x, y, matrix.ColorHSV(value * 1, 255, 255, true));

In that case I presume VALUE is a variable to create n progression in the HUE, and 1 is the starting HUE in a HSV space.

However no matter what I replace 1 with I always end up with a red ish screen

Could you please enlight me about what to tweak in order to achieve the desired result ?

(NB: the matrix is well wired as all the other tutorilal run fine)

Here is the current code

// plasma demo for Adafruit RGBmatrixPanel library.
// Demonstrates double-buffered animation our 16x32 RGB LED matrix:
// http://www.adafruit.com/products/420

// Written by Limor Fried/Ladyada & Phil Burgess/PaintYourDragon
// for Adafruit Industries.
// BSD license, all text above must be included in any redistribution.

#include <avr/pgmspace.h>
#include <Adafruit_GFX.h>   // Core graphics library
#include <RGBmatrixPanel.h> // Hardware-specific library

#define CLK 8  // MUST be on PORTB! (Use pin 11 on Mega)
#define LAT A3
#define OE  9
#define A   A0
#define B   A1
#define C   A2
// Last parameter = 'true' enables double-buffering, for flicker-free,
// buttery smooth animation.  Note that NOTHING WILL SHOW ON THE DISPLAY
// until the first call to swapBuffers().  This is normal.
RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, true);

static const int8_t PROGMEM sinetab[256] = {
     0,   2,   5,   8,  11,  15,  18,  21,
    24,  27,  30,  33,  36,  39,  42,  45,
    48,  51,  54,  56,  59,  62,  65,  67,
    70,  72,  75,  77,  80,  82,  85,  87,
    89,  91,  93,  96,  98, 100, 101, 103,
   105, 107, 108, 110, 111, 113, 114, 116,
   117, 118, 119, 120, 121, 122, 123, 123,
   124, 125, 125, 126, 126, 126, 126, 126,
   127, 126, 126, 126, 126, 126, 125, 125,
   124, 123, 123, 122, 121, 120, 119, 118,
   117, 116, 114, 113, 111, 110, 108, 107,
   105, 103, 101, 100,  98,  96,  93,  91,
    89,  87,  85,  82,  80,  77,  75,  72,
    70,  67,  65,  62,  59,  56,  54,  51,
    48,  45,  42,  39,  36,  33,  30,  27,
    24,  21,  18,  15,  11,   8,   5,   2,
     0,  -3,  -6,  -9, -12, -16, -19, -22,
   -25, -28, -31, -34, -37, -40, -43, -46,
   -49, -52, -55, -57, -60, -63, -66, -68,
   -71, -73, -76, -78, -81, -83, -86, -88,
   -90, -92, -94, -97, -99,-101,-102,-104,
  -106,-108,-109,-111,-112,-114,-115,-117,
  -118,-119,-120,-121,-122,-123,-124,-124,
  -125,-126,-126,-127,-127,-127,-127,-127,
  -128,-127,-127,-127,-127,-127,-126,-126,
  -125,-124,-124,-123,-122,-121,-120,-119,
  -118,-117,-115,-114,-112,-111,-109,-108,
  -106,-104,-102,-101, -99, -97, -94, -92,
   -90, -88, -86, -83, -81, -78, -76, -73,
   -71, -68, -66, -63, -60, -57, -55, -52,
   -49, -46, -43, -40, -37, -34, -31, -28,
   -25, -22, -19, -16, -12,  -9,  -6,  -3
};

void setup() {
  matrix.begin();

}

const float radius1  = 65.2, radius2  = 92.0, radius3  = 163.2, radius4  = 176.8,
            centerx1 = 64.4, centerx2 = 46.4, centerx3 =  93.6, centerx4 =  16.4, 
            centery1 = 34.8, centery2 = 26.0, centery3 =  56.0, centery4 = -11.6;
float       angle1   =  0.0, angle2   =  0.0, angle3   =   0.0, angle4   =   0.0;

long        hueShift =  200; // SET THE STRARTING COLOR - 0 = red // 200 = blue

void loop() {
  int           x1, x2, x3, x4, y1, y2, y3, y4, sx1, sx2, sx3, sx4;
  unsigned char x, y;
  long          value;

  sx1 = (int)(cos(angle1) * radius1 + centerx1);
  sx2 = (int)(cos(angle2) * radius2 + centerx2);
  sx3 = (int)(cos(angle3) * radius3 + centerx3);
  sx4 = (int)(cos(angle4) * radius4 + centerx4);
  y1  = (int)(sin(angle1) * radius1 + centery1);
  y2  = (int)(sin(angle2) * radius2 + centery2);
  y3  = (int)(sin(angle3) * radius3 + centery3);
  y4  = (int)(sin(angle4) * radius4 + centery4);

  for(y=0; y<matrix.height(); y++) {
    x1 = sx1; x2 = sx2; x3 = sx3; x4 = sx4;
    for(x=0; x<matrix.width(); x++) {
      value =200
        + (int8_t)pgm_read_byte(sinetab + (uint8_t)((x1 * x1 + y1 * y1) >> 4))
        + (int8_t)pgm_read_byte(sinetab + (uint8_t)((x2 * x2 + y2 * y2) >> 4))
        + (int8_t)pgm_read_byte(sinetab + (uint8_t)((x3 * x3 + y3 * y3) >> 5))
        + (int8_t)pgm_read_byte(sinetab + (uint8_t)((x4 * x4 + y4 * y4) >> 5));
      
       matrix.drawPixel(x, y, matrix.ColorHSV(value * 1, 255, 255, true));              ///H = hue,  S = Saturation V = Value  -- defines the color // Value = luminosity // matrix.ColorHSV
      x1--; x2--; x3--; x4--;
    }
    y1--; y2--; y3--; y4--;
  }
                                                                    // this bit is defining the movement of the animation
  angle1 += 0.03;
  angle2 -= 0.07;
  angle3 += 0.03;
  angle4 -= 0.03;
  hueShift += 20;                                                                 // this define the speed of color changes

  matrix.swapBuffers(false);
}

You would get more knowledgeable help at the Adafruit forum.

guidra:
I presume VALUE is a variable to create n progression in the HUE, and 1 is the starting HUE in a HSV space.

However no matter what I replace 1 with I always end up with a red ish screen

It's more than that, though - much more.
"Value" (for H/hue) is based on the result of the long operation preceding that statement:

 value =200
   + (int8_t)pgm_read_byte(sinetab + (uint8_t)((x1 * x1 + y1 * y1) >> 4))
   + (int8_t)pgm_read_byte(sinetab + (uint8_t)((x2 * x2 + y2 * y2) >> 4))
   + (int8_t)pgm_read_byte(sinetab + (uint8_t)((x3 * x3 + y3 * y3) >> 5))
   + (int8_t)pgm_read_byte(sinetab + (uint8_t)((x4 * x4 + y4 * y4) >> 5));
      
   matrix.drawPixel(x, y, matrix.ColorHSV(value * 1, 255, 255, true));

@ Runaway: thanks for the hint - i m going to look at this. It seems a bit daunting in comparison of my limited skills but let s give it a try :wink: I ll report back if i find something useful and easy to implement