Лайфхаки (Маленькие хитрости) А так можно было?!

Аватара пользователя
Dryundel
Полковник
Сообщения: 2406
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Поблагодарили: 15 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение Dryundel »

Тема для маленьких хитростей и полезностей, которыми вы пользуетесь при работе в FLProg и хотите ими поделиться.
Все что касается, разработки, сборки, программирования. Выкладываем то, что вы где то подсмотрели или придумали.
Зачастую самые элементарные вещи оказываются полезны для других.
Старайтесь как можно внятней и подробней донести до коллег идею.


Предупреждение.
Обсуждения в данной теме не возбраняются, но со временем будут удаляться во благо полезного контента.

Пример:
Пусть это будет первый лайфхак в этой теме.

Если при разработке, на контроллере есть свободные пины, и/или не хватает пинов GND, VCC, можно не тянуть провода на макетку, а сделать из цифровых пинов те же GND и VCC.
Для этого надо создать цифровой выход и повесить на него true - для VCC и false - для GND.
Это подойдет для низко-токовых девайсов.
.
2.jpg
[spoiler=Вариант подключения]
1.jpg
[/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2406
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Поблагодарили: 15 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение Dryundel »

Цифровой пин из аналогового
Если на Arduino NANO кончились цифровые пины, но есть свободные аналоговые (A6,A7), а вам ну позарез нужно подключить еще одну кнопку, воспользуйтесь блоком "Компаратор".
.
3.jpg
.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2406
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Поблагодарили: 15 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение Dryundel »

C++
При написании кода, когда требуется присвоить boolean переменной ineger

"false" - если целочисленная integer равна нулю
и "true" - если не равна нулю.

Не обязательно писать условие. Можно сделать так:

Код: Выделить всё

int Number;
bool Switch;

  Switch = Number;

// Или так...

  if(Number){
      // Ваш код....
  }
Это работает
Аватара пользователя
Dryundel
Полковник
Сообщения: 2406
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Поблагодарили: 15 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение Dryundel »

C++

Переменной boolean можно приравнять условие:

Код: Выделить всё

int Number;
bool Switch;

Switch = Number > 248;
И это будет равносильно:

Код: Выделить всё

int Number;
bool Switch;

if  ( Number > 248){
     Switch = 1;
} else {
     Switch = 0;
}
Это тоже работает.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2406
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Поблагодарили: 15 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение Dryundel »

Новый редактор (Code Professional)

Если в новом редакторе у выхода снять галку "Создавать переменную для выхода", то в появившемся окне можно написать любое выражение для вычисления. Очень актуально например для маленьких блоков с формулами.

В этом случае, ваш блок вообще не создает переменных, а берет значение со входа и отправляет результат на выход.
.
4.jpg
[spoiler=В коде это выглядит так:]
6.jpg
5.jpg
[/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2406
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Поблагодарили: 15 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение Dryundel »

Новый редактор (Code Professional)

В новом редакторе, на входе, тип численной переменной не определен. Можно создать вход любого типа (Исключение String и char).
То есть, если вы создали вход integer, а в проекте подаете на него float, то и в вычисление пойдет float. Переопределения типа переменной, на входе не произойдет.
Мало того, блок опят таки не будет создавать для входа переменных, а отправит пришедшее на вход, прямиком в ваши вычисления.

Пример:
7.jpg
В результате в код вставляется выражение с float.
[spoiler=Пример кода]
8.jpg
[/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2406
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Поблагодарили: 15 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение Dryundel »

Размер проекта.

С увеличением в проекте числа пользовательских блоков созданных в Новом редакторе (Code Professional) размер файла становится очень большим, вплоть до того, что даже не сохраняется. Работать с таким файлом тяжело, тормоза жуткие.

Есть разница, и огромная, как вставлять новый блок в проект.
Если каждый раз вытаскивать из панели ПБ очередную копию блока, файл растет непомерными темпами.
Если же скопировать и вставить уже имеющийся в проекте блок, прибавка к размеру файла копеечная.
Последующее изменение параметров, на размер влияет незначительно.

Пример:
275 MB - Изначальный размер файла
262 MB - После замены всего пары блоков копированием. (минус 13.5MB с двух блоков)
Результат.jpg
Проблема обсуждалась здесь
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2406
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Поблагодарили: 15 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение Dryundel »

Как выполнить плату один раз (Аналогично Setup() )
Иногда требуется выполнить какие то действия один раз при старте контроллера.
Для этого
- Создаем одну переменную Boolean (Start) по умолчанию false.
- Размещаем на этой плате и в ней же приравниваем Start к true.
- Настраиваем выполнение платы пока Start = false
9.jpg
[spoiler=Настройка платы]
10.jpg
[/spoiler]
.
Всё. Теперь плата выполнится один раз при старте
У вас нет необходимых прав для просмотра вложений в этом сообщении.
artemka19
Лейтенант
Сообщения: 540
Зарегистрирован: 03 сен 2020, 15:41
Откуда: Питер
Имя: Артем
Поблагодарили: 1 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение artemka19 »

artemka19 писал(а): 29 июн 2022, 21:11 как создать 100 переменных копипастой в проекте?
[spoiler]
создаем Одну переменную в проекте. Сохраняем и закрываем проект.
1-создаем переменную.png
было так.png
Открываем проект как xml файл:
2-открываем проект как xml.png
находим там переменную по имени заданному в проекте:
3-находим поиском свою переменную по имени заданному в проекте.png
выделяем секцию и копируем ее:
4-выделяем секцию и копируем ее.png
теперь просто вставляем сочетанием "ctrl+v+enter" столько раз, сколько нужно:
5-теперь просто вставляем сочетанием ctrl+v+enter.png
теперь открываем проект и видим результат:
7-теперь открываем проект.png
[/spoiler]

таким же образом можно править/переносить, например, веб-интерфейс из проекта в проект.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2406
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Поблагодарили: 15 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение Dryundel »

Оптимизация - Переменная или клема?

На форуме есть поверье, что использование клемм оптимизирует проект, потому что не создаются переменные.
Да, действительно клемма не создает лишних переменных. Ключевое слово - лишних. Потому как в ряде случаев переменная клеммой все-таки создается.
Однако создание "лишних" переменных влияет только на красоту скетча и больше ни на что.
Проведем простой эксперимент.

[spoiler=Проект с одной переменной float]
1.jpg
[/spoiler]

[spoiler=Компилируем проект 1]
2.jpg
[/spoiler]
.
+2шт float - это как минимум 8 байт, плюс операции чтения и приравнивания
[spoiler=Теперь добавим переменных]
3.jpg
[/spoiler]
[spoiler=Компилируем проект 2]
4.jpg
[/spoiler]
.
Результат - программа не увеличилась ни на один байт.
Почему так происходит - Компилятор весьма умная штука. Он оптимизирует вашу программу и если существуют переменные в которых нет особого смысла, он их просто вырезает из итогового бинарного файла.
Вывод - если вам удобно пользоваться переменными, то пользуйтесь на здоровье. Если клеммы кажутся более симпатичными - тоже пожалуйста. На размер программы это не повлияет.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2406
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Поблагодарили: 15 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение Dryundel »

Редкая информация

word (слово) - принято считать что этот тип данных равнозначен integer и включает в себя 16 бит (2 байта). Однако в классической теории, слово - не является величиной постоянной, а привязано к битности процессора. Этой теории придерживается ESP32 и word для него 32 бита.

Integer (int) - для ESP32 нет такого понятия. Этот контроллер воспринимает такой тип данных как long integer (long) - 32 бита, тогда как для AVR это всегда 16 бит.

double - для AVR это то же самое что float, число с плавающей точкой (32 бита) с точностью 6 десятичных знаков. Не после запятой, а всего шесть. ESP32 считает иначе. Для него double - 64 бита, а точность 15 десятичных знаков. В отличии от int64_t, стандартные функции Arduino поддерживают работу с double.

int64_t - целочисленное 64 бита. Как бы не было странно но даже 16-ти битный AVR поддерживает этот тип данных. Однако стандартные функции Arduino с ним работать не умеют.
.
cfitymrf писал(а): 03 сен 2022, 10:03 если проект на AVR имеет Integer и для переноса его на ESP32 нужно делать ка кие то изменения в проекте ?
Нет не надо. Для пользователя разницы нет. Компилятор сам трансформирует все int в long.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2406
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Поблагодарили: 15 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение Dryundel »

Новый редактор (Code Professional)

Вложение кода из экземпляров блока в общую функцию

Данная проблема давно занимала умы создателей блоков. И хотя решение частичное, однако оно работает. :)

ЗАДАЧА:
Вложить некий аналогичный код из разных экземпляров блока в одну общую функцию. Так, чтобы идентификаторы экземпляров во вложенном коде соответствовали этим экземплярам.

РЕШЕНИЕ:
1. Общая функция (в которую вкладывается код) должна находиться выше по иерархии
- Основные настройки (Секция Function)
- Общий код блока (Секция Function)
- Код каждого экземпляра (Секция Function)

2. Общая функция должна быть на последнем месте в дереве

3. Ниже по иерархии относительно этой общей функции не должно быть объявлено других функций.

4. Начало общей функции может быть любым но закрывающая скобка } должна отсутствовать.

5. Код который вкладывается должен быть в Секция Function ниже по иерархии.

6. Закрывающая скобка } не нужна ! Она сгенерируется автоматически при компиляции.

Пример.
Тест незакрытой функции.flp
.
1.jpg
У вас нет необходимых прав для просмотра вложений в этом сообщении.
artemka19
Лейтенант
Сообщения: 540
Зарегистрирован: 03 сен 2020, 15:41
Откуда: Питер
Имя: Артем
Поблагодарили: 1 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение artemka19 »

Dryundel писал(а): 04 фев 2023, 18:13 6. Закрывающая скобка } не нужна ! Она сгенерируется автоматически при компиляции
это только для секции setup

Отправлено спустя 1 минуту 2 секунды:
Dryundel писал(а): 04 фев 2023, 18:13 4. Начало общей функции может быть любым но закрывающая скобка } должна отсутствовать
и это тоже только для setup
Аватара пользователя
Dryundel
Полковник
Сообщения: 2406
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Поблагодарили: 15 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение Dryundel »

artemka19 писал(а): 04 фев 2023, 19:51 это только для секции setup
Это для секции Function.
Смотри пример.
artemka19
Лейтенант
Сообщения: 540
Зарегистрирован: 03 сен 2020, 15:41
Откуда: Питер
Имя: Артем
Поблагодарили: 1 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение artemka19 »

Dryundel писал(а): 04 фев 2023, 20:58 Это для секции Function.
там хронологическая зависимость появляется, как и в случае использования незакрываемой скобки в секции setup
Аватара пользователя
Dryundel
Полковник
Сообщения: 2406
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Поблагодарили: 15 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение Dryundel »

artemka19 писал(а): 04 фев 2023, 21:44 там хронологическая зависимость появляется, как и в случае использования незакрываемой скобки в секции setup
А можно подробней?
Какая там хронологическая зависимость в секции Function?
Что имеется в виду?
Пример есть?
artemka19
Лейтенант
Сообщения: 540
Зарегистрирован: 03 сен 2020, 15:41
Откуда: Питер
Имя: Артем
Поблагодарили: 1 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение artemka19 »

Dryundel писал(а): 04 фев 2023, 22:04 Какая там хронологическая зависимость в секции Function?
Что имеется в виду?

void FinctionOpen()
{
a_66005530 = b_66005530 + c_66005530;
a_239475935 = b_239475935 + c_239475935;
a_16761833 = b_16761833 + c_16761833;
}

все что внутри функции будет неизменным даже если поменять блоки местами на плате

т.е. в каком порядке вытащили блоки - в том порядке код и будет внутри функции
Аватара пользователя
Dryundel
Полковник
Сообщения: 2406
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Поблагодарили: 15 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение Dryundel »

artemka19 писал(а): 04 фев 2023, 23:23 т.е. в каком порядке вытащили блоки - в том порядке код и будет внутри функции
Это естественно. И что ? Это тут при чем? Вытаскивай в нужном порядке.
Рассматривается совсем другая задача.
В данном случае не требуется дополнительный блок, типа "Конечныйй".
artemka19
Лейтенант
Сообщения: 540
Зарегистрирован: 03 сен 2020, 15:41
Откуда: Питер
Имя: Артем
Поблагодарили: 1 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение artemka19 »

Dryundel писал(а): 21 фев 2022, 18:16 И что ? Это тут при чем? Вытаскивай в нужном порядке
если знаешь об этом нюансе, то и будешь вытаскивать в нужном порядке, а если не знаешь?
Поэтому и добавил описание этой особенности
Аватара пользователя
Phazz
Полковник
Сообщения: 3110
Зарегистрирован: 17 окт 2016, 15:38
Откуда: Сургут
Имя: Анатолий
Благодарил (а): 228 раз
Поблагодарили: 107 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение Phazz »

Это все прекрасно, пока одна такая функция. Или не добавят другой блок с таким же лайфаком)
Ответить

Вернуться в «Обучающие примеры работы в FLProg»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя