Проблемы с определением цифрового состояния кнопки
Я пытаюсь запустить событие после нажатия и удерживания встроенной во флэш-память кнопки 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: нет такого файла или каталога
- Достаточно ли 1 МБ флэш-памяти для загрузки OTA в ESP-01?
- Ошибка при загрузке кода в esp8266 через arduino (FatalError('Failed to connect to %s: %s' % (self.CHIP_NAME, last_error)))
- NodeMCU 1.0 автоматически сбрасывается через некоторое время
Я не следую вашей рутине дебоша. Это очень неортодоксально. Возможно, было бы полезно изучить какой-нибудь другой существующий код debounce и написать что-то, что, как мы знаем, работает., @Delta_G
код debounce выглядит так, как будто он должен работать .... было бы легче читать, если бы операторы
ifбыли однострочными .... замените кодPressNHold, чтобы просто печатать временную метку при переходе кнопок... это может помочь сузить область неудач, @jsotolaЕсть ли у вашей кнопки выдвижной резистор?, @Michael Stachowsky