Использование millis вместо delay в цикле

artivad2
Offline
Зарегистрирован: 16.03.2018

Привет.

У меня есть адресная светодиодная лента, которая реагирует на звук по определенному алгоритму (цветомузыка короче), через ардуино разумеется.

В приведенном ниже куске кода исполняется функция, в которой лента зажигается полностью определенным цветом (когда приходит сигнал с микрофона), затем постепенно затухает. Для этого я использую метод 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) {
      ???
    }

  }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Даже если Вы как-то замените, это Вас не спасёт. Проограмма ведь всё равно будет крутиться в Вашем цикле for, а в нём нет слушания микрофона.

Переделка программы идёт не через механическую замену, а через изменение стуктуры программы так, чтобы этого цикла for не было вовсе.

Понимете, о чём я? 

artivad2
Offline
Зарегистрирован: 16.03.2018

Понимаю.. Попробую по другому организовать. Но всё же.. Как можно использовать millis в цикле (задержать его выполнение на заданное время), просто на будущее? Я пока начинающий ардуинец, поэтому могу задавать глупые вопросы :)

negavoid
Offline
Зарегистрирован: 09.07.2016

Для приведенного вами цикла, если нужно задерживать его выполнение на каждой итерации, так и юзайте delay(), это будет "правильно".

leks
Offline
Зарегистрирован: 22.10.2017

////  ФУНКЦИИ ОПИСАНИЕ // вместо задержки времени через 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);}// гашение ленты 
 
 }}
}
 ///////////////////////////////////////////////////////////////////////////////////////////////////////
leks
Offline
Зарегистрирован: 22.10.2017

Можно так, не ломая желанной структуры - вводите дополнительную функцию delay_(); и в ней, например, проверяете микрофон или ещё чего.  

leks
Offline
Зарегистрирован: 22.10.2017

В примере моём, строки 7-16 (закрывающую скобку не забываем оставить) как раз и выполняют те действия которые в "обычном" delay(); будут пропущены.

artivad2
Offline
Зарегистрирован: 16.03.2018

Спасибо, попробую!

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

1. Читаем про yield().

2. Выбрасывам костыли, и продолжяем юзать delay()

3. Профит! ;)))

===================

Лекс! Это больше к тебе вопрос был, пусть в ироничной форме. Если добавлять что-то в delay(), то за нас уже все сделали..

MaksVV
Offline
Зарегистрирован: 06.08.2015