Как работает millis()
- Войдите на сайт для отправки комментариев
Доброго времени суток.
Помогите понять как работает millis().
Вот например код:
void loop() { float dist_cm = ultrasonic.Ranging(CM); // get distance static unsigned long start = 0; if (dist_cm < 40) { if(!start) start = millis(); } else { start = 0; digitalWrite(ledPin_1, HIGH); digitalWrite(ledPin_2, LOW); } if(start && (millis()-start > 30000)) { digitalWrite(ledPin_2, HIGH); digitalWrite(ledPin_1, LOW); } delay(100); }
Если нет препятствий в зоне видимости ближе 40см. -- LED1 горит, LED2 отключен, переменная start=0. И так продолжается до тех пор пока не появится препятсвие ближе 40см.
При появлении препятствия ближе 40см. отрабатывает код :
if (dist_cm < 40) { if(!start) start = millis(); }
и далее код
if(start && (millis()-start > 30000))
И пока эта строка не отработает 30 секунд нечего другое не выполняется, только снимается показания сонара, так как показания сонара снимаются до условия if (dist_cm < 40).
Команда if(!start) start = millis() означает, что при start=0(означает, что millis не выполняется) присвоить переменной start значение millis() и перейти к строке 16 где выполняется отсчет 30 секунд. После того, как пройдет 30 секунд- изменить состояние LED1 и LED2. LED1 - погаснет, LED2 - включится. Правильно?
Что означает if(start && (millis()-start > 30000)) ? вернее какое условие выполняет первая переменная start в условии?
Спасибо.
Если расстояние больше или равно приблизительно 40см (это и есть условие, когда и только тогда start не равно 0) и это происходит более 30000 мс, то выполняются строки 17-18.
как больше?? так в условии написано
равно или примерно меньше...< ? а в описании языка .... !х - логическое отрицание, т.е условие верно - если х false, т.е х=0.... if(!x) if- если, в скобках условие(!x) или всеж таки не так? а если больше 40 см. - там же есть оператор else, и в else горит лед1, не горит лед2 и переменная старт держится равной 0.....или я понял все наоборот?
Ну да, конечно меньше
Подскажите пожалуйста, а какое максимальное количество millis-ов можно использовать?
Подскажите пожалуйста, а какое максимальное количество millis-ов можно использовать?
millis() - он один на всех. И читать его можно сколько угодно раз.
А вот использовать, сравнивая с чем-то, можно пока хватает памяти на переменные, стек..... и т.д.
Но это уже совсем другая история...
Здравствуйте. В какой то из веток я уже спрашивал про количество millis(), мне ответили, что любое, хоть 50.... Я использую 4 millis- три для отработки сонара и один- для PIR sensor. Все это вроде отрабатывает без проблем. Единственное - я завел отдельное питание на реле(4 канала) и отдельное на ардуино(мини). Когда питание на релюхи шло от ардуино были глюки на сонарах....
да, извеняюсь, неправильно выразился. millis() один на всех(отсчет времени от начала работы программы), но считать он может любое количество раз