Объясните как работать с millis();

Magomed Gazimag...
Offline
Зарегистрирован: 12.01.2021

на этом простом примере хочу чтоб через 10 секунд включилась светодтод. потом через 30 секунд второй светодиод.

как сделать так чтоб через 1 минуту выключились оба светодтода и не включались больше до следущей перезагрузки.

 

unsigned long ZADERGKA;
unsigned long ZADERGKA2;

void setup(){
   pinMode(13,OUTPUT);
    pinMode(6,OUTPUT);
  

}
void loop(){
  if(millis()-ZADERGKA>10000){
    ZADERGKA=millis();
      digitalWrite(13,HIGH);
      }
     
  if(millis()-ZADERGKA2>30000){
     ZADERGKA2=millis();
       digitalWrite(6,HIGH);
  

  
}

}

 

nik182
Offline
Зарегистрирован: 04.05.2015

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

точка начала отсчёта всего одна, так что переменная нужна только под неё, далее нужен флаг, как только оттикает время на выключение, взводим флаг и выключаем светодиоды, естественно в условия на включение добавить && !flag

строки 12 и 17 удалить за бессмысленностью

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

А можно и без переменных, а флаг только защита от переполнения millis().

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AndreyD пишет:

А можно и без переменных, а флаг только защита от переполнения millis().

можно

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

А можно решить эту задачу вообще без использования переменных (флаг - это тоже переменная).

Pyotr
Offline
Зарегистрирован: 12.03.2014

А вообще скажу так: тема millis() не раскрыта ))) 
Вопросы к ТС.
1)  Почему написали if(millis()-ZADERGKA>10000)  
а не как обычно в примерах   if(millis()-ZADERGKA>=10000) ?

2)  

if(millis()-ZADERGKA>10000){
      ZADERGKA=millis();

 Всегда ли будет millis()  во второй строке равняться millis() в первой строке? (возвращаемые значения)

 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

andriano пишет:

А можно решить эту задачу вообще без использования переменных (флаг - это тоже переменная).

while(1) {}

в третьем условном операторе?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Pyotr пишет:

Всегда ли будет millis() во второй строке равняться millis() в первой строке? (возвращаемые значения)

Ой, не будите спящую собаку старый срач!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Pyotr пишет:
Всегда ли будет millis()  во второй строке равняться millis() в первой строке? (возвращаемые значения)

В данном конкретном случае - будет.  Но, если ТС понапишет еще чонить между if-ами, то будет зависеть от "чонить"

Green
Offline
Зарегистрирован: 01.10.2015

Однако, никто ведь не обращает внимание на оформление. А зря. Лично я предпочитаю всё оформить inline функцией или макро. Ведь один раз подумал и забыл напрочь! И всё красиво, без каких то комментариев. Типа, every(1000)  toggle(LED); или once(1000) on(LED); как в данном случае. Нет, вы всю дорогу громоздите монструозные конструкции! Ужос!

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Green пишет:

Однако, никто ведь не обращает внимание на оформление. А зря. Лично я предпочитаю всё оформить inline функцией или макро. Ведь один раз подумал и забыл напрочь! И всё красиво, без каких то комментариев. Типа, every(1000)  toggle(LED); или once(1000) on(LED); как в данном случае. Нет, вы всю дорогу громоздите монструозные конструкции! Ужос!

Федор, плз без обид, но тут вопрос вкусов. Я каждый раз, когда ты приводишь код со своими макросами монструозными, внутренне содрогаюсь. ;)) Особенно every(). Ведь не так сложно написать нормальный класс, куда "пихать" нагрузочный код при помощи "блямбы"? А ты юзаешь этот кошмарный макрос! ;))

 

Green
Offline
Зарегистрирован: 01.10.2015

Да. Но не всем ведь даны плюсы. Представь себе что х51 и PIC-и их не имеют. А вот макросы подходят для всех. Да и не настолько это сложно, что бы не просечь один раз и забыть.)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Green пишет:

 Представь себе что х51 и PIC-и их не имеют.

Да я прекрасно понимаю "откуда ноги растут". От старых привычек. Тут мера нужна, а то так и до кода на асме дойти можно и возврата уже не будет! ;)))))))

Green
Offline
Зарегистрирован: 01.10.2015

Тут ведь фишка в самом документированном коде. Когда ты видишь, что открытым текстом написано "каждые 1000 мс", ну о чём ещё можно говорить! Или "один раз в 1000 мс" какие могут быть разговоры! Просто как божий день! И не нужно чесать репу, разгадывая "а что же делает этот код"... Разве нет?

Green
Offline
Зарегистрирован: 01.10.2015

wdrakula пишет:

Да я прекрасно понимаю "откуда ноги растут". От старых привычек. Тут мера нужна, а то так и до кода на асме дойти можно и возврата уже не будет! ;)))))))


Да, на 100%. Везде приходится идти на компромис. И так во всём.)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Мне ж и самому 52 годика 19 ноября стукнет (если доживу) и, как следствие, плюсы даются усилием.

На уровне рефлексов башка выдает процедурный код, который можно в продакшн сразу ;)). А вот под "классы" его приходится перепридумавать.

Green
Offline
Зарегистрирован: 01.10.2015

Я тебя "опередю.") У меня 2 ноября. Токо дожить нужно.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

Я тебя "опередю.") У меня 2 ноября. Токо дожить нужно.

куму 10 ноября было бы 60, если бы не привился (((

lilik
Offline
Зарегистрирован: 19.10.2017

ua6em пишет:

куму 10 ноября было бы 60, если бы не привился (((

Это как ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Green пишет:

Типа, every(1000) 

Не знаю, что за every у Вас, но у Великого была кривая. Он хреновенько

Green пишет:

 один раз подумал

А потому там нельзя было 

Green пишет:

и забыл напрочь!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Green пишет:

Да. Но не всем ведь даны плюсы. 

«Настоящий программист может написать фортрановскую программу на любом языке»
Эд Пост (Ed Post) «Настоящие программисты не используют Паскаль»

Pyotr
Offline
Зарегистрирован: 12.03.2014

ЕвгенийП пишет:

Pyotr пишет:

Всегда ли будет millis() во второй строке равняться millis() в первой строке? (возвращаемые значения)

Ой, не будите спящую собаку старый срач!

Евгений, а срач уже был на эту тему? Или я не видел, или позабыл..

Pyotr
Offline
Зарегистрирован: 12.03.2014

Куда ТС пропал? 
Я вот уже съездил к любимой теще, врезал замок в дверь, заменил обивку на двери, а его и след простыл)))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

lilik пишет:

ua6em пишет:

куму 10 ноября было бы 60, если бы не привился (((

Это как ?

инсульт

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Pyotr пишет:

Куда ТС пропал? 
Я вот уже съездил к любимой теще, врезал замок в дверь, заменил обивку на двери, а его и след простыл)))

вот это у тебя производительность )))

Pyotr
Offline
Зарегистрирован: 12.03.2014

DetSimen пишет:

Pyotr пишет:
Всегда ли будет millis()  во второй строке равняться millis() в первой строке? (возвращаемые значения)

В данном конкретном случае - будет.  Но, если ТС понапишет еще чонить между if-ами, то будет зависеть от "чонить"

Деда, а как тебе такой пример

unsigned long a, prevMillis = 0, interval = 10;
void setup() {
  Serial.begin(115200);
  while(millis() < 41){}//первое "нелюбимое" millis() число 
  while(TCNT0 < 255){}
   
  millis();    //как задержка 2 мкс
  a = millis();
  if(a - prevMillis > interval){
    prevMillis = millis();
   
    Serial.println(a);            //41
    Serial.println(prevMillis);   //43
  } 
}

void loop(){}

Печатает 41 и 43. Хто 2 мс съел?

Про "нелюбимые" миллис числа http://arduino.ru/forum/otvlechennye-temy/bespoleznaya-arifmeticheskaya-krasivost

Pyotr
Offline
Зарегистрирован: 12.03.2014

ua6em пишет:

Pyotr пишет:

Куда ТС пропал? 
Я вот уже съездил к любимой теще, врезал замок в дверь, заменил обивку на двери, а его и след простыл)))

вот это у тебя производительность )))

и скетч про дырявую миллис сочинил)) не с первого раза получилось поймать момент. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

сюда как раз попадает коррекция, бо в секунде не 1024 мс, как таймер 0 щитает, а 1000, как кожаные мешки привыкли. 

Upd.  Тему по ссылке не читал, но осуждаю. :) 

Green
Offline
Зарегистрирован: 01.10.2015

Да, на заре попадал и я в эту ловушку.)

Green
Offline
Зарегистрирован: 01.10.2015

ЕвгенийП пишет:

«Настоящий программист может написать фортрановскую программу на любом языке»
Эд Пост (Ed Post) «Настоящие программисты не используют Паскаль»


Да, и "цвет автомобиля может быть любым, при условии...")

Magomed Gazimag...
Offline
Зарегистрирован: 12.01.2021

получилась. работает.

unsigned long ZADERGKA;
boolean flag=0;


void setup(){
   pinMode(13,OUTPUT);
    pinMode(6,OUTPUT);}
  
void loop(){
  if(flag==0&&millis()-ZADERGKA>10000){
      digitalWrite(13,HIGH);
       }
      

   if(flag==0&&millis()-ZADERGKA>30000){ 
      digitalWrite(6,HIGH);
       flag++;}
      
   if(flag==1&&millis()-ZADERGKA>60000){
     digitalWrite(13,LOW);
      digitalWrite(6,LOW);
       }
    
}
     
 

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Magomed Gazimagomedov пишет:

получилась. работает.

Мазл тов!

v258
Offline
Зарегистрирован: 25.05.2020

Magomed Gazimagomedov пишет:

получилась. работает.

Так нагляднее

unsigned long ZADERGKA = 0;
boolean flag = 0;

void setup()
{
  pinMode(13, OUTPUT);
  pinMode(6, OUTPUT);
}

void loop()
{
  if (!flag)
  {
    if (millis() - ZADERGKA > 10000)
    {
      digitalWrite(13, HIGH);
    }

    if (millis() - ZADERGKA > 30000)
    {
      digitalWrite(6, HIGH);
    }

    if (millis() - ZADERGKA > 60000)
    {
      digitalWrite(13, LOW);
      digitalWrite(6, LOW);
      flag++;
    }
  }
}

 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

А так:

void setup() {
    pinMode(13, OUTPUT);
    pinMode(6, OUTPUT);
}

void loop() {
    if (millis() > 10000) digitalWrite(13, HIGH);
    if (millis() > 30000) digitalWrite(6, HIGH);
    if (millis() > 60000) {
        digitalWrite(13, LOW);
        digitalWrite(6, LOW);
        while (1) {}
    }
}

 

Magomed Gazimag...
Offline
Зарегистрирован: 12.01.2021
  while (1) {}

это зачем?  не понял. условие while(1) и пустые фигурные скопкы. 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Magomed Gazimagomedov пишет:

  while (1) {}

это зачем?  не понял. условие while(1) и пустые фигурные скопкы. 

Зацикливание (бесконечный цикл) до перезагрузки.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Magomed Gazimagomedov пишет:

  while (1) {}

это зачем?  не понял. условие while(1) и пустые фигурные скопкы. 

потому что try Сишники так непишут, правильно так

while(true);  // если аборты в твоей стране запрещены

или

abort();   //  если нет

Pyotr
Offline
Зарегистрирован: 12.03.2014

Magomed Gazimagomedov пишет:

  while (1) {}

это зачем?  не понял. условие while(1) и пустые фигурные скопкы. 

Это означает -дальше кина не будет.

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

DetSimen пишет:

потому что try Сишники так непишут, правильно так

while(true);

false == 0, а true != 0.

void setup() {
    pinMode(13, OUTPUT);
    pinMode(6, OUTPUT);
}

void loop() {
    if (millis() > 10000) digitalWrite(13, HIGH);
    if (millis() > 30000) digitalWrite(6, HIGH);
    if (millis() > 60000) {
        digitalWrite(13, LOW);
        digitalWrite(6, LOW);
        while (-73) {}
    }
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

AndreyD пишет:

false == 0, а true != 0.

приучай себя писать устойчивый код. Если завтра стандарт поменяется так, что true будет равно 1, а false всему остальному, то мой код работать будет так же, а твой нет.  

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

DetSimen пишет:

приучай себя писать устойчивый код. Если завтра стандарт поменяется так, что true будет равно 1, а false всему остальному, то мой код работать будет так же, а твой нет.  

Но даже в этом случае моё

while (1) {}

сработает.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

Upd.  Тему по ссылке не читал, но осуждаю. :) 

:-((( а я старалси :-(

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

ЕвгенийП пишет:

DetSimen пишет:

Upd.  Тему по ссылке не читал, но осуждаю. :) 

:-((( а я старалси :-(

А мне было интересно прочесть. Но на практике же никакого применения нет?

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

Pyotr пишет:

Печатает 41 и 43. Хто 2 мс съел?

AVR, кто ж еще!.

На ARM такая бяка не наблюдается.

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

DetSimen пишет:

AndreyD пишет:

false == 0, а true != 0.

приучай себя писать устойчивый код. Если завтра стандарт поменяется так, что true будет равно 1, а false всему остальному, то мой код работать будет так же, а твой нет.  

Стандарт поменяется не раньше, чем слово "Windows" не будет вызывать иных ассоциаций кроме застекленного проема в стене.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

AndreyD пишет:
Но на практике же никакого применения нет?
Как нет? Вставить в код такую бяку и потроллить кого-нибудь. Чем не применение?

Banzay1983
Offline
Зарегистрирован: 30.08.2021

AndreyD пишет:

А так:

void setup() {
    pinMode(13, OUTPUT);
    pinMode(6, OUTPUT);
}

void loop() {
    if (millis() > 10000) digitalWrite(13, HIGH);
    if (millis() > 30000) digitalWrite(6, HIGH);
    if (millis() > 60000) {
        digitalWrite(13, LOW);
        digitalWrite(6, LOW);
        while (1) {}
    }
}

 

 

по идее функции millis()  можно написать в блоке setup ,  тогда они будут выполняться один раз при запуске программы и дальше начнется бесконечный пустой loop(),  не знаю насколько это грамотно, но у меня подобное работало

b707
Offline
Зарегистрирован: 26.05.2017

Banzay1983 пишет:

по идее функции millis()  можно написать в блоке setup ,  тогда они будут выполняться один раз при запуске программы

интересно интересно, можете попробовать передвинуть этот код в setup ?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

Banzay1983 пишет:

по идее функции millis()  можно написать в блоке setup ,  тогда они будут выполняться один раз при запуске программы

интересно интересно, можете попробовать передвинуть этот код в setup ?

ты жеж и так знаешь что ежели в цикл обернуть пока фалсе то будет

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

ты жеж и так знаешь что ежели в цикл обернуть пока фалсе то будет

я то знаю, а вот Банзай знает ли? судя по его совету - нет