Официальный сайт компании Arduino по адресу arduino.cc
Delay без остановки всей программы?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пт, 25/03/2011 - 19:47
Простая ситуация, моргаем светодиодом. Т.е в программе в каждом цикле loop, идет delay(900), но при этом программа стоит, можно ли как-то обойтись вообще без delay, и при этом моргать с заданной частотой.
Заранее спасибо за помощь новичку.
В таком случае надо танцевать не от 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);
}
}
неплохой пример. Но лучше мне кажется организовать сброс таймера все таки. Это же возможно, или все таки не нужно.
У ардуино один таймер, зачем же его сбрасывать, вдруг в каком другом месте нужен будет. Вполне рабочее решение выше предложено.
Ну он же не бесконечно считает. Но я все равно понял. Долго везжаю просто в коды программ, еще учусь всетаки.
millis(), конечно слегка освобождает руки для каких то других процессов, но если процесс достаточно долгий можно и пропустить нужный момент... и если для моргания светодиодом это не принципиально и не критично, то в нормально работающей системе будет трудно... возможно придется что то взять отсюда? http://arduino.ru/Tutorial/Arduino_Interrupts
Вы не пропустите момент с этим кодом!!
if(currentMillis - previousMillis > interval)
Знак > следовательно вы не пропустите момент, а только один раз сдвините момент(с 900 например до 1000), а потом интервал снова станет 900!
Достаточно простое и надежное решение, если есть где воткнуть в основной цикл. Думаю в каждом отдельном случае есть место для своего варианта.. )