Страница 1 из 2
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 21 фев 2022, 17:12
Dryundel
Тема для маленьких хитростей и полезностей, которыми вы пользуетесь при работе в FLProg и хотите ими поделиться.
Все что касается, разработки, сборки, программирования. Выкладываем то, что вы где то подсмотрели или придумали.
Зачастую самые элементарные вещи оказываются полезны для других.
Старайтесь как можно внятней и подробней донести до коллег идею.
Предупреждение.
Обсуждения в данной теме не возбраняются, но со временем будут удаляться во благо полезного контента.
Пример:
Пусть это будет первый лайфхак в этой теме.
Если при разработке, на контроллере есть свободные пины, и/или не хватает пинов GND, VCC, можно не тянуть провода на макетку, а сделать из цифровых пинов те же GND и VCC.
Для этого надо создать цифровой выход и повесить на него true - для VCC и false - для GND.
Это подойдет для низко-токовых девайсов.
.
2.jpg
[spoiler=Вариант подключения]
1.jpg
[/spoiler]
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 21 фев 2022, 17:18
Dryundel
Цифровой пин из аналогового
Если на Arduino NANO кончились цифровые пины, но есть свободные аналоговые (A6,A7), а вам ну позарез нужно подключить еще одну кнопку, воспользуйтесь блоком "Компаратор".
.
3.jpg
.
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 21 фев 2022, 17:38
Dryundel
C++
При написании кода, когда требуется присвоить boolean переменной ineger
"false" - если целочисленная integer равна нулю
и "true" - если не равна нулю.
Не обязательно писать условие. Можно сделать так:
Код: Выделить всё
int Number;
bool Switch;
Switch = Number;
// Или так...
if(Number){
// Ваш код....
}
Это работает
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 21 фев 2022, 17:54
Dryundel
C++
Переменной boolean можно приравнять условие:
Код: Выделить всё
int Number;
bool Switch;
Switch = Number > 248;
И это будет равносильно:
Код: Выделить всё
int Number;
bool Switch;
if ( Number > 248){
Switch = 1;
} else {
Switch = 0;
}
Это тоже работает.
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 21 фев 2022, 18:16
Dryundel
Новый редактор (Code Professional)
Если в новом редакторе у выхода снять галку "Создавать переменную для выхода", то в появившемся окне можно написать любое выражение для вычисления. Очень актуально например для маленьких блоков с формулами.
В этом случае, ваш блок вообще не создает переменных, а берет значение со входа и отправляет результат на выход.
.
4.jpg
[spoiler=В коде это выглядит так:]
6.jpg
5.jpg
[/spoiler]
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 21 фев 2022, 18:45
Dryundel
Новый редактор (Code Professional)
В новом редакторе, на входе, тип численной переменной не определен. Можно создать вход любого типа (Исключение String и char).
То есть, если вы создали вход integer, а в проекте подаете на него float, то и в вычисление пойдет float. Переопределения типа переменной, на входе не произойдет.
Мало того, блок опят таки не будет создавать для входа переменных, а отправит пришедшее на вход, прямиком в ваши вычисления.
Пример:
7.jpg
В результате в код вставляется выражение с float.
[spoiler=Пример кода]
8.jpg
[/spoiler]
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 29 июн 2022, 16:56
Dryundel
Размер проекта.
С увеличением в проекте числа пользовательских блоков созданных в Новом редакторе (Code Professional) размер файла становится очень большим, вплоть до того, что даже не сохраняется. Работать с таким файлом тяжело, тормоза жуткие.
Есть разница, и огромная, как вставлять новый блок в проект.
Если каждый раз вытаскивать из панели ПБ очередную копию блока, файл растет непомерными темпами.
Если же скопировать и вставить уже имеющийся в проекте блок, прибавка к размеру файла копеечная.
Последующее изменение параметров, на размер влияет незначительно.
Пример:
275 MB - Изначальный размер файла
262 MB - После замены всего пары блоков копированием. (минус 13.5MB с двух блоков)
Результат.jpg
Проблема обсуждалась здесь
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 29 июн 2022, 19:36
Dryundel
Как выполнить плату один раз (Аналогично Setup() )
Иногда требуется выполнить какие то действия один раз при старте контроллера.
Для этого
- Создаем одну переменную Boolean (Start) по умолчанию false.
- Размещаем на этой плате и в ней же приравниваем Start к true.
- Настраиваем выполнение платы пока Start = false
9.jpg
[spoiler=Настройка платы]
10.jpg
[/spoiler]
.
Всё. Теперь плата выполнится один раз при старте
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 29 июн 2022, 21:27
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]
таким же образом можно править/переносить, например, веб-интерфейс из проекта в проект.
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 01 сен 2022, 11:13
Dryundel
Оптимизация - Переменная или клема?
На форуме есть поверье, что использование клемм оптимизирует проект, потому что не создаются переменные.
Да, действительно клемма не создает лишних переменных. Ключевое слово - лишних. Потому как в ряде случаев переменная клеммой все-таки создается.
Однако создание "лишних" переменных влияет только на красоту скетча и больше ни на что.
Проведем простой эксперимент.
[spoiler=Проект с одной переменной float]
1.jpg
[/spoiler]
[spoiler=Компилируем проект 1]
2.jpg
[/spoiler]
.
+2шт float - это как минимум 8 байт, плюс операции чтения и приравнивания
[spoiler=Теперь добавим переменных]
3.jpg
[/spoiler]
[spoiler=Компилируем проект 2]
4.jpg
[/spoiler]
.
Результат - программа не увеличилась ни на один байт.
Почему так происходит - Компилятор весьма умная штука. Он оптимизирует вашу программу и если существуют переменные в которых нет особого смысла, он их просто вырезает из итогового бинарного файла.
Вывод - если вам удобно пользоваться переменными, то пользуйтесь на здоровье. Если клеммы кажутся более симпатичными - тоже пожалуйста. На размер программы это не повлияет.
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 03 сен 2022, 09:16
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.
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 04 фев 2023, 18:13
Dryundel
Новый редактор (Code Professional)
Вложение кода из экземпляров блока в общую функцию
Данная проблема давно занимала умы создателей блоков. И хотя решение
частичное, однако оно работает.
ЗАДАЧА:
Вложить некий аналогичный код из разных экземпляров блока в одну общую функцию. Так, чтобы идентификаторы экземпляров во вложенном коде соответствовали этим экземплярам.
РЕШЕНИЕ:
1. Общая функция (в которую вкладывается код) должна находиться выше по иерархии
- Основные настройки (Секция Function)
- Общий код блока (Секция Function)
- Код каждого экземпляра (Секция Function)
2. Общая функция должна быть на последнем месте в дереве
3. Ниже по иерархии относительно этой общей функции не должно быть объявлено других функций.
4. Начало общей функции может быть любым но закрывающая скобка
} должна отсутствовать.
5. Код который вкладывается должен быть в Секция Function ниже по иерархии.
6.
Закрывающая скобка } не нужна ! Она сгенерируется автоматически при компиляции.
Пример.
Тест незакрытой функции.flp
.
1.jpg
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 04 фев 2023, 19:51
artemka19
Dryundel писал(а): 04 фев 2023, 18:13
6. Закрывающая скобка } не нужна ! Она сгенерируется автоматически при компиляции
это только для секции setup
Отправлено спустя 1 минуту 2 секунды:
Dryundel писал(а): 04 фев 2023, 18:13
4. Начало общей функции может быть любым но закрывающая скобка } должна отсутствовать
и это тоже только для setup
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 04 фев 2023, 20:58
Dryundel
artemka19 писал(а): 04 фев 2023, 19:51
это только для секции setup
Это для секции Function.
Смотри пример.
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 04 фев 2023, 21:44
artemka19
Dryundel писал(а): 04 фев 2023, 20:58
Это для секции Function.
там хронологическая зависимость появляется, как и в случае использования незакрываемой скобки в секции setup
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 04 фев 2023, 22:04
Dryundel
artemka19 писал(а): 04 фев 2023, 21:44
там хронологическая зависимость появляется, как и в случае использования незакрываемой скобки в секции setup
А можно подробней?
Какая там хронологическая зависимость в секции Function?
Что имеется в виду?
Пример есть?
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 04 фев 2023, 23:23
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;
}
все что внутри функции будет неизменным даже если поменять блоки местами на плате
т.е. в каком порядке вытащили блоки - в том порядке код и будет внутри функции
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 05 фев 2023, 07:40
Dryundel
artemka19 писал(а): 04 фев 2023, 23:23
т.е. в каком порядке вытащили блоки - в том порядке код и будет внутри функции
Это естественно. И что ? Это тут при чем? Вытаскивай в нужном порядке.
Рассматривается совсем другая задача.
В данном случае не требуется дополнительный блок, типа "Конечныйй".
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 05 фев 2023, 09:12
artemka19
Dryundel писал(а): 21 фев 2022, 18:16
И что ? Это тут при чем? Вытаскивай в нужном порядке
если знаешь об этом нюансе, то и будешь вытаскивать в нужном порядке, а если не знаешь?
Поэтому и добавил описание этой особенности
Лайфхаки (Маленькие хитрости) А так можно было?!
Добавлено: 05 фев 2023, 10:10
Phazz
Это все прекрасно, пока одна такая функция. Или не добавят другой блок с таким же лайфаком)