Speicher zu voll?

Hallo zusammen,
Ich baue gerade eine LED Matrix mit 24x16=384 LEDs. Da die LEDs elektrisch nicht in der richtigen Rheinfolge sind habe ich sie in einer Tabelle neu zugeordnet. Das funktioniert auch super solange ich nicht mehr als 357 Einträge in der Tabelle habe. Ab 358 Einträgen lässt sich das Programm zwar übertragen aber es passiert nichts (Program kommt noch nicht mal ins Setup)
Ich vermute das der Speicher voll ist oder sowas. Mein Frage: Ich benutze einen Arduino Uno, würde es eventuell mit einem anderen Arduino z.B. Mega funktionieren?

Oder gibt es einen anderen weg die LEDs zu sortieren?

#include <Adafruit_NeoPixel.h>
#define LED_PIN    3
#define LED_COUNT 384
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

int neoNr [] = {256,257,258,259,260,261,262,263,  128,129,130,131,132,133,134,135,  0,1,2,3,4,5,6,7,
   264,265,266,267,268,269,270,271,  136,137,138,139,140,141,142,143,  8,9,10,11,12,13,14,15,
   272,273,274,275,276,277,278,279,  144,145,146,147,148,149,150,151,  16,17,18,19,20,21,22,23,
   280,281,282,283,284,285,286,287,  152,153,154,155,156,157,158,159,  24,25,26,27,28,29,30,31,
   288,289,290,291,292,293,294,295,  160,161,162,163,164,165,166,167,  32,33,34,35,36,37,38,39,
   296,297,298,299,300,301,302,303,  168,169,170,171,172,173,174,175,  40,41,42,43,44,45,46,47,
   304,305,306,307,308,309,310,311,  176,177,178,179,180,181,182,183,  48,49,50,51,52,53,54,55,
   312,313,314,315,316,317,318,319,  184,185,186,187,188,189,190,191,  56,57,58,59,60,61,62,63,
              
   320,321,322,323,324,325,326,327,  192,193,194,195,196,197,198,199,  64,65,66,67,68,69,70,71,
   328,329,330,331,332,333,334,335,  200,201,202,203,204,205,206,207,  72,73,74,75,76,77,78,79,
   336,337,338,339,340,341,342,343,  208,209,210,211,212,213,214,215,  80,81,82,83,84,85,86,87,
   344,345,346,347,348,349,350,351,  216,217,218,219,220,221,222,223,  88,89,90,91,92,93,94,95,
   352,353,354,355,356,357,358,359,  224,225,226,227,228,229,230,231,  96,97,98,99,100,101,102,103,
   360,361,362,363,364,365,366,367,  232,233,234,235,236,237,238,239,  104,105,106,107,108,109,110,111,
   368,369,370,371,372,373,374,375,  240,241,242,243,244,245,246,247,  112,113,114,115,116,117,118,119,
   376,377,378,379,380,381,382,383,  248,249,250,251,252,253,254,255,  120,121,122,123,124,125,126,127};
              
void setup() 
{
  strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)
  strip.show();            // Turn OFF all pixels ASAP
  strip.setBrightness(255); // Set BRIGHTNESS  (max = 255)

}

void loop() 
{
  for(int n = 0; n<= 383;n++)
  {
    strip.setPixelColor(neoNr[n], strip.gamma32(strip.ColorHSV(55000,255,30)));
    delay(100);
    strip.show();
  }
  delay(3000);
  strip.clear();
}

(deleted)

2 Byte pro Tabelleneintrag
3 Farbbyte pro Pixel
Macht 5*384=1920Byte

Damit bleibt kaum/kein Platz mehr für was anderes.
Zuwenig!
Das sollte dir die IDE auch melden.

Also PROGMEM, oder ein Mega.
Selbst mit Progmem wirds auf dem UNO arg eng

da sind ja eh viele aufeinanderfolgend.

Mach dir eine Tabelle und schreibe mal die Werte nebeneinander, dann findest vermutlich auch eine Formel dafür
irgenwas in 8er Guppen.

Excel hat den schönen Vorteil dass du dann in einer dritten Spalte eine Formel selber ausprobieren kannst und deine 384 LEDs vergleichen kannst…

edit:
schritt 1 erspart mal das abtippen:

int neoNr [] = {256, 257, 258, 259, 260, 261, 262, 263,  128, 129, 130, 131, 132, 133, 134, 135,  0, 1, 2, 3, 4, 5, 6, 7,
                264, 265, 266, 267, 268, 269, 270, 271,  136, 137, 138, 139, 140, 141, 142, 143,  8, 9, 10, 11, 12, 13, 14, 15,
                272, 273, 274, 275, 276, 277, 278, 279,  144, 145, 146, 147, 148, 149, 150, 151,  16, 17, 18, 19, 20, 21, 22, 23,
                280, 281, 282, 283, 284, 285, 286, 287,  152, 153, 154, 155, 156, 157, 158, 159,  24, 25, 26, 27, 28, 29, 30, 31,
                288, 289, 290, 291, 292, 293, 294, 295,  160, 161, 162, 163, 164, 165, 166, 167,  32, 33, 34, 35, 36, 37, 38, 39,
                296, 297, 298, 299, 300, 301, 302, 303,  168, 169, 170, 171, 172, 173, 174, 175,  40, 41, 42, 43, 44, 45, 46, 47,
                304, 305, 306, 307, 308, 309, 310, 311,  176, 177, 178, 179, 180, 181, 182, 183,  48, 49, 50, 51, 52, 53, 54, 55,
                312, 313, 314, 315, 316, 317, 318, 319,  184, 185, 186, 187, 188, 189, 190, 191,  56, 57, 58, 59, 60, 61, 62, 63,

                320, 321, 322, 323, 324, 325, 326, 327,  192, 193, 194, 195, 196, 197, 198, 199,  64, 65, 66, 67, 68, 69, 70, 71,
                328, 329, 330, 331, 332, 333, 334, 335,  200, 201, 202, 203, 204, 205, 206, 207,  72, 73, 74, 75, 76, 77, 78, 79,
                336, 337, 338, 339, 340, 341, 342, 343,  208, 209, 210, 211, 212, 213, 214, 215,  80, 81, 82, 83, 84, 85, 86, 87,
                344, 345, 346, 347, 348, 349, 350, 351,  216, 217, 218, 219, 220, 221, 222, 223,  88, 89, 90, 91, 92, 93, 94, 95,
                352, 353, 354, 355, 356, 357, 358, 359,  224, 225, 226, 227, 228, 229, 230, 231,  96, 97, 98, 99, 100, 101, 102, 103,
                360, 361, 362, 363, 364, 365, 366, 367,  232, 233, 234, 235, 236, 237, 238, 239,  104, 105, 106, 107, 108, 109, 110, 111,
                368, 369, 370, 371, 372, 373, 374, 375,  240, 241, 242, 243, 244, 245, 246, 247,  112, 113, 114, 115, 116, 117, 118, 119,
                376, 377, 378, 379, 380, 381, 382, 383,  248, 249, 250, 251, 252, 253, 254, 255,  120, 121, 122, 123, 124, 125, 126, 127
               };


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  for (size_t i = 0; i < sizeof(neoNr)/2; i++)
  {
    Serial.print(i);
    Serial.print("\t");
    Serial.print(neoNr[i]);
    Serial.println();
  }
}

void loop() {
  // put your main code here, to run repeatedly:

}

edit: wäre ein Switch case mit 42 cases akzeptabel?

int convert(int in)
{
  switch (in)
  {
    case 0 ... 7 :
      return in + 256;
    case 8 ... 15 :
      return in + 120;
    case 16 ... 31 :
      return in - 16;
      // usw
  }
}

Woooow danke für die Superschnellen antworten.

Schaue dir mal PROGMEN an.

Habs mir angeschaut, sieht für mich sehr kompliziert aus. Würde ich versuchen wenn ihr sagt das ein anderer Arduino keine option ist.

2 Byte pro Tabelleneintrag
3 Farbbyte pro Pixel
Macht 5*384=1920Byte

Damit bleibt kaum/kein Platz mehr für was anderes.
Zuwenig!
Das sollte dir die IDE auch melden.

Nö meldet nix. Kompiliert und überträgt ohne Fehler.

Also PROGMEM, oder ein Mega.
Selbst mit Progmem wirds auf dem UNO arg eng

was wäre der beste Arduino dafür? Der Mega? oder gibt es noch was besseres?

da sind ja eh viele aufeinanderfolgend.

Mach dir eine Tabelle und schreibe mal die Werte nebeneinander, dann findest vermutlich auch eine Formel dafür
irgenwas in 8er Guppen.

Hab ich gemacht, und wenn du schaust hab ich sie auch in dem Script in 8x8 Blöcken angeordnet. Aber auf ne Formel bin ich nicht gekommen.
Vielen Dank Für die Super schnellen und guten Antworten
Dirk

edit: wäre ein Switch case mit 42 cases akzeptabel?

int convert(int in)
{
  switch (in)
  {
    case 0 ... 7 :
      return in + 256;
    case 8 ... 15 :
      return in + 120;
    case 16 ... 31 :
      return in - 16;
      // usw
  }
}

Das wäre möglich aber das sind 48 cases macht das die Sache wirklich besser? Ist das nicht genauso doof für den Arduino?

Doof ist das schon, irgendwie....
Aber dem Arduino macht das nichts.

was wäre der beste Arduino dafür? Der Mega? oder gibt es noch was besseres?

Hmm...
Soll ich jetzt alle Arduinos aufzählen, welche das können?
Kann ich gar nicht....
Bin nicht intim mit allen.

Es sieht komplizierter aus als es ist:

const int neoNr[] PROGMEM = { 256,257,258,259,260,261,262,263 };

void setup()
{
  Serial.begin(115200);
  Serial.println(F("PROGMEM"));

  for (unsigned int i = 0; i < sizeof(neoNr) / sizeof(neoNr[0]); i++)
    Serial.println(pgm_read_word(&neoNr[i]));
}


void loop() 
{ 
}

Du musst nur das Array als PROGMEM deklarieren. Und beim Auslesen pgm_read_word() verwenden, welchem man die Adresse des Werts übergibt

Ist das nicht genauso doof für den Arduino?

Dem Arduino sind die 48 Cases egal.

Hab ich gemacht, und wenn du schaust hab ich sie auch in dem Script in 8x8 Blöcken angeordnet. Aber auf ne Formel bin ich nicht gekommen.

dann probier mal das was ich geschrieben habe. Gib das mal in eine Tabelle und schau dir die Werte an. Da siehst ein Muster.

Steckst noch ein wenig Hirnschmalz rein.

Imho gehts auch mit 3 If und 3 Formeln.

die erste der 3 Gruppen geht so:

// EXCEL!!!
=A2+256-((INT(A2/8)-INT(INT(A2/8)/3))*8)

funktioniert für alle Indexe die

// wieder Excel
MOD(INT(A2/8);3) = 0

sind.

lässt sich vermutlich auch noch einkürzen, aber soll ja nur beweisen, dass das geht.

Du musst nur das Array als PROGMEM deklarieren. Und beim Auslesen pgm_read_word() verwenden, welchem man die Adresse des Werts übergibt

ok sieht doch nicht so kompliziert aus, werde ich versuchen, trotz allem glaube ich das bezogen auf was ich noch vorhabe der Mega die bessere Wahl wäre. Wenn ich also die nächsten Zeit nicht antworte liegt es da drann das ich im Auto zum Conrad sitze :slight_smile:

nachdem ich gesehen habe, dass sich nur die Offsets der 3 Gruppen unterscheiden (256, 128, 0), habe ich jetzt quasi einen Einzeiler:

//https://forum.arduino.cc/index.php?topic=716810.new#new
// by noiasca

int neoNr [] = {256, 257, 258, 259, 260, 261, 262, 263,  128, 129, 130, 131, 132, 133, 134, 135,  0, 1, 2, 3, 4, 5, 6, 7,
                264, 265, 266, 267, 268, 269, 270, 271,  136, 137, 138, 139, 140, 141, 142, 143,  8, 9, 10, 11, 12, 13, 14, 15,
                272, 273, 274, 275, 276, 277, 278, 279,  144, 145, 146, 147, 148, 149, 150, 151,  16, 17, 18, 19, 20, 21, 22, 23,
                280, 281, 282, 283, 284, 285, 286, 287,  152, 153, 154, 155, 156, 157, 158, 159,  24, 25, 26, 27, 28, 29, 30, 31,
                288, 289, 290, 291, 292, 293, 294, 295,  160, 161, 162, 163, 164, 165, 166, 167,  32, 33, 34, 35, 36, 37, 38, 39,
                296, 297, 298, 299, 300, 301, 302, 303,  168, 169, 170, 171, 172, 173, 174, 175,  40, 41, 42, 43, 44, 45, 46, 47,
                304, 305, 306, 307, 308, 309, 310, 311,  176, 177, 178, 179, 180, 181, 182, 183,  48, 49, 50, 51, 52, 53, 54, 55,
                312, 313, 314, 315, 316, 317, 318, 319,  184, 185, 186, 187, 188, 189, 190, 191,  56, 57, 58, 59, 60, 61, 62, 63,

                320, 321, 322, 323, 324, 325, 326, 327,  192, 193, 194, 195, 196, 197, 198, 199,  64, 65, 66, 67, 68, 69, 70, 71,
                328, 329, 330, 331, 332, 333, 334, 335,  200, 201, 202, 203, 204, 205, 206, 207,  72, 73, 74, 75, 76, 77, 78, 79,
                336, 337, 338, 339, 340, 341, 342, 343,  208, 209, 210, 211, 212, 213, 214, 215,  80, 81, 82, 83, 84, 85, 86, 87,
                344, 345, 346, 347, 348, 349, 350, 351,  216, 217, 218, 219, 220, 221, 222, 223,  88, 89, 90, 91, 92, 93, 94, 95,
                352, 353, 354, 355, 356, 357, 358, 359,  224, 225, 226, 227, 228, 229, 230, 231,  96, 97, 98, 99, 100, 101, 102, 103,
                360, 361, 362, 363, 364, 365, 366, 367,  232, 233, 234, 235, 236, 237, 238, 239,  104, 105, 106, 107, 108, 109, 110, 111,
                368, 369, 370, 371, 372, 373, 374, 375,  240, 241, 242, 243, 244, 245, 246, 247,  112, 113, 114, 115, 116, 117, 118, 119,
                376, 377, 378, 379, 380, 381, 382, 383,  248, 249, 250, 251, 252, 253, 254, 255,  120, 121, 122, 123, 124, 125, 126, 127
               };


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  for (size_t i = 0; i < sizeof(neoNr) / 2; i++)
  {
    Serial.print(i);
    Serial.print("\t");
    Serial.print(neoNr[i]);

    Serial.print("\t");
    Serial.print(convert(i));
    if (neoNr[i] == convert(i))
      Serial.print (" OK");
    Serial.println();
  }
}

void loop() {
  // put your main code here, to run repeatedly:

}

int convert(int in)
{
  // =A2+256-((INT(A2/8)-INT(INT(A2/8)/3))*8)
  // =(2-(MOD(INT(A2/8);3)))*128
  int out = in + (2 - in / 8 % 3) * 128 - ((in / 8) - ((in / 8) / 3)) * 8;
  return  out;
}


13 133 133 OK
14 134 134 OK
15 135 135 OK
16 0 0 OK
17 1 1 OK
18 2 2 OK
19 3 3 OK
20 4 4 OK
21 5 5 OK
22 6 6 OK
23 7 7 OK
24 264 264 OK
25 265 265 OK
26 266 266 OK

Hallo,

ESP 8266 Wemos D1 , Node MCU,.... Damit sollte das Thema Speicher auch beendet sein. Die 3,3V machen wieder ander Problemchen , würden mich aber nicht abhalten.

Heinz

Vielen Dank an alle. Ich bin mir zwar noch nicht sicher welche Lösung ich nehme aber ich bin mir sicher das ich es jetzt hinbekomme. Vermutlich nehme ich die Lösung mit PROGMEN. Die Mathematisch wäre zwar meiner Meinung nach die elegantere aber .................. Ich starre seit 30 Minuten auf diese Zeile:

int out = in + (2 - in / 8 % 3) * 128 - ((in / 8) - ((in / 8) / 3)) * 8;

Und sorry aber das übersteigt meinen Horizont. Wirklich vielen vielen Dank für die Mühe aber ich würde nur ungern etwas in meinen code einbauen das ich nicht verstehe.

So neben bei der Original Code läuft auf dem Mega problemlos aber ich werde es trotzdem verbessern.

disim:
Und sorry aber das übersteigt meinen Horizont. Wirklich vielen vielen Dank für die Mühe aber ich würde nur ungern etwas in meinen code einbauen das ich nicht verstehe.

sollst auch nicht. Aber ich habe dir ja vorhin schon dazu geraten, das in Excel zu machen. Ich hab mich da auch nur Schrittweise genähert. Erst mal den Unterschied ausgereichnet, dann über die Div 8 und modulo auf die "8er Gruppen", dann auf die laufende Nummer der jeweiligen Gruppe usw ... da waren auch ein paar Irrwege dabei:

du musst nur aufpassen, dass Excel halt float rechnet und du musst daher ein paar int (oder ganzzahl auf deutsch) setzen...

aber ich würde nur ungern etwas in meinen code einbauen das ich nicht verstehe.

Das sehe ich nicht so eng. Es gibt viele Sachen die ich nicht nachvollziehen kann, das ich aber benutze.
Grüße Uwe

Das sehe ich nicht so eng. Es gibt viele Sachen die ich nicht nachvollziehen kann, das ich aber benutze.

Klar verstehe ich, würde ich auch so machen wenn es mir darum geht ein Ziel zu erreichen. Aber ich habe nicht wirklich ein Ziel mit meinem Projekt, ich baue einfach etwas weil ich gerne bastel und programmier. Ich hatte einfach in einem Shop die 8x8 Neopixel Matrix gesehen und fand sie cool und hab überlegt was ich draus machen kann. Deshalb geht es mir überhaupt nicht um das Ergebnis sondern um zu verstehen wie es funktioniert und Spaß zu haben. :slight_smile: