При нажатой кнопке функция выполняется, а на отжатой.....тоже.Что делать?
- Войдите на сайт для отправки комментариев
Всем привет!
Название темы у меня не очень конечно, но она целиком отражает мою проблему.
И так у меня есть собранная схема из урока Button.
Я ее немного изменил, добавив диод внешний.
В итоге, загрузив на ардуинку код, при нажатой кнопке диод горит, а когда отпускаю - нет. Все нормально, как и должно быть.
Но я решил пойти дальше и сделать так, чтобы диод при нажатой кнопке загорался плавно и затухал (ШИМ). Вот данный код:
const int buttonPin = 2;
const int led9 = 9;
int buttonState = 0;
void setup() {
pinMode(led9, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
analogWrite(led9, fadeValue);
delay(30);
}
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
analogWrite(led9, fadeValue);
delay(30);
}
} else {
digitalWrite(led9, LOW);
}
}
В результате компиляции, когда кнопка нажата диод начинает загораться плавно, то есть функция работает. Но когда отпускаю, диод НЕ выключается, а продолжает работать пока цикл не закончится.
Отсюда и вопрос: как сделать так, чтобы диод гас без завершения функции? Я уже пробывал и функцию while и break, но все равно лажа. Помогите пожалуйста)
Ищите на форуме тему "blink без delay"
Уху, а еще "Вставка программного кода в тему".
Сперва определитесь с терминами - то, что Вы называете функциями, на самом деле называются операторы.
while, for - операторы циклов
break - оператор выхода из цикла.
Отдельный (законченный) кусок кода является подпрограммой или функцией.
Со времён Delphi у меня отложилось, что если подпрограмма возвращает какое-либо значение, то она называется функция. Если не возвращает - процедура. Как бы, понятнее звучит. Для меня. ))
В принципе, можете называть и так и этак, как нравится.
Цикл for будет крутиться, пока не "накрутит" свой счётчик, поэтому, при отпускании кнопки он и отрабатывает до конца. Вы можете каждый виток цикла проверять, нажата ли кнопка и если нажата, выполнять выход из цикла с пом. оператора break. Или вообще вынести зажигание-погасание в отдельную подпрограмму и выпонять из неё выход, с пом. оператора return.
Примерно так -
Ну и как советовали выше, лучше избавляться от delay ))