As pointed out from people in the comments, things need to be different.
If you use the function touchAttachInterrupt
, things are a bit simpler.
The example that comes with the ESP32 library is enough to make you understand.
If you want to do what I did, this is how:
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();
Put this code in the setup()
. Of course needs the init()
, but also needs to be set to timer mode, or otherwise you're going to need to start()
probably.
The config()
is to configure the pin as an interrupt. I've set 500 in the threshold because the readings of touch_pad_read()
told me it went from 800 untouched to 50 touched, so the midterm I chose 500.
isr_register
is the function that tells to call TouchButton()
, with NULL
as argument to it.
void TouchButton(void *arg)
{
uint32_t touch = touch_pad_get_status();
touch_pad_clear_status();
Serial.print("Button ");
Serial.println(String(touch));
}
This is the declaration of the callback function I've done. It should be noted that clear_status()
should be called as soon as possible after the get_status()
, preventing the system from panicking (that's the name). You'll also see in the serial monitor that each button represents a power of 2. That's because the get_status()
returns the pin mask in binary. So just do something similar to this
for (int i = 0; i < TOUCH_PAD_MAX; i++) {
if ((pad_intr >> i) & 0x01) {
s_pad_activated[i] = true;
}
}
and you'll get a vector of which one was pressed.