Układ działa już dużo lepiej, zdarza się jednak że po naciśnięciu przycisku lampka nie wyłącza/ nie włącza się. Wynika to z faktu iż układ jest znacznie szybszy niż ludzki palec i pojedyncze wciśnięcie przycisku jest interpretowane jako ciąg wciśnięć.
Rozwiązaniem jest zmiana wykrywania stanu niskiego na wykrywanie zmiany stanu z niskiego na wysoki:
int ledState = LOW;
int prevButtonState = LOW;
void setup() {
pinMode(0, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
int readValue = digitalRead(0);
if (readValue == LOW && prevButtonState == HIGH) {
ledState = ledState == HIGH ? LOW : HIGH;
digitalWrite(LED_BUILTIN, ledState);
}
prevButtonState = readValue;
}
Powyższy kod zredukował problem, nie usunął go jednak całkowicie. Winny temu jest tzw. bouncing. W trakcie wciskania elementy przycisku trą i odbijają się od siebie, co sprawia, że przepływ prądu jest przerywany i wznawiany.
Problem można rozwiązać sprzętowo: wstawiając kondensator wokół przycisku. W moim przypadku całkiem nie źle się sprawdził elektrolityczny kondensator 4,7 mikrofarada.
![](https://szogun1987.azureedge.net/wp-content/esp-debounce-cond.png)
Problem można też rozwiązać programowo, program może sprawdzić czy kolejne przełączenie przycisku nastąpiło bezpośrednio po poprzednim przez wywołanie metody millis, która zwraca czas w milisekundach który upłynął od uruchomienia programu i sprawdzeniu czy od poprzedniej zmiany stanu minął określony przedział czasu.
int ledState = LOW;
int prevButtonState = LOW;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 100;
void setup() {
pinMode(0, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
int readValue = digitalRead(0);
if (readValue == LOW && prevButtonState == HIGH) {
if ((millis() - lastDebounceTime) > debounceDelay) {
lastDebounceTime = millis();
ledState = ledState == HIGH ? LOW : HIGH;
}
}
digitalWrite(LED_BUILTIN, ledState);
prevButtonState = readValue;
}
Czytelnikom chcącym dowiedzieć się czegoś więcej na temat bouncingu polecam film na kanale RS Elektronika
Inne artykuły związane z Internetem rzeczy
Jedna odpowiedź do “ESP8266 – podłączenie przycisku”