Снова millis

Тема в разделе "Arduino & Shields", создана пользователем Mixailovsky, 20 сен 2017.

  1. Mixailovsky

    Mixailovsky Нуб

    Допустим произошло событие.
    Код (C++):
    {
     
      digitalWrite(engine,LOW);             //включаем все что нужно
      delay(2000);
      digitalWrite(starter,LOW);
      delay(2000);
      if(digitalRead(generator)==1)
      {
    digitalWrite(starter,HIGH); // Выполняем какие то действия

    previousMillis = millis();                          // запоминаем текущее время когда произошло событие
    }
    if (millis() - previousMillis > interval) {            //если разница между текущим временем и
                                                                         //временем последнего изменения состояния
                                                                         //больше интервала
    digitalWrite(engine,HIGH);                         //тогда делает определенные действия
    }
    Что делаю не так,получается все включается но не выключается через заданное время
     
  2. ostrov

    ostrov Гуру

    previousMillis обновлять не забываете ли?
     
  3. Airbus

    Airbus Радиохулиган Модератор

    Так а в последней строке разве не LOW должно быть?И зачем одинаковые темы плодить?
     
  4. b707

    b707 Гуру

    И не будет выключаться - у вас опять все перепутано. Почему previousMillis обновляется, только если generator ==1 ? А если мотор не завелся - стартер выключать не будем?

    Михайловский, вы мучаете эти несчатные 5 строк кода уже, наверно, месяц... Неужели так трудно понять, как надо пользоваться миллис? Сядьте хоть раз и разберитесь до конца! "Методом тыка" не программируют, тут мозги нужны.
    Или вы просто настолько тупой?
     
  5. DIYMan

    DIYMan Guest

    Потому что только в этот момент запускается таймер отсчёта, проверка на истечение интервала идёт ниже. Другое дело - нет флага, что мотор в процессе запуска, и можно проверять на интервал.
     
  6. ostrov

    ostrov Гуру

    Не вдумываясь в остальное, вот про это место:
    Код (C++):
    if (millis() - previousMillis > interval) {            //если разница между текущим временем и
                                                                         //временем последнего изменения состояния
                                                                         //больше интервала
    digitalWrite(engine,HIGH);                         //тогда делает определенные действия
    }
    Условие рассчитано на выполнение 1 раз? Если да, то смущает слово interval, если нет, то почему после выполнения действия не обновляется время для следующей итерации?
     
  7. DIYMan

    DIYMan Guest

    Этот код в loop, выполняется каждый проход. interval объявлен как int, имеет значение 10000.
     
  8. ostrov

    ostrov Гуру

    Где видно что в loop? Где видно что 1000? Почему все видят, а я нет? И если даже так, все равно не понимаю почему его не нужно обновлять при каждом выполнении условия.
     
  9. b707

    b707 Гуру

    Тогда повторю свой вопрос так - почему таймер запускается только в этот момент? Насколько я понимаю, условие (generator ==1) становится истинным, когда мотор завелся и с генератора пошел ток. В этот момент уже никакие таймеры не нужны - программа закончилась. Таймер нужно запускать аньше, лучше всего самой первой строчкой этого кода.
    Нет, что ни говорите, а код путанный и в таком виде вряд ли заработает как надо.
     
  10. ostrov

    ostrov Гуру

    Да вообще, соседство millis() с delay() меня несколько дезориентирует.
     
  11. DIYMan

    DIYMan Guest

    По логике - начало отсчёта старта работы генератора наступает, когда нажата кнопка, скажем (т.е. generator==1). В это время запоминается текущее значение millis, затем - сравнивается, и по достижении N секунд - делается другое действие. Псевдокод:
    Код (C++):
    unsigned long lastMillis;
    bool inStartMode;

    void loop()
    {
        if(button.isClicked() && !inStartMode)
        {
            inStartMode = true;
            lastMillis = millis();
            starter.run();
        }
       
        if(inStartMode && (millis() - lastMillis) > 10000)
        {
            inStartMode = false;
            starter.stop();
        }
    }
     
    Что в этом псевдокоде неверно? По-моему, навскидку логика правильная.