Допустим произошло событие. Код (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); //тогда делает определенные действия } Что делаю не так,получается все включается но не выключается через заданное время
И не будет выключаться - у вас опять все перепутано. Почему previousMillis обновляется, только если generator ==1 ? А если мотор не завелся - стартер выключать не будем? Михайловский, вы мучаете эти несчатные 5 строк кода уже, наверно, месяц... Неужели так трудно понять, как надо пользоваться миллис? Сядьте хоть раз и разберитесь до конца! "Методом тыка" не программируют, тут мозги нужны. Или вы просто настолько тупой?
Потому что только в этот момент запускается таймер отсчёта, проверка на истечение интервала идёт ниже. Другое дело - нет флага, что мотор в процессе запуска, и можно проверять на интервал.
Не вдумываясь в остальное, вот про это место: Код (C++): if (millis() - previousMillis > interval) { //если разница между текущим временем и //временем последнего изменения состояния //больше интервала digitalWrite(engine,HIGH); //тогда делает определенные действия } Условие рассчитано на выполнение 1 раз? Если да, то смущает слово interval, если нет, то почему после выполнения действия не обновляется время для следующей итерации?
Где видно что в loop? Где видно что 1000? Почему все видят, а я нет? И если даже так, все равно не понимаю почему его не нужно обновлять при каждом выполнении условия.
Тогда повторю свой вопрос так - почему таймер запускается только в этот момент? Насколько я понимаю, условие (generator ==1) становится истинным, когда мотор завелся и с генератора пошел ток. В этот момент уже никакие таймеры не нужны - программа закончилась. Таймер нужно запускать аньше, лучше всего самой первой строчкой этого кода. Нет, что ни говорите, а код путанный и в таком виде вряд ли заработает как надо.
По логике - начало отсчёта старта работы генератора наступает, когда нажата кнопка, скажем (т.е. 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(); } } Что в этом псевдокоде неверно? По-моему, навскидку логика правильная.