Arduino Long-Short-Knopfdruck

Eine der grundlegenden Benutzerinteraktionen ist das Drücken von Tasten. Wir können festlegen, wie sich das Arduino-Programm verhält, wenn wir eine lange oder kurze Taste drücken. Die folgenden Arduino-Beispielcodes zeigen einige Optionen.

Das folgende Arduino-Beispiel schreibt an die serielle Konsole, dass eine Taste gedrückt wurde. Macht keinen Unterschied, wie lange wir den Knopf gedrückt halten.

/**************************************/
/*      https://myhomethings.eu       */
/**************************************/

const byte buttonPin = 8;
bool printFlag = false;

void setup() 
{
  Serial.begin(9600);
  pinMode(buttonPin, INPUT_PULLUP);
}
void loop() 
{
  buttonState = digitalRead(buttonPin);
  if(buttonState == LOW && printFlag == false) 
  {
    Serial.println("button is pressed");
    printFlag = true;
    delay(200);
  }
  else
  {
    printFlag = false;
  }
}

Der folgende Beispielcode wird bereits gemäß den drei verschiedenen Zuständen der Schaltfläche ausgeführt. Diese Zustände sind die gedrückte Halte taste, der kurze Tastendruck und der lange Tastendruck.

/**************************************/
/*      https://myhomethings.eu       */
/**************************************/

const byte buttonPin = 8;

long holdingTime;
long previousHoldingTime;
unsigned long firstButtonPressTime;
byte buttonState;
byte previousButtonState = HIGH;

void setup() 
{
  Serial.begin(9600);
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop() 
{
  buttonState = digitalRead(buttonPin);

  if (buttonState == LOW && previousButtonState == HIGH && (millis() - firstButtonPressTime) > 200) 
  {
    firstButtonPressTime = millis();
  }
  holdingTime = (millis() - firstButtonPressTime);

  if (holdingTime > 50) 
  {
    if (buttonState == LOW && holdingTime > previousHoldingTime) 
    {
      Serial.println("button is pressed");
    }
    if (buttonState == HIGH && previousButtonState == LOW) 
    {
      if (holdingTime <= 400)
      {
        Serial.println("short button press");       
      }
      if (holdingTime > 400) 
      {
        Serial.println("long button press");
      }
    }
  }
   previousButtonState = buttonState;
   previousHoldingTime = holdingTime;
}

Zum Drücken einer Taste kann beispielsweise eine Licht- oder Tonrückmeldung folgen. Gemäß dem folgenden Arduino Sketch leuchtet die integrierte LED auf, wenn die Taste gedrückt haltet wird. Wenn die Taste kurz gedrückt wird, piept der Piepser einmal und wenn die Taste längere Zeit gedrückt wird, piept er zweimal. Lassen wir uns zuerst diese Schaltung bauen.

Arduino Uno - Druckknopf und Piepser
Arduino Uno – Druckknopf und Piepser

Dann laden wir den Code auf Arduino Uno hoch.

/**************************************/
/*      https://myhomethings.eu       */
/**************************************/

const byte buttonPin = 8;
const byte tweeter = 9;
const byte ledPin = 13;

long holdingTime;
long previousHoldingTime;
unsigned long firstButtonPressTime;
byte buttonState;
byte previousButtonState = HIGH;

const int note = 4699;

void beepsOnce()
{
  tone(tweeter, note, 125);
  delay(180);
  noTone(tweeter);
}
void beepsTwice()
{
  for (int i = 0; i < 2; i++) 
  {
    tone(tweeter, note, 125);
    delay(60);
    noTone(tweeter);
    delay(60);
  }
}
void setup() 
{
  Serial.begin(9600); 
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
}
void loop() 
{
  buttonState = digitalRead(buttonPin);

  if (buttonState == LOW && previousButtonState == HIGH && (millis() - firstButtonPressTime) > 100) 
  {
    firstButtonPressTime = millis();
  }
  holdingTime = (millis() - firstButtonPressTime);

  if (holdingTime > 50) 
  {
    if (buttonState == LOW && holdingTime > previousHoldingTime) 
    {
      Serial.println("button is pressed");
      digitalWrite(ledPin, HIGH);
    }
    if (buttonState == HIGH && previousButtonState == LOW) 
    {
      if (holdingTime <= 400)
      {         
        Serial.println("short button press");
        beepsOnce();
        digitalWrite(ledPin, LOW);
      }
      if (holdingTime > 400) 
      {
        Serial.println("long button press");
        beepsTwice();
        digitalWrite(ledPin, LOW);
      }
    }
  }
  previousButtonState = buttonState;
  previousHoldingTime = holdingTime;
}

Eine andere Möglichkeit besteht darin, das Arduino-Programm durch Drücken der Taste abzubrechen. Verwenden wir attachInterrupt(), um die Endlosschleife zu verlassen. Die iterrupt Pins auf den Arduino Uno, Nano Boards: 2, 3.

const byte interruptPin = 3;

void buttonInterrupt() 
{
  Serial.println("Button is pressed!");
}
void setup() 
{
  Serial.begin(9600);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), buttonInterrupt, CHANGE);
}
void loop() 
{
  while(true)
  {
    delay(100);
  }
}

Siehe auch andere Beispiele. ESP32, ESP8266, Arduino-Skizzen, Beispiele