научите пожалуйста как это сделать, я для этого и попросил помощи.
выше приведенный скетч работает, воспроизводит анимацию отлично, нижеприведенный не работает, но, если изменить количество пикселей на 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 для этого более чем достаточно
Общее впечатление такое, что наткнувшись на то, что первый код на большом числе пикселей не работает, какой-то осел(трудно подобрать другое слово) принялся код “улучшать”, не имея ни малейшего представления о том, что в этом коде делается.
Опытным путем было установлено, что даже ардуино нано с ее жалкими 2кБ динамической памяти спокойно вывозит гирлянду из 256 светодиодов
Вы можете оптимизировать ? Или только вспоминать названия известных вам животных?
Оптимизировать “оптимизированное”? Найти того, кто на такое подпишется будет очень сложно, проще будет переписать все заново ))
500 и даже 600 должно работать, если в коде ничего другого нет
Я имел в виду гирлянду с кучей эффектов. Собственно, больше 256 я не пробовал, может и 512 потянет ))
я вам написал что поменять.
- Выкинуть таблицу
XYTable
, заменить преобразованием координат - Разобраться с тем, что вы читаете из файла и зачем вы это делаете дважды
- Возможно выкинуть временный массив и читать сразу в массив светодиодов
А такой код у вас и на Тенси будет виснуть
что-то сомнительно, там частоту можно разогнать до Гигагерца и чтение с SD в четыре канала
Да проще тогда сразу с ПК управлять ))
а нафига?
Могу сделать, но для этого мне нужна сама светодиодная матрица. Ленты 2812 у меня мало, тестировать не на чем.
Вы из какого города?
Поясню:
вариант 272 пикселя я собрал лет 6 назад. По мотивам Гайвера, в его проекте матрица была 10х10 и воспроизводила эффекты из прошивки, понимая, что эти эффекты надоедят мне через неделю, и для замены мне придется перепрошивать контроллер я начал искать другой путь, обратился за помощью на похожий ресурс, где прочитал кучу таких же оскорбительных комментариев и вопросов какие пишите вы, но если бы моей квалификации хватало для самостоятельного решения я бы никого и не просил совета, слава богу. нашлась пара человек, которые направили в нужном направлении и мне удалось запустить гирлянду, она, как мне и хотелось, простой заменой карты памяти начинала воспроизводить нужные мне эффекты, скетч на 272 пикселя я собрал самостоятельно и он заработал. Изучал программирование я более 30ти лет назад, В данный момент времени у меня нет для подробного изучения , моих знаний хватило на то чтобы собрать из нескольких разных скетчей один рабочий, знаний для того вылизать код и оптимизировать его по максимуму у меня не хватает, поэтому и попросил помощи. teensy 4.1 приобрел потому, что она гарантированно и с запасом должна работать в моём проекте. Но из за недостатка информации в русскоязычном сегменте никак не мог понять каким образом задействовать встроенный слот для карт памяти.
не понимаю этого и сейчас, но буду использовать внешний модуль sd card из предыдущего проекта, благо ua6em помог с понимаем распиновки,
собственно всё
не понимаю почему на просьбу помочь вы реагируете оскорблениями? мне кажется если кто то просит помощи то он самой просьбой признает вас людьми более осведомленными и знающими.
я прекрасно осознаю, что моих знаний недостаточно для самостоятельного написания идеального кода или для оптимизации существуещего. Поэтому и задал свой вопрос.
В любом случае спасибо , что не остались и равнодушными и помогли найти пусть и не оптимальное, но всё же решение, для меня и это выход.
я из Томска, матрица собрана в прошлом году и работала с китайским Т1000 , но софт для этого контроллера очень убогий, работать с ним очень неудобно, моя цель контроллер который будет воспроизводить эффекты сделанные в программе jinx.
А у других, значит, должно для тебя быть время для переделки твоего говнокода и совершенно бесплатно?