Проблемы с определением цифрового состояния кнопки
Я пытаюсь запустить событие после нажатия и удерживания встроенной во флэш-память кнопки 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)
{
//запустите свое мероприятие
}
@alasa995, 👍2
Обсуждение1 ответ
оказывается, это очень просто, я не должен ставить buttonPin[1] переменную для PressNHold , я должен был поставить just1 , buttonPin уже использовался в button_state , кроме того, локальные переменные PressnHold должны быть объявлены статическими, чтобы не получить сброс после выполнения функции.
- Устранение дребезга кнопки с помощью прерывания
- Хорошая кнопка debouncing/Библиотека StateChange
- Напряжение меняется, но цифровой поток всегда HIGH
- Ошибка при загрузке «Произошла фатальная ошибка esptool.py: тайм-аут записи»
- esp_now.h: нет такого файла или каталога
- Ошибка при загрузке кода в esp8266 через arduino (FatalError('Failed to connect to %s: %s' % (self.CHIP_NAME, last_error)))
- Достаточно ли 1 МБ флэш-памяти для загрузки OTA в ESP-01?
- NodeMCU 1.0 автоматически сбрасывается через некоторое время
Я не следую вашей рутине дебоша. Это очень неортодоксально. Возможно, было бы полезно изучить какой-нибудь другой существующий код debounce и написать что-то, что, как мы знаем, работает., @Delta_G
код debounce выглядит так, как будто он должен работать .... было бы легче читать, если бы операторы
if
были однострочными .... замените кодPressNHold
, чтобы просто печатать временную метку при переходе кнопок... это может помочь сузить область неудач, @jsotolaЕсть ли у вашей кнопки выдвижной резистор?, @Michael Stachowsky