Przycisk – wejście cyfrowe Arduino

Przycisk to element, który po naciśnięciu robi chwilowe zwarcie w obwodzie. To najprostszy element sterujący wejściem cyfrowym Arduino. Daje możliwość sterowania programem, np. zapalania diody.

Zróbmy taki oto obwód:

Rezystor zastosowano tu po to, aby do Arduino nie poszedł zbyt wysoki prąd przy dłuższym zwarciu, bo może to uszkodzić płytkę Arduino. Taki rezystor nazywamy podciągającym do masy. Dioda LED będzie sygnalizować naciśnięcie przycisku.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const int przycisk = 2;     // pin do ktorego podlaczono przycisk
const int dioda =  13;      // pin do ktorego podlaczono diode led
 
// zmienna przchowujaca stan przycisku odczytany
 
int stan_przycisku = 0;
 
void setup() {
  // uruchom pin dioda jako wyjscie:
  pinMode(dioda, OUTPUT);
  // uruchom pin przycisk jako wejscie
  pinMode(przycisk, INPUT);
 
}
 
void loop() {
  // odczytaj stan przycisku:
  stan_przycisku = digitalRead(przycisk);
  // sprawdz czy przycisk jest wcisniety, jesli tak zapal diode(podaj stan wysoki):
  if (stan_przycisku == HIGH) {
    // zapal diode:
    digitalWrite(dioda, HIGH);
  } else {
    // zgas diode:
    digitalWrite(dioda, LOW);
  }
}

Przyciski często generują niepożądane przejścia otwarte / zamknięte po naciśnięciu, z powodu problemów mechanicznych i fizycznych: przejścia te mogą być odczytywane jako wielokrotne naciśnięcia w bardzo krótkim czasie. Do eliminacji tego zjawiska możemy użyć kondensatora elektrolitycznego (+ przy zasilaniu), albo zmienić trochę program.

Dodanie kondensatora:

Zmiana w programie:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
const int przycisk = 2 ;    // pin do ktorego podlaczono przycisk
const int dioda = 13 ;      // // pin do ktorego podlaczono diode
 
// Zmienne ulegną zmianie:
int stan_diody = HIGH ;         // aktualny stan wyjściowego pinu
int stan_przycisku;             // bieżący odczyt z wejścia pinu
int ostatni_stan_przycisku = LOW ;   // poprzedni odczyt z pinów wejściowych
unsigned long ostatni_czas_drgan = 0;  // ostatni raz, gdy pin wyjsciowy byl przelaczany
unsigned long opoznienie_drgan = 50;    // czas drgan, zwieksz jeśli nadal drzy
 
void setup() {
  pinMode(przycisk, INPUT);
  pinMode(dioda, OUTPUT);
 
  // ustaw stan diody
  digitalWrite(dioda, stan_diody);
}
 
void loop() {
  // odczytuje stan przycisku na zmienna lokalna
  int odczyt = digitalRead(przycisk);
 
  // sprawdz, czy wlasie nacisnieto przycisk
  // (tzn. dane wejsciowe przeszly od LOW do HIGH), a ty odczekales wystarczajaco dlugo
  // od ostatniego nacisniecia, aby zignorować kazdy szum:
 
  // jesli przycisk zmienil stan z powodu szumu lub naciskania
  if (odczyt!= ostatni_stan_przycisku) {
    // resetuj czas drgan
    ostatni_czas_drgan = millis();
  }
 
  if ((millis() - ostatni_czas_drgan) > opoznienie_drgan) {
    // cokolwiek jest odczytane, pozostanie dluzej niz drgania
    // odczekaj, to zabierze aktualny stan:
 
    // jesli stan przycisku zmienil sie:
    if (odczyt != stan_przycisku) {
      stan_przycisku = odczyt;
      // tylko przelacz diode jesli nowy stan przycisku na wysok
      if (stan_przycisku == HIGH) {
        stan_diody = !stan_diody;
      }
    }
  }
 
  // ustaw diode:
  digitalWrite(dioda, stan_diody);
  // zapisz odczyt.przy nastepnym przejsciu petli, to bedzie ostatni_stan_przycisku
  ostatni_stan_przycisku = odczyt;
}

Źródło : http://blog.mageek.com.pl/kurs-arduino/przycisk-wejscie-cyfrowe-arduino/