Нужна небольшая(а может и большая) помощь.

S1eep
Offline
Зарегистрирован: 09.01.2017

Добрый день,  у меня возникла проблема.

Есть вот такой код:


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

Задача стоит в том что при нажатии левой кнопки светодиоды горят "гирляндой" влево, а правой - вправо. Если запускать эти кнопки по отдельности то работает, но нужно что бы при нажатии другой кнопки светодиоды начинали светиться в другую строну после окончания преведущего цикла, у меня же циклы начинают чередоваться. Подскажите пожалуйста есть ли команда что бы закончить старый цикл при нажатии другой кнопки? Или может у меня в чем то другом проблема?

Vadim0312
Offline
Зарегистрирован: 27.11.2016

То есть вы хотите прервать цикл в середине и начать новый с другой кнопки ?? Или наоборот дождаться окончания цикла а потом запустить другой. Нужно уточнить.

S1eep
Offline
Зарегистрирован: 09.01.2017

Vadim0312 пишет:

То есть вы хотите прервать цикл в середине и начать новый с другой кнопки ??

Нет, нужно что бы цикл свечения прошел до конца, а потом начался другой, то есть горят они допустим влево, я нажимаю правую кнопку и они должны догореть до конца влево, и начать гореть вправо до постепления новой команды. Я подозреваю что тут есть очень простое решение, но я всем этим начал заниматься только сегодня утром и до этого решения еще не дошел=)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

S1eep пишет:

Нет, нужно что бы цикл свечения прошел до конца, а потом начался другой, то есть горят они допустим влево, я нажимаю правую кнопку и они должны догореть до конца влево, и начать гореть вправо до постепления новой команды. Я подозреваю что тут есть очень простое решение, но я всем этим начал заниматься только сегодня утром и до этого решения еще не дошел=)

А если до завершения самого первого цикла Вы успеете 5 раз кнопки нажать, они все должны стать в очередь на исполнение? Или какие-то (все кроме первой или все, кроме последней) нужно игнорировать?

S1eep
Offline
Зарегистрирован: 09.01.2017

Не нужно никаких очередей, просто при нажатии кнопки должна дойти до конца действующая операция и начаться заданная, условием не предусмотрено что они будут нажиматься сколько угодно раз в любом порядке, просто нажимаеться левая - светодиоды горят влево, правая - горят вправо, но по идее если можно реализовать что бы игнорировались все кроме последней было бы хорошо.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Кнопки у Вас на втором третьем пине. Отлично. Назначьте прерывания по RISING на эти пины и обрабатывайте кнопки в обработчиках прерывания. В обработчике прерывания Вы НЕ запускаете никакие эффекты, а просто приваиваете какой-нибудь переменной true, чтобы запомнить факт нажатия кнопки.

В loop же Вы проверяете была ли нажата кнопка (по переменной) и если была, то 1) присваиваете этой переменной false и 2) запускаете свой эффект.

Вроде, всё.

Кстати, сейчас у Вас ничего не чередуется. Сейчас у Вас написано так, как Вы сказали за исключением того, что если нажать кнопку во время эффекта, она будет проигнорирована.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Пучемуто схема в протеусе у Вас не совпадает с кодом, и если Вы подключили как в протеусе то кнопку желательно подтянуть.

pinMode(2, INPUT_PULLUP)    тогда проверка ведется так

if (digitalRead(2) == LOW)