ESP8266 – podłączenie przycisku

Wykrycie wciśnięcia przycisku

Aby ESP traktował nóżkę jako wejście należy wywołać metodę pinMode z parametrem INPUT.

Do odczytania stanu wejścia służy metoda digitalRead, która zwraca wartość HIGH gdy na pin jest podane napięcie zasilania.

Wydawałoby się, że należy napisać i wgrać na płytkę kod, który zapamiętuje w zmiennej czy lampka jest zapalona czy nie a gdy na wejściu jest stan wysoki odwraca wartość tej zmiennej i ustawia stan na wyjściu buildin_led:

<code>int ledState = LOW;
void setup() {
   pinMode(0, INPUT);
   pinMode(LED_BUILTIN, OUTPUT);
   digitalWrite(LED_BUILTIN, ledState);
}

void loop() {
    int readValue = digitalRead(0);
    if (readValue == HIGH) {
        ledState = ledState == HIGH ? LOW : HIGH;
        digitalWrite(LED_BUILTIN, ledState);
    }
}</code>

Następnie podłączyć masę (nóżkę GND) płytki do minusa baterii, jedną końcówkę przycisku do nóżki IO0, a zasilanie (nóżkę 3V3) i drugą końcówkę przycisku do plusa baterii.

Taki układ jednak po prostu nie działa. Wbudowana dioda LED zapala się wraz z podłączeniem zasilania i nie reaguje na wciśnięcie przycisku.

Dzieje się tak ponieważ układ wykrywa napięcie na nóżce, jednak nie pozwala mu ujść do uziemienia. Sytuację komplikuje dodatkowo fakt iż podczas startu, przed wywołaniem metody setup, układ dostarcza na nóżki GPIO0 i GPIO2 napięcie. Wybór innej nóżki niewiele poprawia sytuację, co prawda początkowo na nóżce nie ma napięcia, jednak gdy się już pojawi pozostaje tam na stałe.

Ładunek powinien mieć możliwość ujścia do masy (minusa baterii). Nie można go jednak tak po prostu zewrzeć go z masą, ponieważ po naciśnięciu przycisku elektrony będą omijać układ scalony i biec bezpośrednio do dodatniego bieguna baterii przy okazji powodując silne nagrzewanie się przewodów i samej baterii.

Rozwiązaniem tego problemu jest silny opornik (ponad 1kOhm). Można go włączyć na 2 sposoby:

  • Pull-down(po lewej) – gdy przycisk jest wyłączony na wejściu utrzymuje się stan niski ponieważ jest on połączony z ujemnym biegunem baterii. Po wciśnięciu przycisku wszystkie elektrony zostają „wessane” do dodatniego bieguna baterii, opornik spowalnia napływ nowych, co skutkuje pojawieniem się stanu wysokiego na nóżce, po ponownym wyłączeniu przycisku, elektrony które „przecisnęły” się przez opornik powodują przejście w stan niski.
  • Pull-up (po prawej) – gdy przycisk jest wyłączony na nóżce jest stan wysoki, ponieważ jest ona połączona z dodatnim biegunem baterii. Po wciśnięciu przycisku elektrony z ujemnego bieguna docierają zarówno do opornika jak i nóżki scalaka, ponieważ opornik spowalnia ich ruch na nóżce pojawia się stan niski. Zwolnienie przycisku powoduje odcięcie dopływu nowych elektronów, a te obecne powoli odpływają do dodatniego bieguna baterii powodując pojawienie się stanu wysokiego.

W przypadku nóżki GPIO0 nie można stosować rozwiązania pull-down ponieważ spięcie jej z masą przy starcie sprawia, że układ przechodzi w stan wgrywania nowego programu. Należy więc zastosować pull-up, a to wiąże się z drobną zmianą w programie: warunek wykrywający wciśnięcie przycisku ma sprawdzać czy na nóżce jest stan niski.

<code>int ledState = LOW;
void setup() {
   pinMode(0, INPUT);
   pinMode(LED_BUILTIN, OUTPUT);
   digitalWrite(LED_BUILTIN, ledState);
}

void loop() {
    int readValue = digitalRead(0);
    if (readValue == LOW) {
        ledState = ledState == HIGH ? LOW : HIGH;
        digitalWrite(LED_BUILTIN, ledState);
    }
}</code>

Da się jednak uniknąć stosowania zewnętrznego opornika, ponieważ układ ESP8266 ma już taki wbudowany, aby go użyć należy przełączyć pin w tryb INPUT_PULLUP, który jest dedykowany do użycia z przyciskami, tryb input przeznaczony jest raczej dla innych czujników (np. czujnika podczerwieni).

<code>int ledState = LOW;
void setup() {
   pinMode(0, INPUT_PULLUP);
   pinMode(LED_BUILTIN, OUTPUT);
   digitalWrite(LED_BUILTIN, ledState);
}

void loop() {
    int readValue = digitalRead(0);
    if (readValue == LOW) {
        ledState = ledState == HIGH ? LOW : HIGH;
        digitalWrite(LED_BUILTIN, ledState);
    }
}</code>

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *