Stan przycisku zmienia się losowo

14

Mam przycisk podłączony do mojego Arduino, ale wydaje się, że uruchamia się losowo.

Mam jeden pin przycisku podłączony do pinu 2 na arduino, a drugi do ziemi.

void setup() {
    Serial.begin(9600);

    pinMode(2, INPUT);
}

void loop() {
    Serial.println(digitalRead(2));
}

Oczekuję, że wydrukuje 1 w sposób ciągły i przejdę do 0 po naciśnięciu przycisku, ale czasami pokazuje 0, nawet jeśli go nie dotykam.

sachleen
źródło

Odpowiedzi:

17

Kiedy przycisk jest podłączony w tej konfiguracji, wejście jest tak zwane pływające , co oznacza, że ​​nie jest to 0 ani 1. Po naciśnięciu przycisku jest on podłączony do uziemienia, więc jest to z pewnością 0, ale kiedy nie jest wciśnięty, nie znamy wartości szpilki.

Pull Up Resistor

Musimy uwzględnić tak zwany rezystor „pull-up”, aby podciągnąć sygnał do logiki 1, gdy przycisk nie jest wciśnięty.

rezystor podciągający

Zdjęcie z Sparkfun

Oznacza to, że gdy przycisk nie jest wciśnięty, Arduino odczytuje logikę 1. Po naciśnięciu przycisku prąd przepływa przez rezystor do masy, a Arduino odczytuje logikę 0.

Wewnętrzny rezystor podciągający

Arduino ma również wewnętrzne rezystory podciągające, więc niekoniecznie musisz dodawać dodatkowy komponent do swojego obwodu. Istnieje kilka sposobów korzystania z tego.

Kiedyś musiałeś to robić w ten sposób:

pinMode(pin, INPUT);           // set pin to input
digitalWrite(pin, HIGH);       // turn on pullup resistors

Teraz możemy to zrobić po prostu w jednym wierszu:

pinMode(pin, INPUT_PULLUP);

Umożliwia to rezystor podciągający 20k na tym pinie. Sygnał wejściowy przestanie być pływający, gdy przycisk nie zostanie naciśnięty.

Uwaga: Działa to tylko wtedy, gdy drugi koniec jest podłączony do uziemienia.

sachleen
źródło
1
Warto zauważyć, że ten sam pomysł działa również w przypadku oporników rozkładanych; tzn. rezystor zwykle pociąga bolec w dół, ale naciśnięcie przycisku podnosi go. Oczywiście musi to być zewnętrzne, ponieważ nie ma wewnętrznego rozwijania standardowych Arduinos.
Peter Bloomfield