Как подружить цикл FOR и функцию millis() ?

tesak47
Offline
Зарегистрирован: 22.01.2015

Подскажите пожалуйсте есть ли решение (уже прогуглил и многое перепробовал) для того чтобы подружить цикл for и millis. Имею такой кусок кода:

for (int i = 0; i < 255; i++) {
analogWrite(motorPin, i);
delay (50);
}

Хочу сделать так, чтобы каждая интерация цикла проходила через 50 мс, но без delay.  

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

используйте цикл

while(){}

Можно конечно попробовать извратиться и попробовать сделать множественные условия в for(), но не советую.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Вопрос философский, потому что код вырван из общего контекста задачи. Если задержка должна быть только внутри for, то нет смысла убирать delay, если и сам цикл должен на эти 50 ms должен отдавать время остальной задаче, тогда другое, но тогда нужно знать в каком контексте выполняется этот цикл. Если он выполняется в loop, тогда просто (см. BlinkWithoutDelay в примерах IDE), а если внутри функции, тогда нужно смотреть как и когда вызывается эта функция. Немаловажный вопрос здесь, точность выполнения интервалов (тогда правильней повесить на таймер, например, либо, если это не важно, тогда другое дело).

 

tesak47
Offline
Зарегистрирован: 22.01.2015

Я вообще осваиваю программирование. Просто сам задалася таким вопросом и решить самостоятельно никак не получается. Конкретно пытался выполнить следующее:

считывание показаний с ультразвукового дальномера, постоянный опрос цифрового пина на появление сигнала с кнопки при одновременном выполнении цикла. Цикл как и считывание показаний с дальномера и опрос цифрового пина выполняются на равных условиях в процедуре void loop() Естественно все должно происходить без задержек.

Вопрос чисто академического характера. У меня никак не получилось использовать millis внутри цикла. Может поможете уважаемый kisoft разобраться?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

И здесь и где только нет, гуглите, читайте вникайте .. по ключевикам "Blink без delay()" .. полно.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Совсем без задержки вряд ли получится: в стандартном способе работы с ультразвуковым дальномером используется pulseIn(), которая и будет давать задержку равную удвоеннгму времени прохождения звука до препятствия.

Кроме того, кнопкам обычно присущь дребезг, для его подавления также нужна задержка.

Так что в принципе, куда копать, Вам посоветовали: blink without delay, но возможны многочисленные тонкости.

std
Offline
Зарегистрирован: 05.01.2012
unsigned long timestamp;
byte i;
loop(){
  if(i<255 && millis()-timestamp>=50){
    i++;
    analogWrite(motorPin,i);
    timestamp=millis();
  }
}

Дальше можно додумать там, переменную dir приделать, если 0 - убавлять, а если 1 - прибавлять, разные вариации.. А, да, донатить аддену можно на ЯД 410011919696337 или 410011915019172, QIWI +79145891987. 10 юаней будет достаточно :) Ну, раз уж я расчехляю клешни, и вместо того чтобы раковать в доту, пишу всякие кодЫ.

Собсно, моя основная мысль: вытащить увеличение мотора из цикла, пусть оно станет глобальным процессом.

MacSim
Offline
Зарегистрирован: 28.11.2012

std пишет:

 расчехляю клешни, ..... раковать в доту..

ветвь развития тупиковая.

обучая обучаешся.