Как работает millis()

igorcds
Offline
Зарегистрирован: 03.12.2013

Доброго времени суток.
Помогите понять как работает 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 в условии?

Спасибо.

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

Если расстояние больше или равно приблизительно 40см (это и есть условие, когда и только тогда start не равно 0) и это происходит более 30000 мс, то выполняются строки 17-18.

 

igorcds
Offline
Зарегистрирован: 03.12.2013

как больше??  так в условии написано

if (dist_cm < 40)
      {
         if(!start) start = millis();
       }

равно или примерно меньше...<  ? а в описании языка ....   !х - логическое отрицание, т.е условие верно - если х false, т.е х=0....  if(!x)  if- если, в скобках условие(!x)  или всеж таки не так? а если больше 40 см. - там же есть оператор else, и в else  горит лед1, не горит лед2 и переменная старт держится равной  0.....или я понял все наоборот?

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

Ну да, конечно меньше

demon969
Offline
Зарегистрирован: 24.04.2012

Подскажите пожалуйста, а какое максимальное  количество millis-ов можно использовать?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

demon969 пишет:

Подскажите пожалуйста, а какое максимальное  количество millis-ов можно использовать?

 

millis()  - он один на всех. И читать его можно сколько угодно раз.

А вот использовать, сравнивая с чем-то, можно пока хватает памяти на переменные, стек..... и т.д.

Но это уже совсем другая история...

igorcds
Offline
Зарегистрирован: 03.12.2013

Здравствуйте. В какой то из веток я уже спрашивал про количество millis(), мне ответили, что любое, хоть 50.... Я использую 4 millis- три для отработки сонара и один- для PIR sensor. Все это вроде отрабатывает без проблем. Единственное - я завел отдельное питание на реле(4 канала) и отдельное на ардуино(мини). Когда питание на релюхи шло от ардуино были глюки на сонарах....

igorcds
Offline
Зарегистрирован: 03.12.2013

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