I am trying to start an event after pressing and holding the FLASH built-in Nodemcu button for a specific time, I wrote two functions, one for debouncing and detecting the state, the other is to detect the pressing time, I'm not getting any result unless I decrease the input pressing time to less than 1s, which makes the button works as a single-push button, I think i have a problem with debouncing the button, I can't figure out where it is?
/**
* @brief debounces the button and returns the current level high or low
*
* @return int the button state 0: low, 1: high, -1 indetermined
*/
int button_state(int btn)
{
int const DEBOUNCE = 200;
static int hi = DEBOUNCE;
static int lo = 0;
if (digitalRead(buttonPin[btn]))
{
if (hi < DEBOUNCE)
{
hi++;
}
if (lo > 0)
{
lo--;
}
}
else
{
if (lo < DEBOUNCE)
{
lo++;
}
if (hi > 0)
{
hi--;
}
}
if (hi == DEBOUNCE)
{
return 1;
}
else if (lo == DEBOUNCE)
{
return 0;
}
else
{
return -1;
}
}
/**
* @brief Detects the button state and starts a time to calculate pressing duration
*
* @param btn input button pin
* @param PressTime Desired pressing duration to compare to
* @return int returns 1 when PressTime is reached
*/
int PressNHold(int btn, int PressTime)
{
int lastButtonState = 0, Startpressed = 0, endPressed = 0, holdTime = 0,
buttonState = button_state(btn);
if(buttonState != -1)
{
if (buttonState != lastButtonState)
{
if (buttonState == 1)
{
Startpressed = millis();
}
else
{
endPressed = millis();
holdTime = endPressed - Startpressed;
if (holdTime >= PressTime)
{
Serial.printf("Button %d pressed for %ds or more\n", btn, holdTime);
holdTime = 0;
return 1;
}
}
}
}
lastButtonState = buttonState;
}
.....
void loop {
if (PressNHold(buttonPin[1], 5 * 1000) == 1)
{
//launch your event
}
if
statements were one-liners .... replace thePressNHold
code to just print a timestamp at button transitions ... that may help narrow down the area of failure