помогите разобратся с таймером на millis
- Войдите на сайт для отправки комментариев
Втр, 24/05/2022 - 14:31
Всем привет. Мне не удобно спрашивать такие простые вопросы. И все таки. Я новичок и пробую методом тыка. Вот такой вопрос. Нужно включить реле №1 через 1 секунду. Потом вылючить этот же реле через 5 секунд. А через 10 секунд включить реле №2. Не получается.
#define RELE 1_PIN 5 #define RELE 2_PIN 6 unsigned long tmr; void setup() { pinMode(RELE 1_PIN, OUTPUT); pinMode(RELE 2_PIN, OUTPUT); } void loop() { if(millis()-tmr>1000{ digitalWrite(RELE 1, HIGH); } if(millis()-tmr>5000{ digitalWrite(RELE 1, LOW); } if(millis()-tmr>10000{ digitalWrite(RELE 2, HIGH); } }
А какой результат Вы получаете с этим кодом?
И что по Вашему происходит в строках 14, 18 и 21?
ну как я понимаю если "tmr" больше 1 секунды выполняют команду в фигурных скопках.
и если "tmr" больше 5 секунд то опять выполняют команду в фигурных скопках.
А чему равно tmr и когда оно хотя бы "будет больше 1 секунды"? Т.е. где в коде tmr изменяет своё значение?
Слова "скопки" , "вылючить этотже реле" допустимо писать только определённой группе лиц!!!
Hartakolo, обратите внимание , в строчках
и вот тут
описаны совершенно разные переменные. Поэтому и не работает.
А когда разберетесь с пинами - тогда и о таймере поговорим
Там ещё ошибка в самом именовании переменных и скобок не хватает. Поэтому я и спросил, что сейчас у ТС выходит с этим кодом, он его, похоже, и не пытался скомпилировать.
он его, похоже, и не пытался скомпилировать.
согласен
Hartakolo
зачем вы выложили фейковый код, который не совпадает с тем, что вы пробовали на ардуино?
Извиняюсь. На ардуино другой код. Там будет использоваться не две а несколько пинов. Поэтому этот и был для примера, чтоб понять как работать с таймером. Поэтому было без компиляции. А с таймером кажется разобрался. После 14,18 и 21 строки одновременно поставил tmr=millis(). а потом после каждой по очередно. на последней (21 строка) работает.
и что, этот код правильно работает? спорим, что нет
Возьмем момент, когда миллис равен 6000. Попробуйте вместо ардуины пройти по строчкам и выполнить код процедуры loop() - и напишите, что у вас получилось
Работает не по условиям в первом посте.
Это ссылка на симулятор: https://wokwi.com/projects/332538016808567379
На светодиодах проверил . Один раз после включения работает. в loop() все же повторяется. А тут один раз после включения работает. Хотя мне и нужно чтоб один раз работало. У меня устройство будет работать после включения 50 минут, а потом выключатся.
На светодиодах проверил . Один раз после включения работает
работает, но неверно.
Сделайте, как я сказал - возьмите значение миллис = 6000 и выполните вручную операторы loop() - что получится?
Давайте, не ленитесь. Вы должны найти ошибку сами. Или вы ждете. что вам все разжуют и в рот положат?
Вы же говорите, что "разобрались с таймером"? - а на самом деле вы ничего не поняли
я вон по другому сделал и работает.
милисс=6000 это значить что выполнены команды в строках 15 и 19 и идет дальше. мне проще понимать на примерах чем когда объясняют. да я хочу понять как заставить работать код в 8 посте.
мне проще понимать на примерах чем когда объясняют.
это правильно, только не ждите готовые примеры от доброго дяди на форуме, так вы ничему не научитесь. Пробуйте писать "примеры" сами. Написали пример - не работает, разберитесь почему.
продолжим.
милисс=6000 это значить что выполнены команды в строках 15 и 19 и идет дальше
про миллис=6000 вы верно подметили, что выполняются оба условия. То есть реле сначала включится в строке 15, а потом выключится в строке 19. Но ведь loop(0 это цикл. И он повторяется. При миллис =6001 реле опять включится и выключится... и при миллис=6002...
Так оно у вас будет щелкать, пока миллис не достигнет 10000.
Уверены, что это то, что вы хотели?
добавил допольнительное условие в строку 14 и теперь работает для одного цикла. это то что пришло на ум
или так замена >= на==
В функции millis, сразу обнулять надо счётчик. А потом уже делать другие действия.