• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
Сверху Снизу