бистабильное однократное переключение с помощью кратковременного нажатия, НИКАКОГО непрерывного переключения при удержании - PullRequest
0 голосов
/ 30 декабря 2018

Как остановить непрерывное изменение состояния при удержании кнопки?

    const int btn = 5;
    const int ledPin = 3;
    int ledValue = LOW;

    void setup(){
        Serial.begin(9600);
        pinMode(btn, INPUT_PULLUP);
        pinMode(ledPin, OUTPUT);
    }

    void loop ()
    {
        if (digitalRead(btn) == LOW)
        delay(100);
    {
        ledValue = !ledValue;
        delay(100);
        digitalWrite(ledPin, ledValue);
        delay(100);    
        Serial.println(digitalRead(ledPin));  
      }
     }

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

Больше ищите эффект обнаружения края в результате триггера.

В этом коде необходимо сделать больше разработки, но это первый этап.Со временем я интегрирую оператор FOR в цикл и, возможно, оператор SWITCH (case).

По сути, мне нужно иметь возможность переключать выходные выводы одним мгновенным нажатием, я также хотел бы - в БУДУЩЕМ - чтобы иметь возможность циклически переключаться между возможными состояниями выхода в зависимости от конкретных условий ввода, путемиспользования FOR и SWITCH (case) вместе.Это другой пост.Если вы не можете найти решение и для этой проблемы.

1 Ответ

0 голосов
/ 31 декабря 2018

Самый простой способ - добавить переменную, которая хранит состояние кнопки.

Когда вы нажимаете кнопку, эта переменная устанавливается в значение true и запускается нужный код.Хотя эта переменная имеет значение true, написанный вами код не будет выполнен во второй раз.Когда вы отпустите кнопку, для переменной будет установлено значение false, поэтому при следующем нажатии кнопки ваш код будет выполнен снова.

Код:

bool isPressed = false; // the button is currently not pressed

void loop ()
{
    if (digitalRead(btn) == LOW) //button is pressed
    {
       if (!isPressed) //the button was not pressed on the previous loop (!isPressed means isPressed == FALSE)
       {
         isPressed = true; //set to true, so this code will not run while button remains pressed
         ledValue = !ledValue;
         digitalWrite(ledPin, ledValue); 
         Serial.println(digitalRead(ledPin));  
       }
    }
    else
    {
       isPressed = false; 
       // the button is not pressed right now, 
       // so set isPressed to false, so next button press will be handled correctly
    }
 } 

Редактировать: добавлен второй пример

const int btn = 5;
const int ledPin = 3;
int ledValue = LOW;
boolean isPressed = false; 

void setup(){
    Serial.begin(9600);
    pinMode(btn, INPUT_PULLUP);
    pinMode(ledPin, OUTPUT);
}

void loop ()
{
  if (digitalRead(btn) == LOW && isPressed == false ) //button is pressed AND this is the first digitalRead() that the button is pressed
  {
    isPressed = true;  //set to true, so this code will not run again until button released
    doMyCode(); // a call to a separate function that holds your code
  } else if (digitalRead(btn) == HIGH)
  {
    isPressed = false; //button is released, variable reset
  }
}

void doMyCode() {
  ledValue = !ledValue;
  digitalWrite(ledPin, ledValue); 
  Serial.println(digitalRead(ledPin));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...