I'm a complete beginner with Arduino but have done quite a bit of searching and can't seem to fix this problem.
I'm trying to create a procedure that is repeatedly called in the main loop()
that will set a variable depending on the current state of a button, as well as the duration the button has been or was pushed for. This code is probably messier than it needs to be, but it just seems to leave the variable at 0
. What am I missing?
There is code in the loop()
itself that sets the rotaryButtonToAction
variable back to noPress
once it has been acted upon.
#define noPress 0
#define shortPressReleased 1
#define longPressReleased 2
#define shortPressHolding 3
#define longPressHolding 4
int rotaryButtonState;
int rotaryButtonReading;
int lastRotaryButtonReading = HIGH;
int timeOfLastRotaryButtonReadingChange = 0;
int debounceDelay = 50;
int longPressDelay = 300;
int rotaryButtonToAction = 0;
void checkRotaryButton() {
if (rotaryButtonToAction == noPress) { // if there is nothing to action, check the state of the button
rotaryButtonReading = digitalRead(ROTARY_BUTTON); // store pin's current state
if (rotaryButtonReading != lastRotaryButtonReading) { // if pin state has changed from the last reading, set timeOfLastRotaryButtonReadingChange to the time of the change
timeOfLastRotaryButtonReadingChange = millis();
}
if (millis() - timeOfLastRotaryButtonReadingChange > debounceDelay) { // if more time has passed than the debounce delay, change the action state of the button
if (rotaryButtonReading = LOW) { // if the button is still pressed, set the action to indicate it has been pressed and is still pressed
rotaryButtonToAction = shortPressHolding;
}
else { // if the button was pressed for longer than the debounce delay and was released, set the action
rotaryButtonToAction = shortPressReleased;
}
}
}
if (millis() - timeOfLastRotaryButtonReadingChange > longPressDelay) { // if more time has passed than the long press delay, change the action state of the button
if (rotaryButtonReading == LOW) { // if the button is still pressed, set the action to indicate it has been pressed and is still pressed
rotaryButtonToAction = longPressHolding;
}
else { // if the button was pressed for longer than the long press delay and was released, set the action
rotaryButtonToAction = longPressReleased;
}
}
} // end checkRotaryButton