ARDUINO Помогите с кодом

ASM

★★★★✩✩✩
26 Окт 2018
1,515
294
Замените long на CRGB, скомпилируйте, и оцените разницу
заменил два лонга, освободил 4 байта)

остальные эксперименты позже)

оцените еще раз
static const CRGB ColorTable[16] = FLPROGMEM
ругается на FLPROGMEM, не понимает его) задал #define FASTLED_USE_PROGMEM 1
else if (LEDCOLOR == 1) {
CRGB ledColor = ColorTable[random(16)];

static const CRGB ColorTable[16] = FLPROGMEM {
CRGB::Amethyst,

после компиляции прибавилось 124 байта, многовато)

PROGMEM это разве не с ESP взято?

static const CRGB ColorTable[16] = PROGMEM {
так надо, но
expected primary-expression before 'attribute'
 

ASM

★★★★✩✩✩
26 Окт 2018
1,515
294
Приветствую, помогите с таким вопросом)
есть такой код
uint8_t periodDisplay[] = {pD};
В pD идет перечисление через запятую
pD = 0,1,2,3,4;
раньше было так #define pD 0,1,2,3,4
сейчас надо вынести, для чтения из json
 
Изменено:

bort707

★★★★★★✩
21 Сен 2020
2,899
862
@ASM, вы что-то путаете, если написать так :
#define pD = 0,1,2,3,4;
компилироваться не будет.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,515
294
@bort707, я знаю, немножко не так написал, вопрос в другом был)
 

bort707

★★★★★★✩
21 Сен 2020
2,899
862
Маленькая ложь рождает большое недоверие
 

ASM

★★★★✩✩✩
26 Окт 2018
1,515
294
@Старик Похабыч, о, какие люди) давно не видно было)
Я выносил значение массива отдельно, чтобы пользователи сами настраивали в одном месте...
Я так понимаю, никак не сделать, использовать переменную periodDisplay[] с квадратными скобками, а фигурные фильтровать для пользователя?
 

Вложения

bort707

★★★★★★✩
21 Сен 2020
2,899
862
использовать переменную periodDisplay[] с квадратными скобками, а фигурные фильтровать для пользователя?
вы все смешали. Скобки - это в исходнике. В момент выполнения программы у вас уже ни квадратных, ни фигурных скобок нет, забудьте. От конфигуратора вы получаете список значений массива - вот и копируйте эти значения в массив в программе обычным образом. как целые числа в цикле
 

bort707

★★★★★★✩
21 Сен 2020
2,899
862
Компилятор не принимает int, String, uint8_t, const char, не подходит этот вариант с pD)
покажите, как вы пробуете.
Уверен, что дело не в компиляторе. а в том что вы пишете ерунду.
Я вам уже выше написал - не пытайтесь вставить что-то типа
uint8_t periodDisplay[] = {pD};
в исполняемый код - так работать не будет, что бы вы в pD не написали. Эта запись - для начальной инициализации при первом создании переменной, к вашему случаю оно не подходит.

Вам уже KDn писал - вы столько времени ведете этот проект, а до сих пор не осилили хотя бы первые главы учебника по Си прочитать...
 

bort707

★★★★★★✩
21 Сен 2020
2,899
862
Значит только будет работать за дефайном?) Плохо...
ничего "плохого", просто надо писать по другому. И дефайн тут вообще непричем.
Эта строчка допустима только при инициализации массива..В вашем же случае вам надо делать не инициализацию, а замену старых значений новыми.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Тут 2 совсем разные системы. Порядок вывода в поле ввода скорее всего строка символов. Не сложно при получении ее из формы преобразовать в массив для json или из массива json сделать строку, для поля формы.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,515
294
@Старик Похабыч, до json пока не добрался, тестирую в серийном порту, пока всё удачно, за исключением вчерашнего момента) Причем компилятор сразу ругается на это, а потом надпись про фастлед и другие сопутствующие ошибки. Обычно фастлед, а потом все ошибки...
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Я , к сожалению, слабо понимаю что надо получить. Кажется, что надо эти значения передавать и получить из формы.
 

bort707

★★★★★★✩
21 Сен 2020
2,899
862
компилятор сразу ругается на это, а потом надпись про фастлед и другие сопутствующие ошибки. Обычно фастлед, а потом все ошибки...
потому что синтаксические ошибки типа пропущенных точки запятой - компилятор показывает первым. Если вы пытаетесь запихнуть свою строчку в вфигурные скобки вместе pD - получается как раз такая элементарная ошибка синтаксиса

Я , к сожалению, слабо понимаю что надо получить. Кажется, что надо эти значения передавать и получить из формы.
ему нужен списк значений, причем он себе вбил в голову. что значения должны быть в одну строку через запятую. Хотя логически списки очередности обычно оформляются в форме листбокса со значениями, перемещаемыми вверх и вниз
 
Изменено:

ASM

★★★★✩✩✩
26 Окт 2018
1,515
294
@bort707, точки с запятой и кавычки он показывает после, причем странно объясняя об этом, что все функции что ниже, не задокументированы...
@Старик Похабыч, да, надо передавать в форму и получать в форму. Получать из формы получается. Передавать пока не пробовал. Посмотрим, что получится...
 

bort707

★★★★★★✩
21 Сен 2020
2,899
862
@ASM, как все-так насчет того, чтобы почитать какой-нить учебник? Вот отложить текущий проект дней на 10-15 и изучить любую книжку по Си страниц на 200?
Поверьте. время, потраченное на книгу - вы очень быстро наверстаете, работа над кодом пойдет быстрее.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,515
294
@bort707, я посмотрел по содержанию, что-то не заинтересовало, всё что нужно - знакомо. Описание переменных и т.п. написание первой программы... Это всё уже известно. А то что в конце, все эти сложности не нужны мне)
 

ASM

★★★★✩✩✩
26 Окт 2018
1,515
294
Решил оптимизировать этот код
C++:
 if (DOTS_NUM == 2) {
    dot_1 = LEDS_IN_SEGMENT * 14;
    dot_2 = (LEDS_IN_SEGMENT * 14) + 1;
  } else if (DOTS_NUM == 4) {
    dot_1 = LEDS_IN_SEGMENT * 14;
    dot_2 = (LEDS_IN_SEGMENT * 14) + 1;
    dot_3 = (LEDS_IN_SEGMENT * 14) + 2;
    dot_4 = (LEDS_IN_SEGMENT * 14) + 3;
  } else if (DOTS_NUM == 6) {
    dot_1 = LEDS_IN_SEGMENT * 14;
    dot_2 = (LEDS_IN_SEGMENT * 14) + 1;
    dot_3 = (LEDS_IN_SEGMENT * 14) + 2;
    dot_4 = (LEDS_IN_SEGMENT * 14) + 3;
    dot_5 = (LEDS_IN_SEGMENT * 14) + 4;
    dot_6 = (LEDS_IN_SEGMENT * 14) + 5;
  } else if (DOTS_NUM == 8) {
    dot_1 = LEDS_IN_SEGMENT * 14;
    dot_2 = (LEDS_IN_SEGMENT * 14) + 1;
    dot_3 = (LEDS_IN_SEGMENT * 14) + 2;
    dot_4 = (LEDS_IN_SEGMENT * 14) + 3;
    dot_5 = (LEDS_IN_SEGMENT * 14) + 4;
    dot_6 = (LEDS_IN_SEGMENT * 14) + 5;
    dot_7 = (LEDS_IN_SEGMENT * 14) + 6;
    dot_8 = (LEDS_IN_SEGMENT * 14) + 7;
  }
C++:
void Dots(boolean Dot_On) {
    if (DOTS_NUM == 2) {
      leds[dot_1] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
      leds[dot_2] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
    } else if (DOTS_NUM == 4) {
      leds[dot_1] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
      leds[dot_2] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
      leds[dot_3] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
      leds[dot_4] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
    } else if (DOTS_NUM == 6) {
      leds[dot_1] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
      leds[dot_2] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
      leds[dot_3] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
      leds[dot_4] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
      leds[dot_5] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
      leds[dot_6] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
    } else if (DOTS_NUM == 8) {
      leds[dot_1] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
      leds[dot_2] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
      leds[dot_3] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
      leds[dot_4] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
      leds[dot_5] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
      leds[dot_6] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
      leds[dot_7] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
      leds[dot_8] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
    }
}
на этот
C++:
void Dots(boolean Dot_On) {
  for (int i = 0; i < DOTS_NUM; i++) {  
    leds[(LEDS_IN_SEGMENT * 14) + i] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
  }
}
вот вроде и сделано правильно, но мерцания цвета происходят)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Внутри цикла логическая переменная не меняется (в последнем фрагменте), значит мерцает не тут. Тогда проверить частоту вызова этой функции.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,515
294
@Старик Похабыч, мерцания происходят со сменой цвета при мигании точек. Где точек нет, более и менее, иногда пробегают сбои. Тут такое ощущение, что переполняется адрес ленты. Надо будет попробовать без цикла, на две строки с двумя точками.

C++:
  for (int i = 0; i < DOTS_NUM; i++) {
    leds[56] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
    leds[57] = (Dot_On) ? ledColor : CRGB(0, 0, 0);
  }
аналогичен результат, буду думать на частотой...

похоже проблема с FastLED, перекомпилировал рабочую на последнюю, тоже баги пошли)
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Раз не понял, то не менял. У esp32 2 ядра, и в IDE можно распределить задачи при компиляции: 1686424042191.png
Я на каком то из устройств что то менял и получил мерцание на ленте. Вроде на часах тоже.