Stap 13: Code details - Switch ontdendering
Hier zullen we bespreken enkele van de meer interessante aspecten van de code.
Behandeling van de Switch-modus:
Mechanische schakelaars, zoals drukknoppen en aan-uitschakelaars zijn erg mooi en handig om te gebruiken met een micro-controller, maar heb een groot probleem... Zij genereren een heleboel elektrische ruis wanneer overgeschakeld of ingedrukt (Zie de afbeelding voor details). Deze "ruis" ravage aanrichten met uw code te lezen van een knop of schakelaar en kan leiden tot de code verkeerd lezen een verandering in de switch staat. Om dit te verhelpen, voegen we enkele logica om te "debounce" de schakelaar.
Een ontdendering is net een beetje extra code voor het bijhouden van de laatste keer dat een verandering in de schakelaar staat gebeurde. Wanneer de schakelaar van een knevel gevoorzid of overgeschakeld, de functie die de digitale pin leest voor, bespaart de tijd die de verandering opgetreden. Wanneer een andere verandering wordt opgemerkt, wordt die opgeslagen tijd gecontroleerd om te zien of het buiten het bereik van de nieuwe tijd. Als de nieuwe verandering minder dan 20ms van de laatstgenoemde is, is de wijziging genegeerd en uitgegaan van lawaai. Als het was groter dan 20ms, vervolgens de verandering wordt genomen en een nieuwe verandering tijd wordt opgeslagen. Dit voorkomt dat de code krijgen meerdere wijzigingen per schakelaar flip.
// From the Global section.... #define DEBOUNCE_TM 20 // 20ms . unsigned long last_pin_change; . . . // function to handle the mode switch with debounce void checkMode ( ) { byte mode_val = digitalRead (MODE_PIN); if ((long)(millis ( ) - last_pin_change) >= DEBOUNCE_TM) { last_pin_change = millis ( ); // Changes the Mode the bot is in. if (mode_val == LOW) mode = MODE_AVOID; if (mode_val == HIGH) mode = MODE_FORCE; mode_change == true; } }