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.
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”