Různé funkcionality tlačítka v Arduino

25.09.2021 Arduino #arduino #tlačítko

Ukázky kódu Arduina pro využití tlačítka jako spínače v různých režimech.


Obvod Arduino s LED a tlačítkem

Odpor připojený k tlačítku má hodnotu 10kΩ a odpor připojený k diodě má hodnotu 220Ω.

Obvod Arduino - LED a tlačítko

Při stisknutí tlačítka bude svítit LED

LED bude svítit pouze při stisknutí tlačítka. Pokud tlačítko pustíme, LED zhasne.

#define LED_PIN 8
#define BUTTON_PIN 5
void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT);
}
void loop() {
  if (digitalRead(BUTTON_PIN) == HIGH) {
    digitalWrite(LED_PIN, HIGH);
  }
  else {
    digitalWrite(LED_PIN, LOW);
  }
}

Přepínání LED stisknutím tlačítka

Při jednom stisknutí tlačítka se LED rozsvítí, při druhém stisknutí tlačítka LED zhasne.

#define LED_PIN 8
#define BUTTON_PIN 5
byte lastButtonState = LOW;
byte ledState = LOW;
void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT);
}
void loop() {
  byte buttonState = digitalRead(BUTTON_PIN);
  if (buttonState != lastButtonState) {
    lastButtonState = buttonState;
    if (buttonState == LOW) {
      ledState = (ledState == HIGH) ? LOW: HIGH;
      digitalWrite(LED_PIN, ledState);
    }
  }
}

Přepínání LED stisknutím tlačítka - odstranění falešných stisknutí

U předchozího příkladu si lze všimnout jedné věci: někdy, když stisknete a uvolníte tlačítko, stav LED se nezmění nebo několikrát rychle bliká.

Důvodem je to, že tlačítko při stisknutí fyzicky přeskočí. Arduino tak bude interpretovat mnoho falešných stisků. Co lze udělat, abychom tomu zabránili, je přidat do kódu zpoždění přepnutí. Můžeme se například rozhodnout, že když program detekuje změnu stavu tlačítka, počká 50 milisekund, než bude reflektovat další změnu.

#define LED_PIN 8
#define BUTTON_PIN 5
byte lastButtonState = LOW;
byte ledState = LOW;
unsigned long debounceDuration = 50; // millis
unsigned long lastTimeButtonStateChanged = 0;
void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT);
}
void loop() {
  if (millis() - lastTimeButtonStateChanged > debounceDuration) {
    byte buttonState = digitalRead(BUTTON_PIN);
    if (buttonState != lastButtonState) {
      lastTimeButtonStateChanged = millis();
      lastButtonState = buttonState;
      if (buttonState == LOW) {
        ledState = (ledState == HIGH) ? LOW: HIGH;
        digitalWrite(LED_PIN, ledState);
      }
    }
  }
}