Delay без остановки всей программы?

Soso
Offline
Зарегистрирован: 22.03.2011

 Простая ситуация, моргаем светодиодом. Т.е в программе в каждом цикле loop, идет delay(900), но при этом программа стоит, можно ли как-то обойтись вообще без delay, и при этом моргать с заданной частотой.
Заранее спасибо за помощь новичку.

Starpom
Offline
Зарегистрирован: 06.03.2011

 В таком случае надо танцевать не от delay, а просто засекать и сравнивать время с помощь функции millis. Ниже пример с англоязычного сайта

const int ledPin = 13; // пин светодиода
int ledState = LOW; // текущее состояние светодиода
long previousMillis = 0; // переменная для хранения времени
long interval = 900; // интервал для моргания
void setup() {
  pinMode(ledPin, OUTPUT);
}
void loop()
{
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) { //проверяем не пора ли моргнуть
   previousMillis = currentMillis; //моргнули и сохранили последнее время
  // включаем или выключаем в зависимости от текущего состояния
  if (ledState == LOW)
    ledState = HIGH;
  else
    ledState = LOW;
 digitalWrite(ledPin, ledState);
 }
}
 

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

неплохой пример. Но лучше мне кажется организовать сброс таймера все таки. Это же возможно, или все таки не нужно. 

Modular
Offline
Зарегистрирован: 05.03.2011

 У ардуино один таймер, зачем же его сбрасывать, вдруг в каком другом месте нужен будет. Вполне рабочее решение выше предложено.

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

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

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

millis(), конечно слегка освобождает руки для каких то других процессов, но если процесс достаточно долгий можно и пропустить нужный момент... и если для моргания светодиодом это не принципиально и не критично, то в нормально работающей системе будет трудно... возможно придется что то взять отсюда? http://arduino.ru/Tutorial/Arduino_Interrupts
 

Смиирняга
Offline
Зарегистрирован: 08.04.2011

Вы не пропустите момент с этим кодом!!

if(currentMillis - previousMillis > interval)

Знак > следовательно вы не пропустите момент, а только один раз сдвините момент(с 900 например до 1000), а потом интервал снова станет 900!

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

Достаточно простое и надежное решение, если есть где воткнуть в основной цикл. Думаю в каждом отдельном случае есть место для своего варианта.. )