• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Решено Как правильно сделать сброс настроек (с кнопкой)

de1m

New member
Написал (точнее скопировал и переделал) функцию, которая при нажатии кнопки делает прерывания и выполняет функцию. Вот функция, если кому надо

Код:
// Инициализация кнопки CONFMODE (GPIO0)
void BtnInit() {
    // Уст. GPIO 0 на ввод-вывод
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
    // Вкл. подтяг. резистор
    PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO2_U);
    // Откл. глоб.прерываний
    ETS_GPIO_INTR_DISABLE();
    // Подкл. процедуры обраб. прерываний
    ETS_GPIO_INTR_ATTACH(input_intr_handler, NULL);
    GPIO_DIS_OUTPUT(BTN_CONFIG_GPIO);
    // Очистка статуса
    GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(2));
    // Вкл.прерываний
    gpio_pin_intr_state_set(GPIO_ID_PIN(BTN_CONFIG_GPIO), GPIO_PIN_INTR_NEGEDGE);
    // Вкл.глоб.прерываний
    ETS_GPIO_INTR_ENABLE();
    // Таймер
    os_timer_disarm(&DebounceTimer);
    os_timer_setfn(&DebounceTimer, &debounce_timer_cb, 0);
}

// Процедура обраб. прерываний
LOCAL void input_intr_handler(void *arg)
{
    // Состояние GPIO
    uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
    // Очистка
    GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);
    // Откл.прерываний
    ETS_GPIO_INTR_DISABLE();
    gpio_pin_intr_state_set(GPIO_ID_PIN(BTN_CONFIG_GPIO), GPIO_PIN_INTR_DISABLE);
    // Вкл.прерываний
    ETS_GPIO_INTR_ENABLE();
    // Установка таймера
    os_timer_arm(&DebounceTimer, 200, 0);
}

// Выполняется в случае нажатия кнопки CONFMODE
void ICACHE_FLASH_ATTR debounce_timer_cb(void *arg)
{
    ETS_GPIO_INTR_DISABLE();
    gpio_pin_intr_state_set(GPIO_ID_PIN(BTN_CONFIG_GPIO), GPIO_PIN_INTR_NEGEDGE);
    ETS_GPIO_INTR_ENABLE();
    os_printf("Button was pressed\n");
}
Теперь хочу сделать, чтобы при долгом удержании (3-6 сек.) стирались настройки. Но мне не ясно, как я могу посчитать сколько была надавлена кнопка.
Пока я вижу только один способ:
1. Когда давится кнопка (по спадающему фронту) включать таймер, который каждые 20мс пишет в счётчик. Одновременно поменять прерывание, чтобы оно работало по восходящему фронту и когда оно сработает смотреть сколько времени в счётчике.
Мне пока непонятно как я могу перенастроить прерывание и возможно ли это вообще, а так-же правильный ли это путь.

Как это правильно сделать?
 
Последнее редактирование:

nikolz

Well-known member
Написал (точнее скопировал и переделал) функцию, которая при нажатии кнопки делает прерывания и выполняет функцию. Вот функция, если кому надо

Код:
// Инициализация кнопки CONFMODE (GPIO0)
void BtnInit() {
    // Уст. GPIO 0 на ввод-вывод
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
    // Вкл. подтяг. резистор
    PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO2_U);
    // Откл. глоб.прерываний
    ETS_GPIO_INTR_DISABLE();
    // Подкл. процедуры обраб. прерываний
    ETS_GPIO_INTR_ATTACH(input_intr_handler, NULL);
    GPIO_DIS_OUTPUT(BTN_CONFIG_GPIO);
    // Очистка статуса
    GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(2));
    // Вкл.прерываний
    gpio_pin_intr_state_set(GPIO_ID_PIN(BTN_CONFIG_GPIO), GPIO_PIN_INTR_NEGEDGE);
    // Вкл.глоб.прерываний
    ETS_GPIO_INTR_ENABLE();
    // Таймер
    os_timer_disarm(&DebounceTimer);
    os_timer_setfn(&DebounceTimer, &debounce_timer_cb, 0);
}

// Процедура обраб. прерываний
LOCAL void input_intr_handler(void *arg)
{
    // Состояние GPIO
    uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
    // Очистка
    GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);
    // Откл.прерываний
    ETS_GPIO_INTR_DISABLE();
    gpio_pin_intr_state_set(GPIO_ID_PIN(BTN_CONFIG_GPIO), GPIO_PIN_INTR_DISABLE);
    // Вкл.прерываний
    ETS_GPIO_INTR_ENABLE();
    // Установка таймера
    os_timer_arm(&DebounceTimer, 200, 0);
}

// Выполняется в случае нажатия кнопки CONFMODE
void ICACHE_FLASH_ATTR debounce_timer_cb(void *arg)
{
    ETS_GPIO_INTR_DISABLE();
    gpio_pin_intr_state_set(GPIO_ID_PIN(BTN_CONFIG_GPIO), GPIO_PIN_INTR_NEGEDGE);
    ETS_GPIO_INTR_ENABLE();
    os_printf("Button was pressed\n");
}
Теперь хочу сделать, чтобы при долгом удержании (3-6 сек.) стирались настройки. Но мне не ясно, как я могу посчитать сколько была надавлена кнопка.
Пока я вижу только один способ:
1. Когда давится кнопка (по спадающему фронту) включать таймер, который каждые 20мс пишет в счётчик. Одновременно поменять прерывание, чтобы оно работало по восходящему фронту и когда оно сработает смотреть сколько времени в счётчике.
Мне пока непонятно как я могу перенастроить прерывание и возможно ли это вообще, а так-же правильный ли это путь.

Как это правильно сделать?
-----------------------
Это очень просто.
Когда нажимаете кнопку, запоминаете системное время
Когда отпускаете кнопку, из системного времени вычитаете запомненное.
Получаете длительность нажатия кнопки.
 
  • Like
Реакции: de1m
Сверху Снизу