Arduino hosszú-rövid gombnyomás

Az egyik alapvető felhasználói interakció a gombnyomás. Megadhatjuk, hogy hosszú vagy rövid gombnyomáskor hogyan viselkedjen az arduino program. Az alábbi arduino példakódok bemutatnak pár lehetőséget.

A következő arduino példa egy szimpla gombnyomás esetén a soros konzolra írja, hogy megnyomtuk a gombot. Nem tesz különbséget, hogy mennyi ideig nyomtuk a gombot.

/**************************************/
/*      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;
  }
}

Az alábbi példakód már a nyomógomb három különböző állapota szerint fut tovább. Ezek az állapotok a nyomva tartott gomb, a rövid gombnyomás és a hosszú gombnyomás.

/**************************************/
/*      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;
}

A gombnyomást követheti például fény vagy hang visszajelzés is. A következő arduino vázlat szerint a gomb nyomvatartása esetén a fedélzeti led világít. Rövid gombnyomáskor egyszer csipog a csipogó, a hosszú gombnyomás hatására kétszer csipog. Először építsük meg ezt az áramkört.

Arduino Uno - nyomógomb és csipogó
Arduino Uno – nyomógomb és csipogó

Majd töltsük fel az kódot az Arduino Unora.

/**************************************/
/*      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;
}

Még egy lehetőség, megszakíthatjuk az arduino program futását a gomb megnyomásával. Az attachInterrupt() segítségével még a végtelen while ciklusból is kilép. Az Arduino Uno, Nano, táblákon az iterrupt pinek: 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);
  }
}

Nézzd meg a többi példát is . ESP32, ESP8266, Arduino vázlatok, példák

Remélem tetszett ez a cikk.