Вопрос немного праздный. При необходимости временной задержки при выполении функции пользуюсь такой конструкцией:
bool funct_del_flag=false;
void setup() {
}
void funct()
{ static unsigned long d_time;
if (!funct_del_flag)
{
...//инструкции до задержки
d_time=millis();
funct_del_flag=true;
}
else
{
...//инструкции до задержки
if((millis()-d_time)>=30)
{
funct_del_flag=false;
...//инструкции после задержки
}
}
}
void loop() {
...
if(funct_del_flag) funct();
...
}
То есть ставлю при первом вызове функции глобальный флаг задержки из функции также во внутринней перпменной присваиваю миллис(), и флаг задержки он активный эта функция дергается из LOOPа пока задержка не сработает далее функция выполняетчто нужно флаг устанвливается в ноль и все.
Но такой алгоритм не кажется мне красивым и удобным, но это все до чего я додумался.
Подскажите пожалуйста может кто знает как это же реализовать более красиво и удобно
внутри функции объявить статическую переменную флага (вместо глобальной переменной) и по истечении времени делать нужный функционал и сбросить флаг, а в общем - вполне рабочее решение.
Не нужно внешних глобальных переменных - заменить их на внутренние статические.
Функция-диспетчер должна быть не void, а bool.
Ну и действия по диспетчеризации можно включать в состав функции, которой нужна задержка. Но это уже по вкусу - зависит от того, сколько подобных функций нужно в текущем проекте (а то и во всех своих проектах - вопрос повторного использования кода никто не отменял).
Примечание: кстати, не очевидно, что булев флаг - это оптимальное решение. Он может принимать, скажем, 3 значения: при первом использовании (до задержки), после задержки, после того, как действие, требующее задержки, уже осуществлено.
Как мк стал заниматься понял, что памяти может не хватать. Отсюда у меня вопрос, наверное. Все равно bool один байт занимает, проще тогда его с умом использовать (там где это уместно), например, не два значения, а 3…254… Я к тому, что не совсем понимаю зачем в мк нужен такой тип (bool).
Канпилятор может обратить внимание на факт возврата из boolean-функции числа 3, к примеру.
Или не даст сделать boolean & 5, настаивая на &&.
Вобщем, дополнительная защита от дурака.
Я никогда не позиционировал себя как знатока С/С++, но мне кажется, здесь это не сработает. С/С++ - языки со слабой типизацией, в частности, bool рассматривается как разновидность int. Именно с этим связано, например, различие в записи между битовыми и логическими операциями: тип операции не может быть однозначно установлен по типам используемых в ней данных.
Да, недоделал.)) Нужна ещё одна проверка. Но это не лучше, чем у Alexey_Rem , просто как вариант. Избавиться от глобального флага не удалось. Надо будет ещё позаниматься.
Не совсем понял, зачем в 1-ом посте второй раз пишем инструкции до задержки (стр.17).
Ещё ,как вариант, делить функцию с задержкой на две функции и вызывать их по таймеру из loop().