При нажатой кнопке функция выполняется, а на отжатой.....тоже.Что делать?

smile_zee_kasher
smile_zee_kasher аватар
Offline
Зарегистрирован: 27.02.2018

Всем привет!

Название темы у меня не очень конечно, но она целиком отражает мою проблему.

И так у меня есть собранная схема из урока 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, но все равно лажа. Помогите пожалуйста)

sadman41
Offline
Зарегистрирован: 19.10.2016

Ищите на форуме тему "blink без delay"

bwn
Offline
Зарегистрирован: 25.08.2014

Уху, а еще "Вставка программного кода в тему".

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

smile_zee_kasher пишет:
Помогите пожалуйста)

Сперва определитесь с терминами - то, что Вы называете функциями, на самом деле называются операторы.
while, for - операторы циклов
break - оператор выхода из цикла.
Отдельный (законченный) кусок кода является подпрограммой или функцией.
Со времён Delphi у меня отложилось, что если подпрограмма возвращает какое-либо значение, то она называется функция. Если не возвращает - процедура. Как бы, понятнее звучит. Для меня. ))
В принципе, можете называть и так и этак, как нравится.
 
Цикл for будет крутиться, пока не "накрутит" свой счётчик, поэтому, при отпускании кнопки он и отрабатывает до конца. Вы можете каждый виток цикла проверять, нажата ли кнопка и если нажата, выполнять выход из цикла с пом. оператора break. Или вообще вынести зажигание-погасание в отдельную подпрограмму и выпонять из неё выход, с пом. оператора return.
Примерно так -
 

const int buttonPin = 2;     
const int led9 = 9;

void setup() {
  pinMode(led9, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  if (digitalRead(buttonPin)) {
    controlLed();
  } else {
     digitalWrite(led9, LOW);
  }
} 

void controlLed() {
   for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
       analogWrite(led9, fadeValue);
       if (!digitalRead(buttonPin)) return;
       delay(30);
    }

    for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
       analogWrite(led9, fadeValue);
       if (!digitalRead(buttonPin)) return;
       delay(30);
    }
}

Ну и как советовали выше, лучше избавляться от delay ))