Что должен возвращать touch_pad_get_status ()?

Что я хочу сделать: У меня есть 7 сенсорных кнопок на моей плате (ESP32 TTGO T-Display), и я хочу прикрепить прерывания ко всем, вызывая одну и ту же функцию. В этой функции я хотел бы использовать touch_pad_get_status() или другой, чтобы получить, какая кнопка была затронута. Тогда все остальное сделает корпус коммутатора.

С чем я столкнулся: Этот код

  Serial.print("Button ");
  uint32_t touch = touch_pad_get_status();
  Serial.println(String(touch));

всегда возвращает 0, несмотря ни на что.

Что я пробовал: Включение этой части кода в настройку

  touch_pad_init();
  touch_pad_set_fsm_mode(TOUCH_FSM_MODE_TIMER); //попробовал режим SW
  touch_pad_io_init(TOUCH_PAD_GPIO15_CHANNEL);

Но, похоже, ничего не работает. Я не хочу делать 7 разных функций...

Заранее спасибо.

, 👍2

Обсуждение

вы пробовали пример кода, который входит в состав библиотеки?, @jsotola

@jsotola да, но никто не использует эту функцию. Был один пример, похожий на это приложение, но он реализовал одну функцию для каждой кнопки :(, @Ruvian de Césaro

См.: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/touch_pad.html См.части "Обнаружение прикосновения" и "Прерывания, вызванные прикосновением"., @Michel Keijzers

@MichelKeijzers Вы говорите, что touchAttachInterrupt(...) не может быть использован в этом сценарии? Кроме того, я не знаю, что такое intr_handler_t, в Интернете нет ни одного примера., @Ruvian de Césaro

Однако я точно не знаю https://github.com/espressif/esp-idf/tree/6e77694/examples/peripherals/touch_pad_interrupt кажется, это пример., @Michel Keijzers

предполагается, что функция touch_pad_get_status () используется из прерывания касания. Полная документация: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/touch_pad.html, @Majenko

Спасибо всем, я опубликую ответ на свой вопрос, так как теперь я решил эту проблему., @Ruvian de Césaro


1 ответ


4

Как указывали люди в комментариях, все должно быть по - другому. Если вы используете функцию touchAttachInterrupt, все немного проще. Примера, который поставляется с библиотекой ESP32, достаточно, чтобы вы поняли.

Если вы хотите сделать то, что сделал я, вот как:

  touch_pad_init();
  touch_pad_set_fsm_mode(TOUCH_FSM_MODE_TIMER);
  touch_pad_config(TOUCH_PAD_GPIO2_CHANNEL, 500);
  touch_pad_config(TOUCH_PAD_GPIO15_CHANNEL, 500);
  touch_pad_config(TOUCH_PAD_GPIO13_CHANNEL, 500);
  touch_pad_isr_register(TouchButton, NULL);
  touch_pad_intr_enable();

Поместите этот код в setup(). Конечно, нужна init (), но также должна быть установлена в режим таймера, иначе вам, вероятно, понадобится start (). Функция config() предназначена для настройки вывода в качестве прерывания. Я установил 500 в пороге, потому что показания touch_pad_read() сказали мне, что он прошел от 800 нетронутых до 50 затронутых, поэтому в среднесрочной перспективе я выбрал 500. isr_register-это функция, которая сообщает о вызове TouchButton ()с NULL в качестве аргумента.

void TouchButton(void *arg)
{
  uint32_t touch = touch_pad_get_status();
  touch_pad_clear_status();
  Serial.print("Button ");
  Serial.println(String(touch));
}

Это объявление функции обратного вызова, которую я сделал. Следует отметить, что clear_status() следует вызывать как можно скорее после get_status (), предотвращая панику системы (вот и название). Вы также увидите на последовательном мониторе, что каждая кнопка представляет собой степень 2. Это потому, что get_status() возвращает маску PIN в двоичном формате. Так что просто сделайте что-то похожее на это

for (int i = 0; i < TOUCH_PAD_MAX; i++) {
    if ((pad_intr >> i) & 0x01) {
        s_pad_activated[i] = true;
    }
}

и вы получите вектор того, какой из них был нажат.

,

Проголосовали за подробный ответ и помощь другим., @Michel Keijzers

И один из них дает вам небольшой толчок над [комментарием везде](https://arduino.stackexchange.com/help/privileges/comment) порог скорее раньше, чем позже. Через несколько дней вы сможете отметить свой собственный ответ как принятый., @timemage