Enkla multi-mode 4wd Rover JR-001 (13 / 15 steg)
Steg 13: Kod Detaljer - Switch debounce
Här kommer vi att täcka några av de mer intressanta aspekterna av koden.
Hantering av Switch-läge:
Mekaniska brytare som tryckknappar och vippströmbrytare är mycket trevlig och bekväm att använda med en micro controller, men har ett stort problem... De genererar mycket elektriska störningar när bytte eller tryckt (se bild för detaljer). Detta "brus" härjar med din kod för att läsa en knapp eller omkopplare och kan orsaka koden till mis-läsa en ändring i tillståndet switch. För att råda bot på detta lägger vi till några logik för att "Dämpningstid" växeln.
En debounce är bara lite extra kod att hålla reda på senast en ändring i tillståndet switch hände. När växeln är växlas eller bytte, den funktion som läser digital PIN-koden för det, sparar ändringen inträffade. När en annan förändring är att märka, som sparade tid kontrolleras för att se om det är utanför räckvidden för den nya tiden. Om den nya förändringen är mindre än 20ms från sist, ändringen ignoreras och antas vara buller. Om det var större än 20ms, sedan ändringen vidtas och en ny ändra tid sparas. Detta håller koden från att få flera ändringar per switch flip.
Från det globala avsnittet...
#define DEBOUNCE_TM 20 / / 20ms
.
osignerade långa last_pin_change;
.
.
.
funktion för att hantera inställningsreglaget med debounce
void checkMode)
{
byte mode_val = digitalRead (MODE_PIN);
om ((lång)(millis () - last_pin_change) > = DEBOUNCE_TM) {
last_pin_change = millis ();
Förändringar i läge bot är i.
om (mode_val == låg)
läge = MODE_AVOID;
om (mode_val == hög)
läge = MODE_FORCE;
mode_change == true;
}
}