Что должен возвращать 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 разных функций...
Заранее спасибо.
1 ответ
Как указывали люди в комментариях, все должно быть по - другому.
Если вы используете функцию 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
- Невозможно преобразовать 'int (*)[size]' в 'int**': Cannot convert 'int (*)[size]' to 'int**'
- Как удалить элемент из массива arduino?
- Как передать несколько переменных в функцию?
- Есть ли функция Adafruit для инвертирования цветов моего экрана для языка Arduino?
- Как вернуть значение массива символов в функции Arduino IDE?
- Проблема с функцией, имеющей параметр со значением по умолчанию
- Ошибка: Переменная или поле объявлены недействительными
- Как получить переменную из функции обратного вызова?
вы пробовали пример кода, который входит в состав библиотеки?, @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