środa, 4 września 2024

#6 Sterowanie diodą LED w Arduino za pomocą przycisku – z debouncingiem i wyświetlanie na Serial Monitorze


W dzisiejszym wpisie pokażę, jak za pomocą przycisku sterować wbudowaną diodą LED na płytce Arduino Uno. Każde wciśnięcie przycisku zmienia stan diody – włącza ją lub wyłącza. Dodatkowo wprowadzimy obsługę eliminacji drgań styków (debouncing) oraz wykorzystamy Serial Monitor do wyświetlania stanu diody tylko wtedy, gdy wciśniemy przycisk.



1. Co będzie potrzebne:

  • Arduino Uno
  • Przycisk (push-button)
  • Przewody połączeniowe

2. Jak to działa?

Po wciśnięciu przycisku, stan diody LED zmienia się – jeśli jest wyłączona, to zostanie włączona, a jeśli jest włączona, to wyłączona. Warto zauważyć, że przycisk nie jest idealny i może generować zakłócenia, tzw. drgania styków, które powodują wielokrotne odczytanie wciśnięcia. Dlatego wprowadzimy debouncing, aby program nie reagował na niechciane sygnały.

Dodatkowo chcemy, aby Serial Monitor wyświetlał informacje o stanie diody LED tylko wtedy, gdy przycisk jest wciśnięty, czyli gdy faktycznie coś się zmienia.

3. Schemat podłączenia:




  • Przycisk: Jeden pin podłączony do pinu 7 Arduino, drugi do GND (masa).
    • Ważne: przycisk z 4 wyprowadzeniami jest wewnętrznie połączony w 2 pary styków. Przycisk typu push-button powinien być normalnie otwarty (NO), co oznacza, że w stanie spoczynku nie będzie zwierał do GND. Jeśli podłączysz przewody do niewłaściwych wyprowadzeń przycisku, Arduino będzie stale widziało stan wciśniętego przycisku, co spowoduje nieprawidłowe działanie programu.
  • Dioda LED: Wbudowana w Arduino, podłączona do pinu 13, więc nie musimy jej dodatkowo podłączać.

4. Kod programu:

Oto kod, który wgrany do Arduino, umożliwi sterowanie diodą LED za pomocą przycisku:




5. Wyjaśnienie kodu:

  • int buttonPin = 7;: Deklaracja zmiennej buttonPin, która przechowuje numer pinu, do którego podłączony jest przycisk. W tym przypadku to pin 7.
  • int ledPin = 13;: Deklaracja zmiennej ledPin, która przechowuje numer pinu, do którego podłączona jest wbudowana dioda LED. Pin 13 to domyślny pin dla diody LED na płytce Arduino Uno.
  • int ledState = LOW;: Zmienna ledState przechowuje aktualny stan diody LED. Początkowo dioda jest wyłączona, dlatego przypisujemy jej wartość LOW.
  • int buttonState;: Zmienna do przechowywania aktualnego stanu przycisku (czy jest wciśnięty, czy nie). Ta zmienna będzie aktualizowana w pętli.
  • int lastButtonState = HIGH;: Zmienna do przechowywania poprzedniego stanu przycisku. Ustawiona na HIGH, ponieważ przycisk używa rezystora pull-up, co oznacza, że w stanie spoczynku (nie wciśnięty) przycisk ma stan wysoki.
  • unsigned long lastDebounceTime = 0;: Zmienna lastDebounceTime przechowuje czas ostatniej zmiany stanu przycisku. Używana jest do eliminacji drgań styków (debouncing).
  • unsigned long debounceDelay = 50;: Zmienna debounceDelay przechowuje wartość opóźnienia (w milisekundach) do eliminacji drgań styków. W tym przypadku opóźnienie wynosi 50 ms.
  • Serial.begin(9600);: Rozpoczyna komunikację szeregową z komputerem z prędkością 9600 baud. Umożliwia wysyłanie danych do Serial Monitora w Arduino IDE.
  • pinMode(buttonPin, INPUT_PULLUP);: Ustawienie pinu przycisku (pin 7) jako wejście z aktywacją wewnętrznego rezystora pull-up. Dzięki temu pin przycisku w stanie spoczynku (nie wciśnięty) ma wartość HIGH, a po wciśnięciu przycisku będzie miał wartość LOW.
  • pinMode(ledPin, OUTPUT);: Ustawienie pinu diody LED (pin 13) jako wyjście, co oznacza, że będzie on sterować stanem diody (włączona/wyłączona).
  • digitalWrite(ledPin, ledState);: Ustawienie początkowego stanu diody LED zgodnie z wartością ledState. Początkowo ledState ma wartość LOW, co oznacza, że dioda jest wyłączona.
  • int reading = digitalRead(buttonPin);: Odczytuje aktualny stan przycisku (pin 7). Jeśli przycisk jest wciśnięty, odczytany stan będzie LOW (ponieważ używamy rezystora pull-up), a jeśli przycisk nie jest wciśnięty, odczytany stan będzie HIGH.
  • if (reading != lastButtonState): Sprawdza, czy stan przycisku się zmienił w stosunku do poprzedniego stanu. Jeśli tak, aktualizuje zmienną lastDebounceTime na aktualny czas w milisekundach (z funkcji millis()), aby odliczać czas potrzebny do eliminacji drgań styków.
  • if ((millis() - lastDebounceTime) > debounceDelay): Sprawdza, czy od momentu ostatniej zmiany stanu przycisku minęło więcej niż 50 ms (wartość debounceDelay). Jeśli tak, oznacza to, że drgania styków zostały wyeliminowane i można bezpiecznie odczytać stan przycisku.
  • if (reading != buttonState): Sprawdza, czy stan przycisku rzeczywiście się zmienił od poprzedniego odczytu. Jeśli tak, aktualizuje zmienną buttonState na nowy odczytany stan.
  • if (buttonState == LOW): Sprawdza, czy przycisk został wciśnięty (czyli stan jest LOW). Jeśli tak, zmienia stan diody LED na przeciwny (z HIGH na LOW lub odwrotnie). Stan diody LED jest ustawiany za pomocą digitalWrite(ledPin, ledState);.
  • if (ledState == HIGH): Jeśli dioda LED jest włączona, wyświetla komunikat "Dioda LED włączona" w Serial Monitorze. Jeśli dioda LED jest wyłączona, wyświetla komunikat "Dioda LED wyłączona".
  • lastButtonState = reading;: Na końcu pętli zapisuje aktualny stan przycisku jako lastButtonState, aby w następnym cyklu porównać go z nowym odczytem.

6. Testowanie:

  1. Wgraj kod na Arduino.
  2. Otwórz Serial Monitor i upewnij się, że prędkość komunikacji ustawiona jest na 9600 baud.
  3. Naciśnij przycisk – dioda LED powinna włączyć się, a w Serial Monitorze pojawi się komunikat „Dioda LED włączona”.
  4. Ponowne wciśnięcie przycisku spowoduje wyłączenie diody, a w monitorze pojawi się informacja „Dioda LED wyłączona”.
Miłego kodowania 😉

Brak komentarzy:

Prześlij komentarz