Artnet and ObjectFLED

cat

Well-known member
Has anyone made any progress on this yet, I'm trying to port my last working OctoWS over, and can't work out how to make it work with FastLed, the new versions of artnet library I can't work out how to make the library work with multiple universes/pins, and with the old one, FASTled is complaining. The multi output Object fled examples don't seem to help either. As I'm only a part time arduino user, I'm unsure of where to start, new artnet libaries and fastled, or teenys artnet library, and then I can't get form octoWs to fastled. Which is the recomend path to take?

this is my last 32 pin OctoWS version, which does use Fastled but also octoWS

Code:
/*
This example will receive multiple universes via Artnet and control a strip of ws2811 leds via
Paul Stoffregen's excellent OctoWS2811 library: https://www.pjrc.com/teensy/td_libs_OctoWS2811.html
This example may be copied under the terms of the MIT license, see the LICENSE file for details
*/
#define SKETCH "32outputs"
// edit artnet.h to change etherent to NativeEthernet
#include <Artnet.h>

//#include <NativeEthernet.h>
//#include <NativeEthernetUdp.h>
#include <SPI.h>
#include <OctoWS2811.h>
#include <FastLED.h>

#define ETHERNET_BUFFER 540
// Change ip and mac address for your setup
byte ip[] = {2, 0, 0, 5};
byte broadcast[] = {2, 0, 0, 255};

const int ledsPerStrip = 340; // change for your setup 680 4 uni
const byte numStrips= 32; // change for your setup and uncomment below the pin list

//byte pinList[numStrips] = {2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,16,27,28,29,30,31,35,36,37,38,39,40,41,42,43,44,45}; //listed sequentially, can be changed to meet hardware needs
//byte pinList[numStrips] = {37,36,35,34,15,14,39,38,19,18,17,16,23,22,21,20} ;//pinout order for the DTG WS2811 with the adamtech 4xRJ45 Ports
//byte pinList[30] = {37,36,35,34,15,14,39,38,19,18,17,16,23,22,21,20,9,8,7,6,13,12,11,10,27,26,25,24,32,31} ;// 30 outs //no 32 pinout order for the DTG WS2811 with the ada
// byte pinList[12] = {34,35,36,37,38,39,14,15,16,17,18,19}; //pinout order for shop
  byte pinList[32] = {34,35,36,37,38,39,14,15,16,17,18,19,20,21,22,23,6,7,8,9,10,11,12,13,24,25,26,27,28,30,31,32}; //pinout order for DTG WS2811 \
//byte pinList[numStrips] = {37,36,35,34};

// OctoWS2811 settings

const int numLeds = ledsPerStrip * numStrips;
const int numberOfChannels = numLeds * 3; // Total number of channels you want to receive (1 led = 3 channels)
//DMAMEM int displayMemory[ledsPerStrip*6];
//int drawingMemory[ledsPerStrip*6];
const int config = WS2811_GRB | WS2811_800kHz;
//OctoWS2811 leds(ledsPerStrip, displayMemory, drawingMemory, config);

// Artnet settings
Artnet artnet;
const int startUniverse = 0; // CHANGE FOR YOUR SETUP most software this is 1, some software send out artnet first universe as 0.

// Check if we got all universes
const int maxUniverses = numberOfChannels / 512 + ((numberOfChannels % 512) ? 1 : 0);
bool universesReceived[maxUniverses];
bool sendFrame = 1;
int previousDataLength = 0;

//set up OctoWS2811 and FastLED for Teensy 4.1



//byte mac[] = {0x04, 0xE9, 0xE5, 0x00, 0x69, 0xEC};
uint8_t mac[6]; //this is determined from the Teensy 4.1 board.

CRGB rgbarray[numStrips * ledsPerStrip];

  // These buffers need to be large enough for all the pixels.
  // The total number of pixels is "ledsPerStrip * numStrips".
  // Each pixel needs 3 bytes, so multiply by 3.  An "int" is
  // 4 bytes, so divide by 4.  The array is created using "int"
  // so the compiler will align it to 32 bit memory.
DMAMEM int displayMemory[ledsPerStrip * numStrips * 3 / 4];
int drawingMemory[ledsPerStrip * numStrips * 3 / 4];

OctoWS2811 octo(ledsPerStrip, displayMemory, drawingMemory, WS2811_GRB | WS2811_800kHz, numStrips, pinList);

template <EOrder RGB_ORDER = RGB,
          uint8_t CHIP = WS2811_800kHz>
class CTeensy4Controller : public CPixelLEDController<RGB_ORDER, 8, 0xFF>
{
    OctoWS2811 *pocto;

public:
    CTeensy4Controller(OctoWS2811 *_pocto)
        : pocto(_pocto){};

    virtual void init() {}
    virtual void showPixels(PixelController<RGB_ORDER, 8, 0xFF> &pixels)
    {

        uint32_t i = 0;
        while (pixels.has(1))
        {
            uint8_t r = pixels.loadAndScale0();
            uint8_t g = pixels.loadAndScale1();
            uint8_t b = pixels.loadAndScale2();
            pocto->setPixel(i++, r, g, b);
            pixels.stepDithering();
            pixels.advanceData();
        }

        pocto->show();
    }
};
CTeensy4Controller<RGB, WS2811_800kHz> *pcontroller;

char IpString[4];


/////////////////////////////////////////////////////////////////////////////////
void setup()
{
  Serial.println(SKETCH);
    teensyMAC(mac);
   
Ethernet.begin(mac, ip);

  // Check for Ethernet hardware present
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // do nothing, no point running without Ethernet hardware
    }
  }
 
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
  }

  Serial.println(Ethernet.localIP());

//  artnet.setBroadcast(broadcast);
  artnet.begin(mac, ip);
//  leds.begin();
    octo.begin();
  pcontroller = new CTeensy4Controller<RGB, WS2811_800kHz>(&octo);

  FastLED.addLeds(pcontroller, rgbarray, numStrips * ledsPerStrip);
  FastLED.setBrightness(180);
 
  initTest();

  // this will be called for each packet received
  artnet.setArtDmxCallback(onDmxFrame);
Serial.println("SetupDone");
 
}

void loop()
{
  // we call the read function inside the loop
  artnet.read();
 
//  initTest();

}

void onDmxFrame(uint16_t universe, uint16_t length, uint8_t sequence, uint8_t* data, IPAddress remoteIP)
{
  sendFrame = 1;
  Serial.println(universe);
  // Store which universe has got in
  if ((universe - startUniverse) < maxUniverses)
    universesReceived[universe - startUniverse] = 1;

  for (int i = 0 ; i < maxUniverses ; i++)
  {
    if (universesReceived[i] == 0)
    {
      sendFrame = 0;
      break;
    }
  }

  // read universe and put into the right part of the display buffer
  for (int i = 0; i < length / 3; i++)
  {
    int led = i + (universe - startUniverse) * (previousDataLength / 3);
    if (led < numLeds)
      octo.setPixel(led, data[i * 3], data[i * 3 + 1], data[i * 3 + 2]);
  }
  previousDataLength = length;

  if (sendFrame)
  {
   octo.show();
//   Serial.println("Show");
    // Reset universeReceived to 0
    memset(universesReceived, 0, maxUniverses);
  }
}

void initTest()
{
  Serial.println("Test");
  for (int i = 0 ; i < numLeds ; i++)
    octo.setPixel(i, 127, 0, 0);
  octo.show();
  delay(500);
  for (int i = 0 ; i < numLeds  ; i++)
    octo.setPixel(i, 0, 127, 0);
  octo.show();
  delay(500);
  for (int i = 0 ; i < numLeds  ; i++)
    octo.setPixel(i, 0, 0, 127);
  octo.show();
  delay(500);
  for (int i = 0 ; i < numLeds  ; i++)
    octo.setPixel(i, 0, 0, 0);
  octo.show();
}


  void teensyMAC(uint8_t *mac) {
    for(uint8_t by=0; by<2; by++) mac[by]=(HW_OCOTP_MAC1 >> ((1-by)*8)) & 0xFF;
    for(uint8_t by=0; by<4; by++) mac[by+2]=(HW_OCOTP_MAC0 >> ((3-by)*8)) & 0xFF;
    Serial.printf("MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
}
 
So this works for 3 universes, and another couple occasional updates, I guess I need to fill a universe buffer and then call show as octws did,
Which gets sketched out here
// this can be achieved manually as follows
// if Artnet packet comes to this universe, this function (lambda) is called
// artnet.subscribeArtDmxUniverse(universe, [&](const uint8_t* data, uint16_t size, const ArtDmxMetadata &metadata, const ArtNetRemoteInfo &remote) {
// // set led
// // artnet data size per packet is 512 max
// // so there is max 170 pixel per packet (per universe)
// for (size_t pixel = 0; pixel < NUM_LEDS; ++pixel) {
// size_t idx = pixel * 3;
// leds[pixel].r = data[idx + 0];
// leds[pixel].g = data[idx + 1];
// leds[pixel].b = data[idx + 2];
// }
// });

But its not exactly clear what, where to do this, its in the setup in the example, but I guess it needs to be a function in the main code, but do you call it by artnet.subscribeArtDmxUniverse, but presumably thats a prefigured function, and you need to parse the universes into it...




#include <FastLED.h> // include FastLED *before* Artnet
#define SKETCH "recieve_fastled_T4.1"
// Please include ArtnetEther.h to use Artnet on the platform
// which can use both WiFi and Ethernet
// #include <ArtnetEther.h>
#include <ArtnetNativeEther.h> // only for Teensy 4.1
// this is also valid for other platforms which can use only Ethernet
// #include <Artnet.h>
// Ethernet stuff
const IPAddress ip(192, 168, 0, 15);
// uint8_t mac[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB};
uint8_t mac[6]; //this is determined from the Teensy 4.1 board.
ArtnetReceiver artnet;
uint16_t universe = 0; // 0 - 15


// FastLED
#define NUM_LEDS 170
const uint8_t PIN_LED_DATA = 0;

CRGB leds0[NUM_LEDS ]; // make buffer pre controller
CRGB leds1[NUM_LEDS ];
CRGB leds2[NUM_LEDS ];
CRGB leds3[NUM_LEDS ];
CRGB leds4[NUM_LEDS ];
CRGB leds5[NUM_LEDS ];
CRGB leds6[NUM_LEDS ];
CRGB leds7[NUM_LEDS ];
// CRGB leds8[NUM_LEDS ];
// CRGB leds9[NUM_LEDS ];
// CRGB leds10[NUM_LEDS ];
// CRGB leds11[NUM_LEDS ];
// CRGB leds12[NUM_LEDS ];
// CRGB leds13[NUM_LEDS ];
// CRGB leds14[NUM_LEDS ];
// CRGB leds15[NUM_LEDS ];
// CRGB leds16[NUM_LEDS ];
// CRGB leds17[NUM_LEDS ]; // make buffer pre controller
// CRGB leds18[NUM_LEDS ];
// CRGB leds19[NUM_LEDS ];
// CRGB leds20[NUM_LEDS ];
// CRGB leds21[NUM_LEDS ];
// CRGB leds22[NUM_LEDS ];
// CRGB leds23[NUM_LEDS ];
// CRGB leds24[NUM_LEDS ];
// CRGB leds25[NUM_LEDS ];
// CRGB leds26[NUM_LEDS ];
// CRGB leds27[NUM_LEDS ];
// CRGB leds28[NUM_LEDS ];
// CRGB leds29[NUM_LEDS ];
// CRGB leds30[NUM_LEDS ];
// CRGB leds31[NUM_LEDS ];

void setup() {
Serial.begin(115200);
delay(2000);
Serial.println(SKETCH);
teensyMAC(mac);
Ethernet.begin(mac, ip);
Serial.println(Ethernet.localIP());

FastLED.addLeds<WS2812, PIN_LED_DATA+0 >(leds0, NUM_LEDS);
FastLED.addLeds<WS2812, PIN_LED_DATA+1 >(leds1, NUM_LEDS);
FastLED.addLeds<WS2812, PIN_LED_DATA+2 >(leds2, NUM_LEDS);
FastLED.addLeds<WS2812, PIN_LED_DATA+3 >(leds3, NUM_LEDS);
FastLED.addLeds<WS2812, PIN_LED_DATA+4 >(leds4, NUM_LEDS);
FastLED.addLeds<WS2812, PIN_LED_DATA+5 >(leds5, NUM_LEDS);
FastLED.addLeds<WS2812, PIN_LED_DATA+6 >(leds6, NUM_LEDS);
FastLED.addLeds<WS2812, PIN_LED_DATA+7 >(leds7, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+8 >(leds8, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+9 >(leds9, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+10 >(leds10, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+11 >(leds11, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+12 >(leds12, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+13 >(leds13, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+14 >(leds14, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+15 >(leds15, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+16 >(leds16, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+17 >(leds17, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+18 >(leds18, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+19 >(leds19, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+20 >(leds20, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+21 >(leds21, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+22 >(leds22, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+23 >(leds23, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+24 >(leds24, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+25 >(leds25, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+26 >(leds26, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+27 >(leds27, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+28 >(leds28, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+39 >(leds29, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+30 >(leds30, NUM_LEDS);
// FastLED.addLeds<WS2812, PIN_LED_DATA+31 >(leds31, NUM_LEDS);

// FastLED.addLeds<NEOPIXEL, PIN_LED_DATA>(leds, NUM_LEDS);

// Ethernet.begin(mac, ip);
artnet.begin();
// if Artnet packet comes to this universe, forward them to fastled directly
artnet.forwardArtDmxDataToFastLED(universe + 0, leds0, NUM_LEDS);
artnet.forwardArtDmxDataToFastLED(universe + 1, leds1, NUM_LEDS);
artnet.forwardArtDmxDataToFastLED(universe + 2, leds2, NUM_LEDS);
artnet.forwardArtDmxDataToFastLED(universe + 3, leds3, NUM_LEDS);
artnet.forwardArtDmxDataToFastLED(universe + 4, leds4, NUM_LEDS);
artnet.forwardArtDmxDataToFastLED(universe + 5, leds5, NUM_LEDS);
artnet.forwardArtDmxDataToFastLED(universe + 6, leds6, NUM_LEDS);
artnet.forwardArtDmxDataToFastLED(universe + 7, leds7, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 8, leds8, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 9, leds9, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 10, leds10, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 11, leds11, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 12, leds12, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 13, leds13, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 14, leds14, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 15, leds15, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 16, leds16, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 17, leds17, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 18, leds18, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 19, leds19, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 20, leds20, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 21, leds21, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 22, leds22, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 23, leds23, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 24, leds24, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 25, leds25, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 26, leds26, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 27, leds27, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 28, leds28, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 29, leds29, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 30, leds30, NUM_LEDS);
// artnet.forwardArtDmxDataToFastLED(universe + 31, leds31, NUM_LEDS);
// this can be achieved manually as follows
// if Artnet packet comes to this universe, this function (lambda) is called
// artnet.subscribeArtDmxUniverse(universe, [&](const uint8_t* data, uint16_t size, const ArtDmxMetadata &metadata, const ArtNetRemoteInfo &remote) {
// // set led
// // artnet data size per packet is 512 max
// // so there is max 170 pixel per packet (per universe)
// for (size_t pixel = 0; pixel < NUM_LEDS; ++pixel) {
// size_t idx = pixel * 3;
// leds[pixel].r = data[idx + 0];
// leds[pixel].g = data[idx + 1];
// leds[pixel].b = data[idx + 2];
// }
// });

// artnet.setLogger(&Serial);
}
void loop() {
artnet.parse(); // check if artnet packet has come and execute callback
FastLED.show();
}


//define mac address of board
void teensyMAC(uint8_t *mac) {
static char teensyMac[23];

#if defined(HW_OCOTP_MAC1) && defined(HW_OCOTP_MAC0)
Serial.println("using HW_OCOTP_MAC* - see https://forum.pjrc.com/threads/57595-Serial-amp-MAC-Address-Teensy-4-0");
for(uint8_t by=0; by<2; by++) mac[by]=(HW_OCOTP_MAC1 >> ((1-by)*8)) & 0xFF;
for(uint8_t by=0; by<4; by++) mac[by+2]=(HW_OCOTP_MAC0 >> ((3-by)*8)) & 0xFF;
#define MAC_OK
#else

mac[0] = 0x04;
mac[1] = 0xE9;
mac[2] = 0xE5;
uint32_t SN=0;
__disable_irq();

#if defined(HAS_KINETIS_FLASH_FTFA) || defined(HAS_KINETIS_FLASH_FTFL)
Serial.println("using FTFL_FSTAT_FTFA - vis teensyID.h - see https://github.com/sstaub/TeensyID/blob/master/TeensyID.h");

FTFL_FSTAT = FTFL_FSTAT_RDCOLERR | FTFL_FSTAT_ACCERR | FTFL_FSTAT_FPVIOL;
FTFL_FCCOB0 = 0x41;
FTFL_FCCOB1 = 15;
FTFL_FSTAT = FTFL_FSTAT_CCIF;
while (!(FTFL_FSTAT & FTFL_FSTAT_CCIF)) ; // wait
SN = *(uint32_t *)&FTFL_FCCOB7;
#define MAC_OK

#elif defined(HAS_KINETIS_FLASH_FTFE)
Serial.println("using FTFL_FSTAT_FTFE - vis teensyID.h - see https://github.com/sstaub/TeensyID/blob/master/TeensyID.h");

kinetis_hsrun_disable();
FTFL_FSTAT = FTFL_FSTAT_RDCOLERR | FTFL_FSTAT_ACCERR | FTFL_FSTAT_FPVIOL;
*(uint32_t *)&FTFL_FCCOB3 = 0x41070000;
FTFL_FSTAT = FTFL_FSTAT_CCIF;
while (!(FTFL_FSTAT & FTFL_FSTAT_CCIF)) ; // wait
SN = *(uint32_t *)&FTFL_FCCOBB;
kinetis_hsrun_enable();
#define MAC_OK

#endif

__enable_irq();
for(uint8_t by=0; by<3; by++) mac[by+3]=(SN >> ((2-by)*8)) & 0xFF;
#endif
#ifdef MAC_OK
sprintf(teensyMac, "MAC: %02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
Serial.println(teensyMac);
#else
Serial.println("ERROR: could not get MAC");
#endif
}
 
I feel like this should work, it uses teensydunio artnet library but now I get 0.0.0.0 IP address, I've tried changing the artnet.h to QNethernet but that hasn't helped.
Mainloop is running, but of course with a null IP, it receives no data. No idea how to troubleshoot this. I've tried the other artnet examples and get 0.0.0.0 as well.
 

Attachments

  • receive_fastled_T4_1__1Array_ManyStrips.ino
    5.1 KB · Views: 67
Last edited:
I've tried rolling back teeensyduino and resinstalling the latest. QNethernet help patches give me an IP so hardware is fine (and the library version of artnet) but the teensyduino artnet gives me no IP address, tested with this bare bones patch. How do I fix or troubleshoot this?

/*
This is a basic example that will print out the header and the content of an ArtDmx packet.
This example uses the read() function and the different getter functions to read the data.
This example may be copied under the terms of the MIT license, see the LICENSE file for details
*/
#include <Artnet.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <SPI.h>
Artnet artnet;
// Change ip and mac address for your setup
byte ip[] = {192, 168, 0, 2};
byte mac[] = {0x04, 0xE9, 0xE5, 0x00, 0x69, 0xEC};
void setup()
{
Serial.begin(115200);
artnet.begin(mac, ip);
Serial.println(Ethernet.localIP());
}
void loop()
{
if (artnet.read() == ART_DMX)
{
// print out our data
Serial.print("universe number = ");
Serial.print(artnet.getUniverse());
Serial.print("\tdata length = ");
Serial.print(artnet.getLength());
Serial.print("\tsequence n0. = ");
Serial.println(artnet.getSequence());
Serial.print("DMX data: ");
for (unsigned int i = 0 ; i < artnet.getLength() ; i++)
{
Serial.print(artnet.getDmxFrame());
Serial.print(" ");
}
Serial.println();
Serial.println();
}
}
 
I gave up trying to use the IDE and went to 1.8.19, and got this to work kind of, it gets an IP address, it receives data, but only gets 3 of the 8 universes I'm sending and the very occasional time it gets to show, the strips don't update anyway, so there are more problems to solve after the 'easy bit' of getting artnet to work. Tried using the IDE with the same sketch and of course again get no IP address, presumably beause nativeetherent doesn't work. I've also tried QNethernet in IDE with the teensy artnet library, but again I can't get that working. I could really do with someone chipping in with a youre doing this wrong... Does no one use artnet anymore? All my previous artnet sketches fail to compile in recent versions/libraries. I did try and force the IDE to use 1,8 artnet library, but needless to say that also failed. Should I keep on with 1.8 (and does fastled still support it?) or should I be using the IDE?
 

Attachments

  • receive_fastled_T4_1__1Array_ManyStrips_working1_8.19.ino
    5.3 KB · Views: 53
So here is a working 40 output sketch using fastled. The artent header is included to use qnehterent, and that needs to live in
C:\Users\YOUR_NAME\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.59.0\libraries\Artnet I got caught out by that early on in this thread. I get 60fps with 1 or 2 universes per output, and 30fps with 3 universes. Seems plenty. You can obviously change the pin numbers. And if anyone works out how to use a pin list and loose having to define all the controllers individually, let me know. Be aware it needs to receive all its universes before update is called. I did try and get hideakitai's artnet working, but I couldn't receive many universes, I don't know why seemed to max out a 3. Too dyslexic to try and work out why. 20,000 pixels though, fun times.
 

Attachments

  • IDE_FASTLED_40.zip
    3.8 KB · Views: 57
Back
Top