Использование millis вместо delay в цикле
- Войдите на сайт для отправки комментариев
Привет.
У меня есть адресная светодиодная лента, которая реагирует на звук по определенному алгоритму (цветомузыка короче), через ардуино разумеется.
В приведенном ниже куске кода исполняется функция, в которой лента зажигается полностью определенным цветом (когда приходит сигнал с микрофона), затем постепенно затухает. Для этого я использую метод 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 //////////////////////////////////////// void delay_(int T1) { Y=millis(); while(millis()-Y<T1) { CheckSerial();//ЖДЁМ ПОСТУПЛЕНИЯ КОМАНДЫ НА ИЗМЕНЕНИЕ ВЫПОЛНЕНИЯ ПЕРЕКЛЮЧЕНИЙ ЛЕНТЫ if (v==0){n=map(analogRead(A0), 0,1023, 20, 120);//регулировка скорости переключений ленты по потенциометру Mx=map(analogRead(A1), 0,1023, 40, 255);//регулировка яркости переключений ленты по потенциометру N=map(analogRead(A2), 0,1023, 0, 4);//выбор программы переключений ленты по потенциометру } while(v==2||v==3) {CheckSerial();//ЖДЁМ ПОСТУПЛЕНИЯ КОМАНДЫ НА ИЗМЕНЕНИЕ ВЫПОЛНЕНИЯ ПЕРЕКЛЮЧЕНИЙ ЛЕНТЫ if (v==2){delay(50);}//стоп кадр if (v==3){delay(50); analogWrite(Re,0); analogWrite(Gr,0); analogWrite(Bl,0);}// гашение ленты }} } ///////////////////////////////////////////////////////////////////////////////////////////////////////Можно так, не ломая желанной структуры - вводите дополнительную функцию delay_(); и в ней, например, проверяете микрофон или ещё чего.
В примере моём, строки 7-16 (закрывающую скобку не забываем оставить) как раз и выполняют те действия которые в "обычном" delay(); будут пропущены.
Спасибо, попробую!
1. Читаем про yield().
2. Выбрасывам костыли, и продолжяем юзать delay()
3. Профит! ;)))
===================
Лекс! Это больше к тебе вопрос был, пусть в ироничной форме. Если добавлять что-то в delay(), то за нас уже все сделали..
тут уже было