Официальный сайт компании Arduino по адресу arduino.cc
Использование millis вместо delay в цикле
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пт, 18/01/2019 - 16:57
Привет.
У меня есть адресная светодиодная лента, которая реагирует на звук по определенному алгоритму (цветомузыка короче), через ардуино разумеется.
В приведенном ниже куске кода исполняется функция, в которой лента зажигается полностью определенным цветом (когда приходит сигнал с микрофона), затем постепенно затухает. Для этого я использую метод strip.setBrightness и задержку в цикле, чтобы затухание не происходило резко. Но delay полностью останавливает программу и в этот момент схема не реагирует на другие звуки, а мне бы хотелось, чтобы он продолжал реагировать на звук и заново зажигал ленту при новом звуке.
//Этот кусок кода производит затухание ленты for(uint16_t i = 200; i > 0; i=i-20) { strip.setBrightness(i); strip.show(); delay(50); //Это надо заменить }
Полагаю надо использовать millis, но как правильно это организовать?
Пробую вот так, но не знаю что писать в теле if..
oldtime = millis(); for(uint16_t i = 200; i > 0; i=i-20) { strip.setBrightness(i); strip.show(); newtime = millis(); if ((newtime - oldtime) >= 50) { ??? } }
Даже если Вы как-то замените, это Вас не спасёт. Проограмма ведь всё равно будет крутиться в Вашем цикле for, а в нём нет слушания микрофона.
Переделка программы идёт не через механическую замену, а через изменение стуктуры программы так, чтобы этого цикла for не было вовсе.
Понимете, о чём я?
Понимаю.. Попробую по другому организовать. Но всё же.. Как можно использовать millis в цикле (задержать его выполнение на заданное время), просто на будущее? Я пока начинающий ардуинец, поэтому могу задавать глупые вопросы :)
Для приведенного вами цикла, если нужно задерживать его выполнение на каждой итерации, так и юзайте delay(), это будет "правильно".
Можно так, не ломая желанной структуры - вводите дополнительную функцию delay_(); и в ней, например, проверяете микрофон или ещё чего.
В примере моём, строки 7-16 (закрывающую скобку не забываем оставить) как раз и выполняют те действия которые в "обычном" delay(); будут пропущены.
Спасибо, попробую!
1. Читаем про yield().
2. Выбрасывам костыли, и продолжяем юзать delay()
3. Профит! ;)))
===================
Лекс! Это больше к тебе вопрос был, пусть в ироничной форме. Если добавлять что-то в delay(), то за нас уже все сделали..
тут уже было