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

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

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

#1

Сообщение Dryundel » 21.02.2022{, 17:12}

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


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

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

Если при разработке, на контроллере есть свободные пины, и/или не хватает пинов GND, VCC, можно не тянуть провода на макетку, а сделать из цифровых пинов те же GND и VCC.
Для этого надо создать цифровой выход и повесить на него true - для VCC и false - для GND.
Это подойдет для низко-токовых девайсов.
.
2.jpg
2.jpg (10.56 КБ) 2981 просмотр
Вариант подключенияПоказать
1.jpg

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

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

#2

Сообщение Dryundel » 21.02.2022{, 17:18}

Цифровой пин из аналогового
Если на Arduino NANO кончились цифровые пины, но есть свободные аналоговые (A6,A7), а вам ну позарез нужно подключить еще одну кнопку, воспользуйтесь блоком "Компаратор".
.
3.jpg
3.jpg (9.53 КБ) 2978 просмотров
.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

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

#3

Сообщение Dryundel » 21.02.2022{, 17:38}

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

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

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

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

int Number;
bool Switch;

  Switch = Number;

// Или так...

  if(Number){
      // Ваш код....
  }
Это работает

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

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

#4

Сообщение Dryundel » 21.02.2022{, 17:54}

C++

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

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

int Number;
bool Switch;

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

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

int Number;
bool Switch;

if  ( Number > 248){
     Switch = 1;
} else {
     Switch = 0;
}
Это тоже работает.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

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

#5

Сообщение Dryundel » 21.02.2022{, 18:16}

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

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

В этом случае, ваш блок вообще не создает переменных, а берет значение со входа и отправляет результат на выход.
.
4.jpg
В коде это выглядит так:Показать
6.jpg
6.jpg (5.95 КБ) 2958 просмотров
5.jpg

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

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

#6

Сообщение Dryundel » 21.02.2022{, 18:45}

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

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

Пример:
7.jpg
7.jpg (20.4 КБ) 2948 просмотров
В результате в код вставляется выражение с float.
Пример кодаПоказать
8.jpg

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

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

#7

Сообщение Dryundel » 29.06.2022{, 16:56}

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

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

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

Пример:
275 MB - Изначальный размер файла
262 MB - После замены всего пары блоков копированием. (минус 13.5MB с двух блоков)
Результат.jpg
Проблема обсуждалась здесь

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

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

#8

Сообщение Dryundel » 29.06.2022{, 19:36}

Как выполнить плату один раз (Аналогично Setup() )
Иногда требуется выполнить какие то действия один раз при старте контроллера.
Для этого
- Создаем одну переменную Boolean (Start) по умолчанию false.
- Размещаем на этой плате и в ней же приравниваем Start к true.
- Настраиваем выполнение платы пока Start = false
9.jpg
9.jpg (26.55 КБ) 2131 просмотр
Настройка платыПоказать
10.jpg
.
Всё. Теперь плата выполнится один раз при старте

artemka19
Лейтенант
Сообщения: 540
Зарегистрирован: 03.09.2020{, 15:41}
Репутация: 216
Откуда: Питер
Имя: Артем

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

#9

Сообщение artemka19 » 29.06.2022{, 21:27}

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

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

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

#10

Сообщение Dryundel » 01.09.2022{, 11:13}

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

На форуме есть поверье, что использование клемм оптимизирует проект, потому что не создаются переменные.
Да, действительно клемма не создает лишних переменных. Ключевое слово - лишних. Потому как в ряде случаев переменная клеммой все-таки создается.
Однако создание "лишних" переменных влияет только на красоту скетча и больше ни на что.
Проведем простой эксперимент.
Проект с одной переменной floatПоказать
1.jpg
Компилируем проект 1Показать
2.jpg
.
+2шт float - это как минимум 8 байт, плюс операции чтения и приравнивания
Теперь добавим переменныхПоказать
3.jpg
Компилируем проект 2Показать
4.jpg
.
Результат - программа не увеличилась ни на один байт.
Почему так происходит - Компилятор весьма умная штука. Он оптимизирует вашу программу и если существуют переменные в которых нет особого смысла, он их просто вырезает из итогового бинарного файла.
Вывод - если вам удобно пользоваться переменными, то пользуйтесь на здоровье. Если клеммы кажутся более симпатичными - тоже пожалуйста. На размер программы это не повлияет.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

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

#11

Сообщение Dryundel » 03.09.2022{, 09:16}

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

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.09.2022{, 10:03}
если проект на AVR имеет Integer и для переноса его на ESP32 нужно делать ка кие то изменения в проекте ?
Нет не надо. Для пользователя разницы нет. Компилятор сам трансформирует все int в long.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

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

#12

Сообщение Dryundel » 04.02.2023{, 18:13}

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

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

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

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

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

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

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

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

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

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

Пример.
Тест незакрытой функции.flp
(123.93 КБ) 15 скачиваний
.
1.jpg

artemka19
Лейтенант
Сообщения: 540
Зарегистрирован: 03.09.2020{, 15:41}
Репутация: 216
Откуда: Питер
Имя: Артем

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

#13

Сообщение artemka19 » 04.02.2023{, 19:50}

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

Отправлено спустя 1 минуту 2 секунды:
Dryundel писал(а):
04.02.2023{, 18:13}
4. Начало общей функции может быть любым но закрывающая скобка } должна отсутствовать
и это тоже только для setup

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

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

#14

Сообщение Dryundel » 04.02.2023{, 20:58}

artemka19 писал(а):
04.02.2023{, 19:51}
это только для секции setup
Это для секции Function.
Смотри пример.

artemka19
Лейтенант
Сообщения: 540
Зарегистрирован: 03.09.2020{, 15:41}
Репутация: 216
Откуда: Питер
Имя: Артем

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

#15

Сообщение artemka19 » 04.02.2023{, 21:44}

Dryundel писал(а):
04.02.2023{, 20:58}
Это для секции Function.
там хронологическая зависимость появляется, как и в случае использования незакрываемой скобки в секции setup

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

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

#16

Сообщение Dryundel » 04.02.2023{, 22:04}

artemka19 писал(а):
04.02.2023{, 21:44}
там хронологическая зависимость появляется, как и в случае использования незакрываемой скобки в секции setup
А можно подробней?
Какая там хронологическая зависимость в секции Function?
Что имеется в виду?
Пример есть?

artemka19
Лейтенант
Сообщения: 540
Зарегистрирован: 03.09.2020{, 15:41}
Репутация: 216
Откуда: Питер
Имя: Артем

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

#17

Сообщение artemka19 » 04.02.2023{, 23:23}

Dryundel писал(а):
04.02.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
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

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

#18

Сообщение Dryundel » 05.02.2023{, 07:40}

artemka19 писал(а):
04.02.2023{, 23:23}
т.е. в каком порядке вытащили блоки - в том порядке код и будет внутри функции
Это естественно. И что ? Это тут при чем? Вытаскивай в нужном порядке.
Рассматривается совсем другая задача.
В данном случае не требуется дополнительный блок, типа "Конечныйй".

artemka19
Лейтенант
Сообщения: 540
Зарегистрирован: 03.09.2020{, 15:41}
Репутация: 216
Откуда: Питер
Имя: Артем

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

#19

Сообщение artemka19 » 05.02.2023{, 09:12}

Dryundel писал(а):
21.02.2022{, 18:16}
И что ? Это тут при чем? Вытаскивай в нужном порядке
если знаешь об этом нюансе, то и будешь вытаскивать в нужном порядке, а если не знаешь?
Поэтому и добавил описание этой особенности

Аватара пользователя
Phazz
Полковник
Сообщения: 2552
Зарегистрирован: 17.10.2016{, 15:38}
Репутация: 367
Откуда: Сургут
Имя: Анатолий

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

#20

Сообщение Phazz » 05.02.2023{, 10:10}

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

Ответить

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