Mellanliggande Arduino: Ingångar och utgångar (2 / 9 steg)
Steg 2: Arduino knappen Debouncing
Fortsätter från knappen debouncing jag presenterade i min senaste Instructable, kan vi använda millis() för att Dämpningstid knappar utan att använda delay():
Knappen Press detektion - debounce med millis()
int buttonPin = 7.
booleska currentState = låg, //stroage för aktuella uppmätta knappläge
booleska lastState = låg, //storage för senast mätt knappläge
booleska debouncedState = låg, //debounced knappläge
int debounceInterval = 20; //wait 20 ms för knappen pin att bosätta sig
osignerade långa timeOfLastButtonEvent = 0; //store sista gången tillståndet knappen ändras
void setup() {
pinMode (buttonPin, ingång); //this tid vi kommer att ange PIN-koden som indata
Serial.BEGIN (9600); //initialize seriell anslutning
}
void loop() {
currentState = digitalRead(buttonPin);
osignerade långa currentTime = millis();
om (currentState! = lastState) {
timeOfLastButtonEvent = currentTime;
}
om (currentTime - timeOfLastButtonEvent > debounceInterval) {//if tillräckligt med tid har gått
om (currentState! = debouncedState) {//if aktuella tillstånd är ändå annorlunda än vårt senaste lagrade debounced stat
debouncedState = currentState; //update debounced staten
Aktivera en händelse
om (debouncedState == hög) {
Serial.println("Pressed");
} annat {
Serial.println("Released");
}
}
}
lastState = currentState;
}
Jag har lagt till några nya lagring variabler i denna kod:
booleska debouncedState = låg;
int debounceInterval = 20;
osignerade långa timeOfLastButtonEvent = 0;
debouncedState butiker knappen debounced aktuella tillstånd, det är den vi är helt säker på att knappen är i. Däremot currentState och lastState lagra aktuella och sista mätningarna vi om knappen, men de meddelar inte oss statligt av knappen med säkerhet eftersom de kan påverkas av knappen chattare.
debounceInterval är mängden ms vänta på knappen pin sedimentera innan vi vet säkert vad det är i medlemsstaten. Jag är min sista exemplet jag hade använt 1ms, här använder jag 20ms.
timeOfLastButtonEvent liknar timeOfLastLedEvent i senaste skissen, det ger en tid att jämföra med currentTime så att vi kan räkna hur många sekunder har gått sedan första upptäcka en knapptryckning.
TimeOfLastButtonEvent återställs varje gång currentState inte är lika lastState:
om (currentState! = lastState) {
timeOfLastButtonEvent = currentTime;
}
När tillräckligt med tid har gått ut utan att behöva återställa timeOfLastButtonEvent, vet vi knappen har satt sig in i ett debounced tillstånd:
currentTime - timeOfLastButtonEvent > debounceInterval
Så kan vi uppdatera aktuella lagrade debounce tillstånd om det har ändrats, och i så fall utlösa en händelse enligt den nya debounce staten:
om (currentState! = debouncedState) {
debouncedState = currentState;
om (debouncedState == hög) {
Serial.println("Pressed");
} annat {
Serial.println("Released");
}
}