Вопрос о Teensy 4.1

научите пожалуйста как это сделать, я для этого и попросил помощи.

выше приведенный скетч работает, воспроизводит анимацию отлично, нижеприведенный не работает, но, если изменить количество пикселей на 512 то всё начинает работать.

#include <FastLED.h>
#include <SPI.h>
#include <SD.h>

#define NUM_LEDS 1023 // LED number
#define DATA_PIN 0    // your data arduino pin
#define PotPort A6 // потенциометр
#define CHIPSET WS2812B  // your LED chip type
unsigned char x = 31; // matrix x size
unsigned char y = 33; // matrix y size

File fxdata;
CRGB leds[NUM_LEDS];
CRGB templeds[NUM_LEDS];

const uint8_t XYTable[] = {
  1022, 957, 956, 891, 890, 825, 824, 759, 758, 693, 692, 627, 626, 561, 560, 495, 494, 429, 428, 363, 362, 297, 296, 231, 230, 165, 164,  99,  98,  33,  32,
  1021, 958, 955, 892, 889, 826, 823, 760, 757, 694, 691, 628, 625, 562, 559, 496, 493, 430, 427, 364, 361, 298, 295, 232, 229, 166, 163, 100,  97,  34,  31,
  1020, 959, 954, 893, 888, 827, 822, 761, 756, 695, 690, 629, 624, 563, 558, 497, 492, 431, 426, 365, 360, 299, 294, 233, 228, 167, 162, 101,  96,  35,  30,
  1019, 960, 953, 894, 887, 828, 821, 762, 755, 696, 689, 630, 623, 564, 557, 498, 491, 432, 425, 366, 359, 300, 293, 234, 227, 168, 161, 102,  95,  36,  29,
  1018, 961, 952, 895, 886, 829, 820, 763, 754, 697, 688, 631, 622, 565, 556, 499, 490, 433, 424, 367, 358, 301, 292, 235, 226, 169, 160, 103,  94,  37,  28,
  1017, 962, 951, 896, 885, 830, 819, 764, 753, 698, 687, 632, 621, 566, 555, 500, 489, 434, 423, 368, 357, 302, 291, 236, 225, 170, 159, 104,  93,  38,  27,
  1016, 963, 950, 897, 884, 831, 818, 765, 752, 699, 686, 633, 620, 567, 554, 501, 488, 435, 422, 369, 356, 303, 290, 237, 224, 171, 158, 105,  92,  39,  26,
  1015, 964, 949, 898, 883, 832, 817, 766, 751, 700, 685, 634, 619, 568, 553, 502, 487, 436, 421, 370, 355, 304, 289, 238, 223, 172, 157, 106,  91,  40,  25,
  1014, 965, 948, 899, 882, 833, 816, 767, 750, 701, 684, 635, 618, 569, 552, 503, 486, 437, 420, 371, 354, 305, 288, 239, 222, 173, 156, 107,  90,  41,  24,
  1013, 966, 947, 900, 881, 834, 815, 768, 749, 702, 683, 636, 617, 570, 551, 504, 485, 438, 419, 372, 353, 306, 287, 240, 221, 174, 155, 108,  89,  42,  23,
  1012, 967, 946, 901, 880, 835, 814, 769, 748, 703, 682, 637, 616, 571, 550, 505, 484, 439, 418, 373, 352, 307, 286, 241, 220, 175, 154, 109,  88,  43,  22,
  1011, 968, 945, 902, 879, 836, 813, 770, 747, 704, 681, 638, 615, 572, 549, 506, 483, 440, 417, 374, 351, 308, 285, 242, 219, 176, 153, 110,  87,  44,  21,
  1010, 969, 944, 903, 878, 837, 812, 771, 746, 705, 680, 639, 614, 573, 548, 507, 482, 441, 416, 375, 350, 309, 284, 243, 218, 177, 152, 111,  86,  45,  20,
  1009, 970, 943, 904, 877, 838, 811, 772, 745, 706, 679, 640, 613, 574, 547, 508, 481, 442, 415, 376, 349, 310, 283, 244, 217, 178, 151, 112,  85,  46,  19,
  1008, 971, 942, 905, 876, 839, 810, 773, 744, 707, 678, 641, 612, 575, 546, 509, 480, 443, 414, 377, 348, 311, 282, 245, 216, 179, 150, 113,  84,  47,  18,
  1007, 972, 941, 906, 875, 840, 809, 774, 743, 708, 677, 642, 611, 576, 545, 510, 479, 444, 413, 378, 347, 312, 281, 246, 215, 180, 149, 114,  83,  48,  17,
  1006, 973, 940, 907, 874, 841, 808, 775, 742, 709, 676, 643, 610, 577, 544, 511, 478, 445, 412, 379, 346, 313, 280, 247, 214, 181, 148, 115,  82,  49,  16,
  1005, 974, 939, 908, 873, 842, 807, 776, 741, 710, 675, 644, 609, 578, 543, 512, 477, 446, 411, 380, 345, 314, 279, 248, 213, 182, 147, 116,  81,  50,  15,
  1004, 975, 938, 909, 872, 843, 806, 777, 740, 711, 674, 645, 608, 579, 542, 513, 476, 447, 410, 381, 344, 315, 278, 249, 212, 183, 146, 117,  80,  51,  14,
  1003, 976, 937, 910, 871, 844, 805, 778, 739, 712, 673, 646, 607, 580, 541, 514, 475, 448, 409, 382, 343, 316, 277, 250, 211, 184, 145, 118,  79,  52,  13,
  1002, 977, 936, 911, 870, 845, 804, 779, 738, 713, 672, 647, 606, 581, 540, 515, 474, 449, 408, 383, 342, 317, 276, 251, 210, 185, 144, 119,  78,  53,  12,
  1001, 978, 935, 912, 869, 846, 803, 780, 737, 714, 671, 648, 605, 582, 539, 516, 473, 450, 407, 384, 341, 318, 275, 252, 209, 186, 143, 120,  77,  54,  11,
  1000, 979, 934, 913, 868, 847, 802, 781, 736, 715, 670, 649, 604, 583, 538, 517, 472, 451, 406, 385, 340, 319, 274, 253, 208, 187, 142, 121,  76,  55,  10,
  999, 980, 933, 914, 867, 848, 801, 782, 735, 716, 669, 650, 603, 584, 537, 518, 471, 452, 405, 386, 339, 320, 273, 254, 207, 188, 141, 122,  75,  56,   9,
  998, 981, 932, 915, 866, 849, 800, 783, 734, 717, 668, 651, 602, 585, 536, 519, 470, 453, 404, 387, 338, 321, 272, 255, 206, 189, 140, 123,  74,  57,   8,
  997, 982, 931, 916, 865, 850, 799, 784, 733, 718, 667, 652, 601, 586, 535, 520, 469, 454, 403, 388, 337, 322, 271, 256, 205, 190, 139, 124,  73,  58,   7,
  996, 983, 930, 917, 864, 851, 798, 785, 732, 719, 666, 653, 600, 587, 534, 521, 468, 455, 402, 389, 336, 323, 270, 257, 204, 191, 138, 125,  72,  59,   6,
  995, 984, 929, 918, 863, 852, 797, 786, 731, 720, 665, 654, 599, 588, 533, 522, 467, 456, 401, 390, 335, 324, 269, 258, 203, 192, 137, 126,  71,  60,   5,
  994, 985, 928, 919, 862, 853, 796, 787, 730, 721, 664, 655, 598, 589, 532, 523, 466, 457, 400, 391, 334, 325, 268, 259, 202, 193, 136, 127,  70,  61,   4,
  993, 986, 927, 920, 861, 854, 795, 788, 729, 722, 663, 656, 597, 590, 531, 524, 465, 458, 399, 392, 333, 326, 267, 260, 201, 194, 135, 128,  69,  62,   3,
  992, 987, 926, 921, 860, 855, 794, 789, 728, 723, 662, 657, 596, 591, 530, 525, 464, 459, 398, 393, 332, 327, 266, 261, 200, 195, 134, 129,  68,  63,   2,
  991, 988, 925, 922, 859, 856, 793, 790, 727, 724, 661, 658, 595, 592, 529, 526, 463, 460, 397, 394, 331, 328, 265, 262, 199, 196, 133, 130,  67,  64,   1,
  990, 989, 924, 923, 858, 857, 792, 791, 726, 725, 660, 659, 594, 593, 528, 527, 462, 461, 396, 395, 330, 329, 264, 263, 198, 197, 132, 131,  66,  65,   0
};


void setup()
{
  pinMode(PotPort, INPUT);
  FastLED.addLeds<CHIPSET, DATA_PIN, GRB>(leds, NUM_LEDS); //see doc for different LED strips

  for (int y = 0 ; y < NUM_LEDS ; y++)
  {
    leds[y] = CRGB::Black; // set all leds to black during setup
  }
  FastLED.show();
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);

  if (!SD.begin(4))
  {
    digitalWrite(8, HIGH);
    return;
  }
  digitalWrite(8, LOW);// workaround for sdcard initialization done.

}

void loop()
{
  int PotData; // объявляем переменную со значением задержки для delay();

  fxdata = SD.open("1.out");
  if (fxdata) {
    digitalWrite(7, HIGH); // workaround for file open ok...
  }
  {

    while (fxdata.available())
    {
      fxdata.readBytes((char*)leds, NUM_LEDS * 3);
      for (int k = 0; k < NUM_LEDS; k++) {
        templeds[k].r = fxdata.read();
        templeds[k].g = fxdata.read();
        templeds[k].b = fxdata.read();

        leds[XYTable[k]] = templeds[k];
      }

      FastLED.show();
      PotData = 20 + (analogRead(PotPort) / 6);

      delay(PotData); // set the speed of the animation. 20 is appx ~ 500k bauds
    }

    // close the file in order to prevent hanging IO or similar throughout time
    fxdata.close();

    for (int y = 0 ; y < NUM_LEDS ; y++)
    {
      leds[y] = CRGB::Black; // set all leds to black during setup
    }
    FastLED.show();

    delay(100);
  }
}

Вы в своем коде, по-моему, сделали все чтобы убить как можно больше памяти.

Зачем. например, эта таблица имеет тип uint32, если значения не превышают 271?

Зачем она создается заново при каждом вызове функции Sortled (), почему не сделать ее глобальной?
Более того, нафига вообще она нужна, ведь насколько я вижу, вся ее функция - это преобразовать линейный массив светодиодов в матрицу, собранную зигзагом?

Ну и остальное так же.
Если вы пытались точно так же вывести на матрицу панно в 1000 светодиодов - не удивительно что профукали всю память

Какой у вас тип таблицы и какие там числа - видите?

не удивительно, что у вас больше 512 не работает, удивительно-то что даже 512 работает… должно было все на 256 сдохнуть

вот это что?
Зачем вы данные читаете дважды?

Сделайте тестовый скетч с обычным бегущим огнем безо всяких заморочек с эффектами - вы удивитесь, но на 1023 светодиодах огонек будет бегать нормально. Памяти у esp8266 для этого более чем достаточно

Общее впечатление такое, что наткнувшись на то, что первый код на большом числе пикселей не работает, какой-то осел(трудно подобрать другое слово) принялся код “улучшать”, не имея ни малейшего представления о том, что в этом коде делается.

1 лайк

Опытным путем было установлено, что даже ардуино нано с ее жалкими 2кБ динамической памяти спокойно вывозит гирлянду из 256 светодиодов

Вы можете оптимизировать ? Или только вспоминать названия известных вам животных?

Оптимизировать “оптимизированное”? Найти того, кто на такое подпишется будет очень сложно, проще будет переписать все заново ))

500 и даже 600 должно работать, если в коде ничего другого нет

Я имел в виду гирлянду с кучей эффектов. Собственно, больше 256 я не пробовал, может и 512 потянет ))

я вам написал что поменять.

  1. Выкинуть таблицу XYTable, заменить преобразованием координат
  2. Разобраться с тем, что вы читаете из файла и зачем вы это делаете дважды
  3. Возможно выкинуть временный массив и читать сразу в массив светодиодов

А такой код у вас и на Тенси будет виснуть

что-то сомнительно, там частоту можно разогнать до Гигагерца и чтение с SD в четыре канала

Да проще тогда сразу с ПК управлять ))

а нафига?

Могу сделать, но для этого мне нужна сама светодиодная матрица. Ленты 2812 у меня мало, тестировать не на чем.

Вы из какого города?

Поясню:
вариант 272 пикселя я собрал лет 6 назад. По мотивам Гайвера, в его проекте матрица была 10х10 и воспроизводила эффекты из прошивки, понимая, что эти эффекты надоедят мне через неделю, и для замены мне придется перепрошивать контроллер я начал искать другой путь, обратился за помощью на похожий ресурс, где прочитал кучу таких же оскорбительных комментариев и вопросов какие пишите вы, но если бы моей квалификации хватало для самостоятельного решения я бы никого и не просил совета, слава богу. нашлась пара человек, которые направили в нужном направлении и мне удалось запустить гирлянду, она, как мне и хотелось, простой заменой карты памяти начинала воспроизводить нужные мне эффекты, скетч на 272 пикселя я собрал самостоятельно и он заработал. Изучал программирование я более 30ти лет назад, В данный момент времени у меня нет для подробного изучения , моих знаний хватило на то чтобы собрать из нескольких разных скетчей один рабочий, знаний для того вылизать код и оптимизировать его по максимуму у меня не хватает, поэтому и попросил помощи. teensy 4.1 приобрел потому, что она гарантированно и с запасом должна работать в моём проекте. Но из за недостатка информации в русскоязычном сегменте никак не мог понять каким образом задействовать встроенный слот для карт памяти.
не понимаю этого и сейчас, но буду использовать внешний модуль sd card из предыдущего проекта, благо ua6em помог с понимаем распиновки,
собственно всё
не понимаю почему на просьбу помочь вы реагируете оскорблениями? мне кажется если кто то просит помощи то он самой просьбой признает вас людьми более осведомленными и знающими.
я прекрасно осознаю, что моих знаний недостаточно для самостоятельного написания идеального кода или для оптимизации существуещего. Поэтому и задал свой вопрос.
В любом случае спасибо , что не остались и равнодушными и помогли найти пусть и не оптимальное, но всё же решение, для меня и это выход.

я из Томска, матрица собрана в прошлом году и работала с китайским Т1000 , но софт для этого контроллера очень убогий, работать с ним очень неудобно, моя цель контроллер который будет воспроизводить эффекты сделанные в программе jinx.

А у других, значит, должно для тебя быть время для переделки твоего говнокода и совершенно бесплатно?