Stap 2: Arduino knop Debouncing
Voortzetting van de knop debouncing dat ik in mijn laatste Instructable geïntroduceerd, kunnen we millis() gebruiken om debounce knoppen zonder gebruik te maken van delay():
//Button Press Detection - debounce with millis() int buttonPin = 7; boolean currentState = LOW;//stroage for current measured button state boolean lastState = LOW;//storage for last measured button state boolean debouncedState = LOW;//debounced button state int debounceInterval = 20;//wait 20 ms for button pin to settle unsigned long timeOfLastButtonEvent = 0;//store the last time the button state changed void setup(){ pinMode(buttonPin, INPUT);//this time we will set the pin as INPUT Serial.begin(9600);//initialize Serial connection } void loop(){ currentState = digitalRead(buttonPin); unsigned long currentTime = millis(); if (currentState != lastState){ timeOfLastButtonEvent = currentTime; } if (currentTime - timeOfLastButtonEvent > debounceInterval){//if enough time has passed if (currentState != debouncedState){//if the current state is still different than our last stored debounced state debouncedState = currentState;//update the debounced state //trigger an event if (debouncedState == HIGH){ Serial.println("pressed"); } else { Serial.println("released"); } } } lastState = currentState; }
In deze code die ik heb toegevoegd sommige nieuwe variabelen van de opslag:
Boole debouncedState = laag;
int debounceInterval = 20;
unsigned long timeOfLastButtonEvent = 0;
debouncedState slaat de debounced stand van de knop, dit is de toestand die we absoluut zeker van de knop zijn. Daarentegen currentStatus en lastState slaan de metingen van het huidige en vorige die we van de knop gemaakt, maar ze doen niet vertellen ons de toestand van een knop met zekerheid omdat ze kunnen worden beïnvloed door de knop chatter.
debounceInterval is het bedrag van ms te wachten op de knop pin te regelen voordat we zeker wat er weten in staat. Ik ben mijn laatste voorbeeld ik met behulp van 1ms, hier ben ik met behulp van 20 MS.
timeOfLastButtonEvent is gelijkaardig aan timeOfLastLedEvent in de laatste schets, het geeft een tijd te vergelijken met currentTime, zodat we hoeveel seconden zijn verstreken rekenen kunnen sinds de eerste detecteren een knooppers.
Wij herstellen timeOfLastButtonEvent telkens CurrentStatus niet gelijk is aan lastState:
Als (currentStatus! = lastState) {}
timeOfLastButtonEvent = currentTime;
}
Zodra voldoende tijd is verstreken zonder te herstellen timeOfLastButtonEvent, weten we dat de knop is geregeld in een debounced staat:
currentTime - timeOfLastButtonEvent > debounceInterval
Vervolgens kunnen we de huidige status van de opgeslagen ontdendering bijwerken als het is gewijzigd en zo ja, een gebeurtenis volgens de nieuwe ontdendering staat:
Als (currentStatus! = debouncedState) {}
debouncedState = currentStatus;
Als (debouncedState == HIGH) {}
Serial.println("pressed");
} else {}
Serial.println("Released");
}
}