Проблемы с определением цифрового состояния кнопки

Я пытаюсь запустить событие после нажатия и удерживания встроенной во флэш-память кнопки Nodemcu в течение определенного времени, я написал две функции, одну для отмены и определения состояния, другую для определения времени нажатия, я не получаю никакого результата, если не уменьшу время нажатия ввода до меньшего чем 1 сек, из-за чего кнопка работает как кнопка с одним нажатием, я думаю, у меня проблема с отключением кнопки, я не могу понять, где она находится?

/**
* @brief отключает кнопку и возвращает текущий высокий или низкий уровень.
* 
* @return int состояние кнопки 0: низкое, 1: высокое, -1 не определено
*/
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 Определяет состояние кнопки и запускает время для расчета продолжительности нажатия 
 * 
 * контакт кнопки ввода @param btn
 * @param PressTime Желаемая продолжительность нажатия для сравнения с
 * @return int возвращает 1 при достижении
времени нажатия */
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)
  {
   //запустите свое мероприятие 
  }

, 👍2

Обсуждение

Я не следую вашей рутине дебоша. Это очень неортодоксально. Возможно, было бы полезно изучить какой-нибудь другой существующий код debounce и написать что-то, что, как мы знаем, работает., @Delta_G

код debounce выглядит так, как будто он должен работать .... было бы легче читать, если бы операторы if были однострочными .... замените код PressNHold, чтобы просто печатать временную метку при переходе кнопок... это может помочь сузить область неудач, @jsotola

Есть ли у вашей кнопки выдвижной резистор?, @Michael Stachowsky


1 ответ


1

оказывается, это очень просто, я не должен ставить buttonPin[1] переменную для PressNHold , я должен был поставить just1 , buttonPin уже использовался в button_state , кроме того, локальные переменные PressnHold должны быть объявлены статическими, чтобы не получить сброс после выполнения функции.

,