Лайфхаки (Маленькие хитрости) А так можно было?!
- Dryundel
- Полковник
- Сообщения: 2406
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 15 раз
Лайфхаки (Маленькие хитрости) А так можно было?!
Тема для маленьких хитростей и полезностей, которыми вы пользуетесь при работе в FLProg и хотите ими поделиться.
Все что касается, разработки, сборки, программирования. Выкладываем то, что вы где то подсмотрели или придумали.
Зачастую самые элементарные вещи оказываются полезны для других.
Старайтесь как можно внятней и подробней донести до коллег идею.
Предупреждение.
Обсуждения в данной теме не возбраняются, но со временем будут удаляться во благо полезного контента.
Пример:
Пусть это будет первый лайфхак в этой теме.
Если при разработке, на контроллере есть свободные пины, и/или не хватает пинов GND, VCC, можно не тянуть провода на макетку, а сделать из цифровых пинов те же GND и VCC.
Для этого надо создать цифровой выход и повесить на него true - для VCC и false - для GND.
Это подойдет для низко-токовых девайсов.
. [spoiler=Вариант подключения] [/spoiler]
Все что касается, разработки, сборки, программирования. Выкладываем то, что вы где то подсмотрели или придумали.
Зачастую самые элементарные вещи оказываются полезны для других.
Старайтесь как можно внятней и подробней донести до коллег идею.
Предупреждение.
Обсуждения в данной теме не возбраняются, но со временем будут удаляться во благо полезного контента.
Пример:
Пусть это будет первый лайфхак в этой теме.
Если при разработке, на контроллере есть свободные пины, и/или не хватает пинов GND, VCC, можно не тянуть провода на макетку, а сделать из цифровых пинов те же GND и VCC.
Для этого надо создать цифровой выход и повесить на него true - для VCC и false - для GND.
Это подойдет для низко-токовых девайсов.
. [spoiler=Вариант подключения] [/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Dryundel
- Полковник
- Сообщения: 2406
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 15 раз
Лайфхаки (Маленькие хитрости) А так можно было?!
Цифровой пин из аналогового
Если на Arduino NANO кончились цифровые пины, но есть свободные аналоговые (A6,A7), а вам ну позарез нужно подключить еще одну кнопку, воспользуйтесь блоком "Компаратор".
. .
Если на Arduino NANO кончились цифровые пины, но есть свободные аналоговые (A6,A7), а вам ну позарез нужно подключить еще одну кнопку, воспользуйтесь блоком "Компаратор".
. .
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Dryundel
- Полковник
- Сообщения: 2406
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 15 раз
Лайфхаки (Маленькие хитрости) А так можно было?!
C++
При написании кода, когда требуется присвоить boolean переменной ineger
"false" - если целочисленная integer равна нулю
и "true" - если не равна нулю.
Не обязательно писать условие. Можно сделать так:
Это работает
При написании кода, когда требуется присвоить boolean переменной ineger
"false" - если целочисленная integer равна нулю
и "true" - если не равна нулю.
Не обязательно писать условие. Можно сделать так:
Код: Выделить всё
int Number;
bool Switch;
Switch = Number;
// Или так...
if(Number){
// Ваш код....
}
- Dryundel
- Полковник
- Сообщения: 2406
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 15 раз
Лайфхаки (Маленькие хитрости) А так можно было?!
C++
Переменной boolean можно приравнять условие:
И это будет равносильно:
Это тоже работает.
Переменной 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 раз
Лайфхаки (Маленькие хитрости) А так можно было?!
Новый редактор (Code Professional)
Если в новом редакторе у выхода снять галку "Создавать переменную для выхода", то в появившемся окне можно написать любое выражение для вычисления. Очень актуально например для маленьких блоков с формулами.
В этом случае, ваш блок вообще не создает переменных, а берет значение со входа и отправляет результат на выход.
. [spoiler=В коде это выглядит так:] [/spoiler]
Если в новом редакторе у выхода снять галку "Создавать переменную для выхода", то в появившемся окне можно написать любое выражение для вычисления. Очень актуально например для маленьких блоков с формулами.
В этом случае, ваш блок вообще не создает переменных, а берет значение со входа и отправляет результат на выход.
. [spoiler=В коде это выглядит так:] [/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Dryundel
- Полковник
- Сообщения: 2406
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 15 раз
Лайфхаки (Маленькие хитрости) А так можно было?!
Новый редактор (Code Professional)
В новом редакторе, на входе, тип численной переменной не определен. Можно создать вход любого типа (Исключение String и char).
То есть, если вы создали вход integer, а в проекте подаете на него float, то и в вычисление пойдет float. Переопределения типа переменной, на входе не произойдет.
Мало того, блок опят таки не будет создавать для входа переменных, а отправит пришедшее на вход, прямиком в ваши вычисления.
Пример: В результате в код вставляется выражение с float.
[spoiler=Пример кода] [/spoiler]
В новом редакторе, на входе, тип численной переменной не определен. Можно создать вход любого типа (Исключение String и char).
То есть, если вы создали вход integer, а в проекте подаете на него float, то и в вычисление пойдет float. Переопределения типа переменной, на входе не произойдет.
Мало того, блок опят таки не будет создавать для входа переменных, а отправит пришедшее на вход, прямиком в ваши вычисления.
Пример: В результате в код вставляется выражение с float.
[spoiler=Пример кода] [/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Dryundel
- Полковник
- Сообщения: 2406
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 15 раз
Лайфхаки (Маленькие хитрости) А так можно было?!
Размер проекта.
С увеличением в проекте числа пользовательских блоков созданных в Новом редакторе (Code Professional) размер файла становится очень большим, вплоть до того, что даже не сохраняется. Работать с таким файлом тяжело, тормоза жуткие.
Есть разница, и огромная, как вставлять новый блок в проект.
Если каждый раз вытаскивать из панели ПБ очередную копию блока, файл растет непомерными темпами.
Если же скопировать и вставить уже имеющийся в проекте блок, прибавка к размеру файла копеечная.
Последующее изменение параметров, на размер влияет незначительно.
Пример:
275 MB - Изначальный размер файла
262 MB - После замены всего пары блоков копированием. (минус 13.5MB с двух блоков) Проблема обсуждалась здесь
С увеличением в проекте числа пользовательских блоков созданных в Новом редакторе (Code Professional) размер файла становится очень большим, вплоть до того, что даже не сохраняется. Работать с таким файлом тяжело, тормоза жуткие.
Есть разница, и огромная, как вставлять новый блок в проект.
Если каждый раз вытаскивать из панели ПБ очередную копию блока, файл растет непомерными темпами.
Если же скопировать и вставить уже имеющийся в проекте блок, прибавка к размеру файла копеечная.
Последующее изменение параметров, на размер влияет незначительно.
Пример:
275 MB - Изначальный размер файла
262 MB - После замены всего пары блоков копированием. (минус 13.5MB с двух блоков) Проблема обсуждалась здесь
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Dryundel
- Полковник
- Сообщения: 2406
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 15 раз
Лайфхаки (Маленькие хитрости) А так можно было?!
Как выполнить плату один раз (Аналогично Setup() )
Иногда требуется выполнить какие то действия один раз при старте контроллера.
Для этого
- Создаем одну переменную Boolean (Start) по умолчанию false.
- Размещаем на этой плате и в ней же приравниваем Start к true.
- Настраиваем выполнение платы пока Start = false [spoiler=Настройка платы] [/spoiler]
.
Всё. Теперь плата выполнится один раз при старте
Иногда требуется выполнить какие то действия один раз при старте контроллера.
Для этого
- Создаем одну переменную Boolean (Start) по умолчанию false.
- Размещаем на этой плате и в ней же приравниваем Start к true.
- Настраиваем выполнение платы пока Start = false [spoiler=Настройка платы] [/spoiler]
.
Всё. Теперь плата выполнится один раз при старте
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Лейтенант
- Сообщения: 540
- Зарегистрирован: 03 сен 2020, 15:41
- Откуда: Питер
- Имя: Артем
- Поблагодарили: 1 раз
Лайфхаки (Маленькие хитрости) А так можно было?!
[spoiler]
создаем Одну переменную в проекте. Сохраняем и закрываем проект. Открываем проект как xml файл: находим там переменную по имени заданному в проекте: выделяем секцию и копируем ее: теперь просто вставляем сочетанием "ctrl+v+enter" столько раз, сколько нужно: теперь открываем проект и видим результат: [/spoiler]
таким же образом можно править/переносить, например, веб-интерфейс из проекта в проект.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Dryundel
- Полковник
- Сообщения: 2406
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 15 раз
Лайфхаки (Маленькие хитрости) А так можно было?!
Оптимизация - Переменная или клема?
На форуме есть поверье, что использование клемм оптимизирует проект, потому что не создаются переменные.
Да, действительно клемма не создает лишних переменных. Ключевое слово - лишних. Потому как в ряде случаев переменная клеммой все-таки создается.
Однако создание "лишних" переменных влияет только на красоту скетча и больше ни на что.
Проведем простой эксперимент.
[spoiler=Проект с одной переменной float] [/spoiler]
[spoiler=Компилируем проект 1] [/spoiler]
.
+2шт float - это как минимум 8 байт, плюс операции чтения и приравнивания
[spoiler=Теперь добавим переменных] [/spoiler]
[spoiler=Компилируем проект 2] [/spoiler]
.
Результат - программа не увеличилась ни на один байт.
Почему так происходит - Компилятор весьма умная штука. Он оптимизирует вашу программу и если существуют переменные в которых нет особого смысла, он их просто вырезает из итогового бинарного файла.
Вывод - если вам удобно пользоваться переменными, то пользуйтесь на здоровье. Если клеммы кажутся более симпатичными - тоже пожалуйста. На размер программы это не повлияет.
На форуме есть поверье, что использование клемм оптимизирует проект, потому что не создаются переменные.
Да, действительно клемма не создает лишних переменных. Ключевое слово - лишних. Потому как в ряде случаев переменная клеммой все-таки создается.
Однако создание "лишних" переменных влияет только на красоту скетча и больше ни на что.
Проведем простой эксперимент.
[spoiler=Проект с одной переменной float] [/spoiler]
[spoiler=Компилируем проект 1] [/spoiler]
.
+2шт float - это как минимум 8 байт, плюс операции чтения и приравнивания
[spoiler=Теперь добавим переменных] [/spoiler]
[spoiler=Компилируем проект 2] [/spoiler]
.
Результат - программа не увеличилась ни на один байт.
Почему так происходит - Компилятор весьма умная штука. Он оптимизирует вашу программу и если существуют переменные в которых нет особого смысла, он их просто вырезает из итогового бинарного файла.
Вывод - если вам удобно пользоваться переменными, то пользуйтесь на здоровье. Если клеммы кажутся более симпатичными - тоже пожалуйста. На размер программы это не повлияет.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Dryundel
- Полковник
- Сообщения: 2406
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 15 раз
Лайфхаки (Маленькие хитрости) А так можно было?!
Редкая информация
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 с ним работать не умеют.
.
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 с ним работать не умеют.
.
Нет не надо. Для пользователя разницы нет. Компилятор сам трансформирует все int в long.cfitymrf писал(а): 03 сен 2022, 10:03 если проект на AVR имеет Integer и для переноса его на ESP32 нужно делать ка кие то изменения в проекте ?
- Dryundel
- Полковник
- Сообщения: 2406
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 15 раз
Лайфхаки (Маленькие хитрости) А так можно было?!
Новый редактор (Code Professional)
Вложение кода из экземпляров блока в общую функцию
Данная проблема давно занимала умы создателей блоков. И хотя решение частичное, однако оно работает.
ЗАДАЧА:
Вложить некий аналогичный код из разных экземпляров блока в одну общую функцию. Так, чтобы идентификаторы экземпляров во вложенном коде соответствовали этим экземплярам.
РЕШЕНИЕ:
1. Общая функция (в которую вкладывается код) должна находиться выше по иерархии
- Основные настройки (Секция Function)
- Общий код блока (Секция Function)
- Код каждого экземпляра (Секция Function)
2. Общая функция должна быть на последнем месте в дереве
3. Ниже по иерархии относительно этой общей функции не должно быть объявлено других функций.
4. Начало общей функции может быть любым но закрывающая скобка } должна отсутствовать.
5. Код который вкладывается должен быть в Секция Function ниже по иерархии.
6. Закрывающая скобка } не нужна ! Она сгенерируется автоматически при компиляции.
Пример. .
Вложение кода из экземпляров блока в общую функцию
Данная проблема давно занимала умы создателей блоков. И хотя решение частичное, однако оно работает.

ЗАДАЧА:
Вложить некий аналогичный код из разных экземпляров блока в одну общую функцию. Так, чтобы идентификаторы экземпляров во вложенном коде соответствовали этим экземплярам.
РЕШЕНИЕ:
1. Общая функция (в которую вкладывается код) должна находиться выше по иерархии
- Основные настройки (Секция Function)
- Общий код блока (Секция Function)
- Код каждого экземпляра (Секция Function)
2. Общая функция должна быть на последнем месте в дереве
3. Ниже по иерархии относительно этой общей функции не должно быть объявлено других функций.
4. Начало общей функции может быть любым но закрывающая скобка } должна отсутствовать.
5. Код который вкладывается должен быть в Секция Function ниже по иерархии.
6. Закрывающая скобка } не нужна ! Она сгенерируется автоматически при компиляции.
Пример. .
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Лейтенант
- Сообщения: 540
- Зарегистрирован: 03 сен 2020, 15:41
- Откуда: Питер
- Имя: Артем
- Поблагодарили: 1 раз
Лайфхаки (Маленькие хитрости) А так можно было?!
это только для секции setupDryundel писал(а): 04 фев 2023, 18:13 6. Закрывающая скобка } не нужна ! Она сгенерируется автоматически при компиляции
Отправлено спустя 1 минуту 2 секунды:
и это тоже только для setupDryundel писал(а): 04 фев 2023, 18:13 4. Начало общей функции может быть любым но закрывающая скобка } должна отсутствовать
- Dryundel
- Полковник
- Сообщения: 2406
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 15 раз
-
- Лейтенант
- Сообщения: 540
- Зарегистрирован: 03 сен 2020, 15:41
- Откуда: Питер
- Имя: Артем
- Поблагодарили: 1 раз
Лайфхаки (Маленькие хитрости) А так можно было?!
там хронологическая зависимость появляется, как и в случае использования незакрываемой скобки в секции setup
- Dryundel
- Полковник
- Сообщения: 2406
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 15 раз
Лайфхаки (Маленькие хитрости) А так можно было?!
А можно подробней?artemka19 писал(а): 04 фев 2023, 21:44 там хронологическая зависимость появляется, как и в случае использования незакрываемой скобки в секции setup
Какая там хронологическая зависимость в секции Function?
Что имеется в виду?
Пример есть?
-
- Лейтенант
- Сообщения: 540
- Зарегистрирован: 03 сен 2020, 15:41
- Откуда: Питер
- Имя: Артем
- Поблагодарили: 1 раз
Лайфхаки (Маленькие хитрости) А так можно было?!
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 раз
Лайфхаки (Маленькие хитрости) А так можно было?!
Это естественно. И что ? Это тут при чем? Вытаскивай в нужном порядке.artemka19 писал(а): 04 фев 2023, 23:23 т.е. в каком порядке вытащили блоки - в том порядке код и будет внутри функции
Рассматривается совсем другая задача.
В данном случае не требуется дополнительный блок, типа "Конечныйй".
-
- Лейтенант
- Сообщения: 540
- Зарегистрирован: 03 сен 2020, 15:41
- Откуда: Питер
- Имя: Артем
- Поблагодарили: 1 раз
Лайфхаки (Маленькие хитрости) А так можно было?!
если знаешь об этом нюансе, то и будешь вытаскивать в нужном порядке, а если не знаешь?
Поэтому и добавил описание этой особенности
- Phazz
- Полковник
- Сообщения: 3110
- Зарегистрирован: 17 окт 2016, 15:38
- Откуда: Сургут
- Имя: Анатолий
- Благодарил (а): 228 раз
- Поблагодарили: 107 раз
Лайфхаки (Маленькие хитрости) А так можно было?!
Это все прекрасно, пока одна такая функция. Или не добавят другой блок с таким же лайфаком)
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя