Hi,
Firstly, thank you for sharing this awesome library. It's the only library that has worked for me so far!
In my setup, I am using an Arduino Nano with a W5500 Lite shield. I have attached a small LED strip with 49 LEDs to it, and it works fine. I want to try to maximize the output of a single output of the Nano and test the boundaries of this library. When I try to send more data, let's say 147 LEDs, this also works fine. However, when I increase the number a little bit more, the maximum number of LEDs seems to be 155. If I go over 155, the animation stops for all LEDs, and nothing is displayed anymore.
I modified the Neopixel example with some more prints, and I am trying to send 3 universes, and each one gets received. However, I can only display 155 LEDs even though there are more than 500 LEDs across 3 universes.
I can't wrap my head around this, and I am hoping you guys have an idea.
`
#include <Artnet.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
/*
- This example works with a w5500 (Lite) module and an arduino nano
- Pinout:
- W5500 (Lite) | Nano
- G (GND) | GND
- V (3,3V) | 3,3V
- M (Miso) | D12
- MO (Mosi) | D11
- SCK (Clock) | D13
- NT (Init) | GND
- RST (Reset) | RST
*/
#include <SPI.h>
#include <Adafruit_NeoPixel.h>
// Neopixel settings
const int numLeds = 155; // change for your setup
const int channelsPerLed = 3;
const int numberOfChannels = numLeds * channelsPerLed; // Total number of channels you want to receive (1 led = 3 channels)
const byte dataPin = 8;
Adafruit_NeoPixel leds = Adafruit_NeoPixel(numLeds, dataPin, NEO_GRB + NEO_KHZ800);
// 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.
const int spi_cs = 5;
// Check if we got all universes
const int maxUniverses = 3; //numberOfChannels / 512 + ((numberOfChannels % 512) ? 1 : 0);
bool universesReceived[maxUniverses];
bool sendFrame = 1;
int previousDataLength = 0;
// Change ip and mac address for your setup
byte ip[] = {192, 168, 178, 199};
byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02};
byte broadcast[] = {192, 168, 178, 255};
void setup()
{
initTest();
Serial.begin(115200);
Ethernet.init(spi_cs); // Most Arduino shields
artnet.begin(mac, ip);
leds.begin();
artnet.setBroadcast(broadcast);
// this will be called for each packet received
artnet.setArtDmxCallback(onDmxFrame);
}
void loop()
{
// we call the read function inside the loop
artnet.read();
}
void onDmxFrame(uint16_t universe, uint16_t length, uint8_t sequence, uint8_t* data, IPAddress remoteIP) {
sendFrame = 1;
// Store which universe has got in
if ((universe - startUniverse) < maxUniverses)
universesReceived[universe - startUniverse] = 1;
// sets flag that all universes got read out
for (int i = 0 ; i < maxUniverses ; i++)
{
if (universesReceived[i] == 0)
{
sendFrame = 0;
break;
}
}
//set_all_leds_black();
int led;
// read universe and put into the right part of the display buffer
for (int i = 0; i < length / channelsPerLed; i++)
{
led = i + (universe - startUniverse) * (previousDataLength / channelsPerLed);
if (led < numLeds) {
if (channelsPerLed == 4)
leds.setPixelColor(led, data[i * channelsPerLed], data[i * channelsPerLed + 1], data[i * channelsPerLed + 2], data[i * channelsPerLed + 3]);
if (channelsPerLed == 3)
leds.setPixelColor(led, data[i * channelsPerLed], data[i * channelsPerLed + 1], data[i * channelsPerLed + 2]);
}
}
Serial.print("led_count: ");
Serial.print(led);
Serial.print(" universe: ");
Serial.print(universe);
Serial.print(" Maxuniverse: ");
Serial.print(maxUniverses);
Serial.print(" Number of LEDs: ");
Serial.print(numLeds);
Serial.print(" rec_arr_length: ");
Serial.println(length);
// Serial.print("Received DMX data: ");
// printArray(data, length);
previousDataLength = length;
if (sendFrame)
{
leds.show();
Serial.println("show");
// Reset universeReceived to 0
memset(universesReceived, 0, maxUniverses);
}
}
`
Hi,
Firstly, thank you for sharing this awesome library. It's the only library that has worked for me so far!
In my setup, I am using an Arduino Nano with a W5500 Lite shield. I have attached a small LED strip with 49 LEDs to it, and it works fine. I want to try to maximize the output of a single output of the Nano and test the boundaries of this library. When I try to send more data, let's say 147 LEDs, this also works fine. However, when I increase the number a little bit more, the maximum number of LEDs seems to be 155. If I go over 155, the animation stops for all LEDs, and nothing is displayed anymore.
I modified the Neopixel example with some more prints, and I am trying to send 3 universes, and each one gets received. However, I can only display 155 LEDs even though there are more than 500 LEDs across 3 universes.
I can't wrap my head around this, and I am hoping you guys have an idea.
`
#include <Artnet.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
/*
*/
#include <SPI.h>
#include <Adafruit_NeoPixel.h>
// Neopixel settings
const int numLeds = 155; // change for your setup
const int channelsPerLed = 3;
const int numberOfChannels = numLeds * channelsPerLed; // Total number of channels you want to receive (1 led = 3 channels)
const byte dataPin = 8;
Adafruit_NeoPixel leds = Adafruit_NeoPixel(numLeds, dataPin, NEO_GRB + NEO_KHZ800);
// 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.
const int spi_cs = 5;
// Check if we got all universes
const int maxUniverses = 3; //numberOfChannels / 512 + ((numberOfChannels % 512) ? 1 : 0);
bool universesReceived[maxUniverses];
bool sendFrame = 1;
int previousDataLength = 0;
// Change ip and mac address for your setup
byte ip[] = {192, 168, 178, 199};
byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02};
byte broadcast[] = {192, 168, 178, 255};
void setup()
{
initTest();
Serial.begin(115200);
Ethernet.init(spi_cs); // Most Arduino shields
artnet.begin(mac, ip);
leds.begin();
artnet.setBroadcast(broadcast);
// this will be called for each packet received
artnet.setArtDmxCallback(onDmxFrame);
}
void loop()
{
// we call the read function inside the loop
artnet.read();
}
void onDmxFrame(uint16_t universe, uint16_t length, uint8_t sequence, uint8_t* data, IPAddress remoteIP) {
sendFrame = 1;
// Store which universe has got in
if ((universe - startUniverse) < maxUniverses)
universesReceived[universe - startUniverse] = 1;
// sets flag that all universes got read out
for (int i = 0 ; i < maxUniverses ; i++)
{
if (universesReceived[i] == 0)
{
sendFrame = 0;
break;
}
}
//set_all_leds_black();
int led;
// read universe and put into the right part of the display buffer
for (int i = 0; i < length / channelsPerLed; i++)
{
led = i + (universe - startUniverse) * (previousDataLength / channelsPerLed);
if (led < numLeds) {
if (channelsPerLed == 4)
leds.setPixelColor(led, data[i * channelsPerLed], data[i * channelsPerLed + 1], data[i * channelsPerLed + 2], data[i * channelsPerLed + 3]);
if (channelsPerLed == 3)
leds.setPixelColor(led, data[i * channelsPerLed], data[i * channelsPerLed + 1], data[i * channelsPerLed + 2]);
}
}
Serial.print("led_count: ");
Serial.print(led);
Serial.print(" universe: ");
Serial.print(universe);
Serial.print(" Maxuniverse: ");
Serial.print(maxUniverses);
Serial.print(" Number of LEDs: ");
Serial.print(numLeds);
Serial.print(" rec_arr_length: ");
Serial.println(length);
// Serial.print("Received DMX data: ");
// printArray(data, length);
previousDataLength = length;
if (sendFrame)
{
leds.show();
Serial.println("show");
// Reset universeReceived to 0
memset(universesReceived, 0, maxUniverses);
}
}
`