# ESP32 ESP-IDF component for TTP229 touch pad ## Features 1. Support for 8-pad and 16-pad TTP229 configurations. 2. RMT-based SPI-like communication without GPIO bit-banging. 3. Multi-device support with unique device numbering. 4. FreeRTOS task for debouncing and event dispatching. 5. Error statistics tracking (RMT driver, event post, queue overflow, stack). 6. Event-based API via esp_event framework. 7. IRAM-safe ISR handler and RMT callback. ## Attention 1. After start/reset first touch not work. 2. Multi touch not supported. ## Using In an existing project, run the following command to install the component: ```bash cd ../your_project/components git clone https://github.com/aZholtikov/zh_ttp229 ``` In the application, add the component: ```c #include "zh_ttp229.h" ``` ## Examples ### Basic Example: Single Device ```c #include "zh_ttp229.h" #define TTP229_NUMBER 0x01 zh_ttp229_handle_t *ttp229_handle = NULL; void zh_ttp229_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data); void app_main(void) { esp_log_level_set("zh_ttp229", ESP_LOG_ERROR); esp_log_level_set("zh_vector", ESP_LOG_ERROR); esp_event_loop_create_default(); esp_event_handler_instance_register(ZH_TTP229, ESP_EVENT_ANY_ID, &zh_ttp229_event_handler, NULL, NULL); zh_ttp229_init_config_t config = ZH_TTP229_INIT_CONFIG_DEFAULT(); config.scl_gpio = GPIO_NUM_25; config.sdo_gpio = GPIO_NUM_27; config.work_mode = ZH_TTP229_16_PAD; config.device_number = TTP229_NUMBER; config.debounce_time = 300; config.rmt_tx_start_delay = 23; esp_err_t ret = zh_ttp229_init(&config, &ttp229_handle); if (ret != ESP_OK) { printf("TTP229 initialization error: %s\n", esp_err_to_name(ret)); return; } for (;;) { vTaskDelay(1000 / portTICK_PERIOD_MS); } ret = zh_ttp229_deinit(&ttp229_handle); if (ret != ESP_OK) { printf("TTP229 deinit error: %s\n", esp_err_to_name(ret)); } } void zh_ttp229_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { zh_ttp229_event_on_isr_t *ttp229_event = event_data; printf("Touch pad number %d pad number %d pressed.\n", ttp229_event->device_number, ttp229_event->pad_number); } ``` --- ### Stats Example ```c #include "zh_ttp229.h" #define TTP229_NUMBER 0x01 zh_ttp229_handle_t *ttp229_handle = NULL; void zh_ttp229_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data); void app_main(void) { esp_log_level_set("zh_ttp229", ESP_LOG_ERROR); esp_log_level_set("zh_vector", ESP_LOG_ERROR); esp_event_loop_create_default(); esp_event_handler_instance_register(ZH_TTP229, ESP_EVENT_ANY_ID, &zh_ttp229_event_handler, NULL, NULL); zh_ttp229_init_config_t config = ZH_TTP229_INIT_CONFIG_DEFAULT(); config.scl_gpio = GPIO_NUM_25; config.sdo_gpio = GPIO_NUM_27; config.work_mode = ZH_TTP229_16_PAD; config.device_number = TTP229_NUMBER; config.debounce_time = 300; config.rmt_tx_start_delay = 23; esp_err_t ret = zh_ttp229_init(&config, &ttp229_handle); if (ret != ESP_OK) { printf("TTP229 initialization error: %s\n", esp_err_to_name(ret)); return; } for (;;) { const zh_ttp229_stats_t *stats = zh_ttp229_get_stats(); printf("Number of RMT driver error: %ld.\n", stats->rmt_driver_error); printf("Number of event post error: %ld.\n", stats->event_post_error); printf("Number of queue overflow error: %ld.\n", stats->queue_overflow_error); printf("Minimum free stack size: %ld.\n", stats->min_stack_size);; vTaskDelay(60000 / portTICK_PERIOD_MS); } zh_ttp229_reset_stats(); ret = zh_ttp229_deinit(&ttp229_handle); if (ret != ESP_OK) { printf("TTP229 deinit error: %s\n", esp_err_to_name(ret)); } } void zh_ttp229_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { zh_ttp229_event_on_isr_t *ttp229_event = event_data; printf("Touch pad number %d pad number %d pressed.\n", ttp229_event->device_number, ttp229_event->pad_number); } ``` --- ### Multi-Device Example ```c #include "zh_ttp229.h" #define TTP229_DEVICE_1 0x01 #define TTP229_DEVICE_2 0x02 zh_ttp229_handle_t *ttp229_handle_1 = NULL; zh_ttp229_handle_t *ttp229_handle_2 = NULL; void zh_ttp229_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data); void app_main(void) { esp_log_level_set("zh_ttp229", ESP_LOG_ERROR); esp_log_level_set("zh_vector", ESP_LOG_ERROR); esp_event_loop_create_default(); esp_event_handler_instance_register(ZH_TTP229, ESP_EVENT_ANY_ID, &zh_ttp229_event_handler, NULL, NULL); zh_ttp229_init_config_t config_1 = ZH_TTP229_INIT_CONFIG_DEFAULT(); config_1.scl_gpio = GPIO_NUM_25; config_1.sdo_gpio = GPIO_NUM_27; config_1.work_mode = ZH_TTP229_16_PAD; config_1.device_number = TTP229_DEVICE_1; config_1.debounce_time = 300; config_1.rmt_tx_start_delay = 23; esp_err_t ret = zh_ttp229_init(&config_1, &ttp229_handle_1); if (ret != ESP_OK) { printf("TTP229 device 1 initialization error: %s\n", esp_err_to_name(ret)); return; } zh_ttp229_init_config_t config_2 = ZH_TTP229_INIT_CONFIG_DEFAULT(); config_2.scl_gpio = GPIO_NUM_26; config_2.sdo_gpio = GPIO_NUM_28; config_2.work_mode = ZH_TTP229_16_PAD; config_2.device_number = TTP229_DEVICE_2; config_2.debounce_time = 300; config_2.rmt_tx_start_delay = 23; ret = zh_ttp229_init(&config_2, &ttp229_handle_2); if (ret != ESP_OK) { printf("TTP229 device 2 initialization error: %s\n", esp_err_to_name(ret)); zh_ttp229_deinit(&ttp229_handle_1); return; } for (;;) { vTaskDelay(1000 / portTICK_PERIOD_MS); } zh_ttp229_deinit(&ttp229_handle_2); zh_ttp229_deinit(&ttp229_handle_1); } void zh_ttp229_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { zh_ttp229_event_on_isr_t *ttp229_event = event_data; printf("Touch pad number %d pad number %d pressed.\n", ttp229_event->device_number, ttp229_event->pad_number); } ```