millis() с паузой
- Войдите на сайт для отправки комментариев
Вс, 22/05/2022 - 18:15
Коллеги, подскажите, не могу понять почему не работает. Нужно, чтобы светодиод поморгал 10 раз с частотой 100 мс, потом пауза 1 секунда и опять моргушки и так далее до бесконечности. Сейчас моргает 10 раз, а потом раз в секунду. Не могу понять почему он переходит на это режим. С Delay все просто, а вот с millis() разобраться не могу.
int ledPin = 13; // номер пина со светодиодом int ledState = LOW; // состояние светодиода int k = 0; // для счетчика // последний момент времени, когда состояние светодиода изменялось unsigned long previousMillis = 0; long Time = 100; // длительность свечения светодиода (в миллисекундах) long pause = 1000; bool state = 0; // void setup() { pinMode(ledPin, OUTPUT); // устанавливаем цифровой пин со светодиодом как ВЫХОД } void loop() { // выясняем не настал ли момент сменить состояние светодиода unsigned long currentMillis = millis(); // текущее время в миллисекундах // если светодиод включен и светится больше чем надо if ((ledState == HIGH) && (currentMillis - previousMillis >= Time)) { ledState = LOW; // выключаем previousMillis = currentMillis; // запоминаем момент времени digitalWrite(ledPin, ledState); // реализуем новое состояние k++; if (k > 9 ) state = 1; // если больше переводим в другое состояние } else if ((ledState == LOW) && (currentMillis - previousMillis >= Time) && !state) //здесь проверяем 3 пунктом это состояние { ledState = HIGH; // включаем previousMillis = currentMillis ; // запоминаем момент времени digitalWrite(ledPin, ledState); // реализуем новое состояние } else if ((ledState == LOW) && (currentMillis - previousMillis >= pause) && state == 1) { state = 0; } }
Даже нет желания разбирать эти невнятные условия.
Кто вас учит так писать ?
Сделай через switch, сразу понятно станет , где косяк.
Спасибо конечно за совет, но использование switch case или if это скорее религиозный вопрос. Люди по разному воспринимают. Лично мне switch не нравится, как и многим. Но я попробую воспользоваться вашим советом.
Заводите статическую переменную-счетчик
Через каждые 100 мс проверяете значение n - если оно меньше или равно 19, включаете/выключаете светодиод, если больше 19 - выключаете светодиод. Потом увеличиваете n на единицу. Если n >= 30 обнуляете его.
Таким образом первые 20 циклов светодиод будет включаться и выключаться (включится 10 раз и выключится 10 раз), следующие 10 циклов светодиод светиться не будет. Потом все повторяется и так до бесконечности.
использование switch case или if это скорее религиозный вопрос. Люди по разному воспринимают. Лично мне switch не нравится, как и многим.
Это глупость. Тут вопрос не личных предпочтений, а целесообразности.
Спасибо конечно за совет, но использование switch case или if это скорее религиозный вопрос. Люди по разному воспринимают. Лично мне switch не нравится, как и многим. Но я попробую воспользоваться вашим советом.
Это ни разу не религиозный вопрос.
Это вопрос читаемости кода.
Если будет написано примерно так:
int mode=0;
switch (mode){
case 0:
if(проверка времени){
что то делаем;
инкрементируем переменную;
}
if(переменная >нужного)mode=1;
break;
case 1:
Делаем что то другое;
Если все сделали mode=2;
break;
case 2:
Делаем что то третье;
если надо mode=0;
break;
}
Согласись, это для понимания намного нагляднее.
Коллеги, спасибо большое за советы, но хочется понять, что именно с кодом не так. Он же очень простой и короткий, если не хочется разбираться, то я вас понимаю. Может кто найдется, кто поможет. Есть подозрение, что проблема именно в millis(), а не в условиях.
Коллеги, спасибо большое за советы, но хочется понять, что именно с кодом не так. Он же очень простой и короткий, если не хочется разбираться, то я вас понимаю. Может кто найдется, кто поможет. Есть подозрение, что проблема именно в millis(), а не в условиях.
Проблема именно в условиях.
Конкрентее- некорректный переход от одного условия к другому.
Напиши то же самое через switch и ты ее увидишь
Коллеги, спасибо большое за советы, но хочется понять, что именно с кодом не так. Он же очень простой и короткий, если не хочется разбираться, то я вас понимаю. Может кто найдется, кто поможет. Есть подозрение, что проблема именно в millis(), а не в условиях.
Проблема в коде, точнее - в подходе. Не нужно усложнять. Там простейший алгоритм.
А millis() проблем никогда и никому не доставляет, по сути это просто счетчик милисекунд с момента старта МК
Сравни для примера написаны тобой код и код в котором сложно заблудится, даже без комментариев.
Коллеги, подскажите, не могу понять почему не работает.
лови, мы люди не гордые )))
А можно и чуть короче
А можно и чуть короче
Это для того что бы он ещё больше запутался ?
Такое пишут только в тех случаях, когда кроме автора никто кодом заниматься не будет.
И то каждый раз придётся вникать в то, что же делает данный кусок кода.
Зачем ?
ТС просил подсказать, что переменная счетчика вспышек - глобальная, забыл по достижении условий её обнулить, только )
Такое пишут только в тех случаях, когда кроме автора никто кодом заниматься не будет.
И то каждый раз придётся вникать в то, что же делает данный кусок кода.
Глупости. Простейший вариант. А чтобы не разбираться каждый раз, достаточно пару строк комментариев записать
Да это все millis() !!! Я бы даже сказал - заговор от millis() !!! )
ТС просил подсказать, что переменная счетчика вспышек - глобальная, забыл по достижении условий её обнулить, только )
да он давно на вас забил, обиделся, наверно. что не поддержали его обвинения против коварной миллис()
Мне некогда обижаться, просто был занят.
ТС просил подсказать, что переменная счетчика вспышек - глобальная, забыл по достижении условий её обнулить, только )
Да именно это я и просил. Спасибо.
Коллеги, подскажите, не могу понять почему не работает.
лови, мы люди не гордые )))
Спасибо большое.
Сравни для примера написаны тобой код и код в котором сложно заблудится, даже без комментариев.
Возможно Вам так проще, но к сожалению этот код не работает.
Сравни для примера написаны тобой код и код в котором сложно заблудится, даже без комментариев.
Возможно Вам так проще, но к сожалению этот код не работает.
Так он и не работает точно из за того же, почему не работает ваш код.
Но тут это очевидно, а у вас нет.
Так он и не работает точно из за того же, почему не работает ваш код. Но тут это очевидно, а у вас нет.
Спасибо всем за указание ошибки. Думаю тему можно закрыть.