Ich habe mal probiert wie in dem Tutorial Debounce einen 10 K ohm Resistor zwischen GND zu schalten. Hat aber irgendwie nix gebracht. Mein Umschalter hat ja drei Anschlüsse. Links hab ich den D-Pin2, rechts den D-Pin3 und in der Mitte GND.
Wenn Du das so angeschlossen hast, das sind die beiden Schalter des Umschalters LOW-aktiv. Das bedeutet, das Du beim Schliessen einer der beiden Schalter diesen mit GND verbindest und damit das zugehörige Eingangs-Pins auf LOW schaltest.
Das ist nicht falsch, allerdings bringt Dir der 10k Widerstand gegen Masse dann nix, denn Du brauchst einen PULLUP und keinen PULLDOWN Widerstand. Soviel zur "schlechten" Nachricht. Die gute Nachricht ist, das der Arduino bereits einen internen PULLUP Widerstand hat.
Aktivieren kannst Du den, indem Du ein Pin mit pinMoude(pin, INPUT) als Eingang definierst und danach mittels digitalWrite(pin,HIGH) ein HIGH auf das Pin schreibst. Damit wird nicht das Pin gesetzt (denn das ist ja ein Eingang, kein Ausgang), sondern der interne PULLUP Widerstand aktiviert.
Achtung!! Damit verändert sich die Logik Deiner Eingänge. Durch den PULLUP Widerstand wird der Eingang nun dauerhaft auf HIGH gesetzt, ein if(digitalRead(pin) == HIGH) ist also immer wahr, wenn der Schater NICHT betätigt wurde. Ein digitalREAD(pin) wird dann ein LOW liefern, wenn Du den entsprechenden Schalter betätigst.
Das Ganze hat aber noch nix mit debouncing zu tun. Das musst Du immer noch selber machen. In Deinem Programm hast Du einen Fehler an folgender Stelle:
if (buttonrState == HIGH)
lastDebounceTime = millis();
if ((millis() - lastDebounceTime) > debounceDelay)
// whatever the reading is at, it's been there for longer
// than the debounce delay, so take it as the actual current state:
if(angle > 0){
angle = angle-23;
delay(20);
myservo.write(angle);
}
Es fehlen die Blöcke ( {}-Klammern) um die einzelnen IF-Abfragen.
Das "if (buttonrState == HIGH) lastDebounceTime = millis();" ist ein eigener, abgeschlossener Block. Der nachfolgende Code " if ((millis() - lastDebounceTime)..." wird IMMER ausgeführt, egal was bei "if (buttonrState == HIGH)" raus kommt.
Das passiert an beiden Stellen im Programm für buttonrState und buttonlState
Dein Debounce Code sorgt also eigentlich nur dafür, das der Servo automatisch und abwechselnd Schritte in die eine oder andere Richtung macht, unabhängig von der Stellung des Umschalters.
Ich habe jetzt nicht weiter geschaut, ob der Code überhaupt sinnvoll ist, auf den ersten Blick wirkt er aber so. Allerdings muss der zweite if-Block mindestens in den ersten Block, damit es sinnvoll wird. Weiterhin musst Du immer noch auf LOW statt auf HIGH prüfen:
//ACHTUNG!! die {-Klammer nach dem if ist wichtig!!
if (buttonrState == LOW) {
lastDebounceTime = millis();
if ((millis() - lastDebounceTime) > debounceDelay)
// whatever the reading is at, it's been there for longer
// than the debounce delay, so take it as the actual current state:
if(angle > 0){
angle = angle-23;
delay(20);
myservo.write(angle);
}
} //kompletten Block schliessen
Für den zweiten Schalter muss das natürlich analog gemacht werden.