Нужна небольшая(а может и большая) помощь.
- Войдите на сайт для отправки комментариев
Втр, 10/01/2017 - 13:41
Добрый день, у меня возникла проблема.
Есть вот такой код:
void setup() { pinMode(2, INPUT); pinMode(3, INPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); } void loop() { if(digitalRead(3) == HIGH) { digitalWrite(4, HIGH); delay(500); digitalWrite(4, LOW); digitalWrite(5, HIGH); delay(500); digitalWrite(5, LOW); digitalWrite(6, HIGH); delay(500); digitalWrite(6, LOW); digitalWrite(7, HIGH); delay(500); digitalWrite(7, LOW); digitalWrite(8, HIGH); delay(500); digitalWrite(8, LOW); } if (digitalRead(2) == HIGH) { digitalWrite(8, HIGH); delay(500); digitalWrite(8, LOW); digitalWrite(7, HIGH); delay(500); digitalWrite(7, LOW); digitalWrite(6, HIGH); delay(500); digitalWrite(6, LOW); digitalWrite(5, HIGH); delay(500); digitalWrite(5, LOW); digitalWrite(4, HIGH); delay(500); digitalWrite(4, LOW); } }
Вот схема в Протеусе: http://prntscr.com/dtqegc
Задача стоит в том что при нажатии левой кнопки светодиоды горят "гирляндой" влево, а правой - вправо. Если запускать эти кнопки по отдельности то работает, но нужно что бы при нажатии другой кнопки светодиоды начинали светиться в другую строну после окончания преведущего цикла, у меня же циклы начинают чередоваться. Подскажите пожалуйста есть ли команда что бы закончить старый цикл при нажатии другой кнопки? Или может у меня в чем то другом проблема?
То есть вы хотите прервать цикл в середине и начать новый с другой кнопки ?? Или наоборот дождаться окончания цикла а потом запустить другой. Нужно уточнить.
То есть вы хотите прервать цикл в середине и начать новый с другой кнопки ??
Нет, нужно что бы цикл свечения прошел до конца, а потом начался другой, то есть горят они допустим влево, я нажимаю правую кнопку и они должны догореть до конца влево, и начать гореть вправо до постепления новой команды. Я подозреваю что тут есть очень простое решение, но я всем этим начал заниматься только сегодня утром и до этого решения еще не дошел=)
Нет, нужно что бы цикл свечения прошел до конца, а потом начался другой, то есть горят они допустим влево, я нажимаю правую кнопку и они должны догореть до конца влево, и начать гореть вправо до постепления новой команды. Я подозреваю что тут есть очень простое решение, но я всем этим начал заниматься только сегодня утром и до этого решения еще не дошел=)
А если до завершения самого первого цикла Вы успеете 5 раз кнопки нажать, они все должны стать в очередь на исполнение? Или какие-то (все кроме первой или все, кроме последней) нужно игнорировать?
Не нужно никаких очередей, просто при нажатии кнопки должна дойти до конца действующая операция и начаться заданная, условием не предусмотрено что они будут нажиматься сколько угодно раз в любом порядке, просто нажимаеться левая - светодиоды горят влево, правая - горят вправо, но по идее если можно реализовать что бы игнорировались все кроме последней было бы хорошо.
Кнопки у Вас на втором третьем пине. Отлично. Назначьте прерывания по RISING на эти пины и обрабатывайте кнопки в обработчиках прерывания. В обработчике прерывания Вы НЕ запускаете никакие эффекты, а просто приваиваете какой-нибудь переменной true, чтобы запомнить факт нажатия кнопки.
В loop же Вы проверяете была ли нажата кнопка (по переменной) и если была, то 1) присваиваете этой переменной false и 2) запускаете свой эффект.
Вроде, всё.
Кстати, сейчас у Вас ничего не чередуется. Сейчас у Вас написано так, как Вы сказали за исключением того, что если нажать кнопку во время эффекта, она будет проигнорирована.
Пучемуто схема в протеусе у Вас не совпадает с кодом, и если Вы подключили как в протеусе то кнопку желательно подтянуть.
pinMode(2, INPUT_PULLUP) тогда проверка ведется так
if
(digitalRead(2) == LOW)