Нужна небольшая(а может и большая) помощь.
- Войдите на сайт для отправки комментариев
Втр, 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)