Connecting multiple 8x8 NeoPixel panels together

EL Wire/Tape/Panels, LEDs, pixels and strips, LCDs and TFTs, etc products from Adafruit

Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.
Locked
User avatar
Jason_B93
 
Posts: 10
Joined: Thu Nov 17, 2022 2:28 am

Connecting multiple 8x8 NeoPixel panels together

Post by Jason_B93 »

I bought 4 of the 8x8 NeoPixel panels with the intention to made a 16x16 display but I'm having trouble wrapping my head around addressing each of the LEDs. I wired up the panels like this
1,3
2,4
And I'm able to get images displayed with the following code by setting x to 8 and y to 32 and structuring the image data as an 8x32 array of RGB values but I'm wondering if there's a better way. Has anyone connected 4 of these panels together before?

Code: Select all

void showData(CRGB *data)
{
  for (uint8_t y = 0; y < NUM_Y; y++)
    for (uint8_t x = 0; x < NUM_X; x++)
      leds[(y*NUM_X)+x] = data[(y*NUM_X)+x];
  FastLED.show();
}
Right now, none of the example sketches in the NeoPixel or FastLED libraries work properly as they all expect the LEDs to be laid out in sequential rows. I'm hoping there's someone smarter than me who's updated the XY function for this specific layout of LEDs.

Code: Select all

uint16_t XY( uint8_t x, uint8_t y)
{
  uint16_t i;
  
  if( kMatrixSerpentineLayout == false) {
    if (kMatrixVertical == false) {
      i = (y * kMatrixWidth) + x;
    } else {
      i = kMatrixHeight * (kMatrixWidth - (x+1))+y;
    }
  }

User avatar
Jason_B93
 
Posts: 10
Joined: Thu Nov 17, 2022 2:28 am

Re: Connecting multiple 8x8 NeoPixel panels together

Post by Jason_B93 »

I think I have a solution but I don't like it. Using Garrett Mace's XY map generator, I think this code will be a drop in replacement.

Code: Select all

uint8_t XY (uint8_t x, uint8_t y) {
  // any out of bounds address maps to the first hidden pixel
  if ( (x >= kMatrixWidth) || (y >= kMatrixHeight) ) {
    return (LAST_VISIBLE_LED + 1);
  }

  const uint8_t XYTable[] = {
    0, 1, 2, 3, 4, 5, 6, 7, 128, 129, 130, 131, 132, 133, 134, 135
    8, 9, 10, 11, 12, 13, 14, 15, 136, 137, 138, 139, 140, 141, 142, 143
    16, 17, 18, 19, 20, 21, 22, 23, 144, 145, 146, 147, 148, 149, 150, 151
    24, 25, 26, 27, 28, 29, 30, 31, 152, 153, 154, 155, 156, 157, 158, 159
    32, 33, 34, 35, 36, 37, 38, 39, 160, 161, 162, 163, 164, 165, 166, 167
    40, 41, 42, 43, 44, 45, 46, 47, 168, 169, 170, 171, 172, 173, 174, 175
    48, 49, 50, 51, 52, 53, 54, 55, 176, 177, 178, 179, 180, 181, 182, 183
    56, 57, 58, 59, 60, 61, 62, 63, 184, 185, 186, 187, 188, 189, 190, 191
    64, 65, 66, 67, 68, 69, 70, 71, 192, 193, 194, 195, 196, 197, 198, 199
    72, 73, 74, 75, 76, 77, 78, 79, 200, 201, 202, 203, 204, 205, 206, 207
    80, 81, 82, 83, 84, 85, 86, 87, 208, 209, 210, 211, 212, 213, 214, 215
    88, 89, 90, 91, 92, 93, 94, 95, 216, 217, 218, 219, 220, 221, 222, 223
    96, 97, 98, 99, 100, 101, 102, 103, 224, 225, 226, 227, 228, 229, 230, 231
    104, 105, 106, 107, 108, 109, 110, 111, 232, 233, 234, 235, 236, 237, 238, 239
    112, 113, 114, 115, 116, 117, 118, 119, 240, 241, 242, 243, 244, 245, 246, 247
    120, 121, 122, 123, 124, 125, 126, 127, 248, 249, 250, 251, 252, 253, 254, 255
  };

  uint8_t i = (y * kMatrixWidth) + x;
  uint8_t j = XYTable[i];
  return j;
}
So a lookup table. I'm not good enough with math to calculate the index from coordinates so this will have to do.

User avatar
Jason_B93
 
Posts: 10
Joined: Thu Nov 17, 2022 2:28 am

Re: Connecting multiple 8x8 NeoPixel panels together

Post by Jason_B93 »

I posted this question on reddit and someone from there was nice enough to reply to me. I'm pasting the code below for anyone else connecting multiple panels together.

Code: Select all

#include <FastLED.h>

#define kMatrixWidth 16
#define kMatrixHeight 16
#define NUM_LEDS ((kMatrixWidth) * (kMatrixHeight))

CRGB leds[NUM_LEDS];

uint16_t XY(int8_t x, int8_t y) {
  if (x >= kMatrixWidth || y >= kMatrixHeight || x < 0 || y < 0)
    return -1;

  // determine which panel this pixel falls on
  const uint8_t panel_size = 8;
  uint8_t x_panel = x / panel_size;
  uint8_t y_panel = y / panel_size;
  // and where in the leds[] array this panel starts
  uint16_t paneloffset = (2 * x_panel + y_panel) * panel_size * panel_size;

  // constrain coordinates to the panel size
  x %= panel_size;
  y %= panel_size;

  // serpentine layout panels have odd rows reversed
  if (y & 1)
    x = panel_size - 1 - x;

  return paneloffset + x + y * panel_size;
}

Locked
Please be positive and constructive with your questions and comments.

Return to “Glowy things (LCD, LED, TFT, EL) purchased at Adafruit”