Добрый вечер. Пытаюсь сделать простейший скетч: 9 светодиодов и по нажатию кнопки идет переключение режима свечения - типа гирлянда. Одна возникла проблема: работает только первый режим. Не получается ни через if, ни через switch..case. Причем пытался описывать функции отдельно, и как в скетче сейчас - ничего не помогает. Однако, если в этом скетче сделать, что по нажатию загорается дополнительный диод, то такой вариант работает. Подскажите, пожалуйста, в чем может быть проблема? Код (C++): int ledPins[] = {2,3,4,5,6,7,8,9,10}; int button = 11; int count; int index = 0; int delayTime = 750; void setup() { int index; pinMode(button, INPUT); for(index = 0; index <= 8; index++) { pinMode(ledPins[index],OUTPUT); } } void loop() { int c = 0; if (digitalRead(button) == HIGH && c == 0) { c = 1; } if (digitalRead(button) == LOW && c == 1) { count = count + 1; if (count == 6) { count = 1; } c = 0; } if (count == 1) { index = 0; for(index = 0; index <= 8; index++) { digitalWrite(ledPins[index], HIGH); delay(delayTime); } for(index = 8; index >= 0; index--) { digitalWrite(ledPins[index], LOW); delay(delayTime); } } if (count == 2) { index = 0; for(index = 0; index <= 8; index++) { digitalWrite(ledPins[index], HIGH); delay(delayTime); digitalWrite(ledPins[index], LOW); } } if (count == 3) { index = 0; for(index = 0; index <= 8; index++) { digitalWrite(ledPins[index], HIGH); delay(delayTime); digitalWrite(ledPins[index], LOW); } for(index = 8; index >= 0; index--) { digitalWrite(ledPins[index], HIGH); delay(delayTime); digitalWrite(ledPins[index], LOW); } } if (count == 4) { index = 0; for(index = 0; index <= 4; index++) { digitalWrite(ledPins[index], HIGH); digitalWrite(ledPins[index+4], HIGH); delay(delayTime); digitalWrite(ledPins[index], LOW); digitalWrite(ledPins[index+4], LOW); } } if (count == 5) { index = random(9); digitalWrite(ledPins[index], HIGH); delay(delayTime); digitalWrite(ledPins[index], LOW); } }
Вынесите int c наружу loop - вам об этом говорят. Она у вас каждый раз при заходе в loop сбрасывается в 0, соответственно, неправильно работает учёт нажатой кнопки.
Или добавить модификатор static Код (C++): static int c = 0; Чтобы не засорять пространство глобальных переменных.
Есть еще загвоздка. Пока гирлянда отрабатывает цикл программы переключений, она не воспринимает состояние кнопки. Кнопку нужно долго держать.
а как она вообще обрабатывается? в режимах есть delayTime, который останавливает программу, счего бы в этот момент кнопки работали?
Вот, кстати, об этом думал, но сколько примеров ни смотрел, нигде про это не говорится, все и так работало. Ну а раз каждая программа выполняется бесконечно, по сути, есть ли какой-то способ следить за нажатием кнопки?
Для этого в программе не должно быть операторов delay() Вам надо прочитать про работу со временем с помощью millis().