探索 ESP32 的隱藏技能 | 掌握 ESP32 Touch Sensor 技術


ESP32 作為一個強大的微控制器,而其中一個常被忽視但非常有用的功能就是 ESP32 Touch Sensor 內建的觸控感應器(Touch Sensor)。作為 ESP32 內建的功能,無論是進行無線通信、智能家居還是創新項目,都能輕鬆勝任。

ESP32 Touch Sensor

簡介

ESP32 Touch Sensor 的觸控感應器基於電容原理,能夠感測到手指或其他導電物體的接近。這些觸控感應器並不需要外部觸控面板或傳感器,而是直接利用 ESP32 的內部硬體(具備多達 10 個觸控通道)來實現感應功能。

這些觸控通道(從 T0 到 T9)分別對應不同的 GPIO 引腳,開發者可以根據需求配置和使用。這項技術特別適用於實現簡單的觸控按鍵、滑動條、手勢控制等功能,並且能有效減少硬體成本和設計的複雜性。

注意:並非所有 ESP32 模組都支持觸控感應。例如,ESP32-C3 和 ESP32-S2 系列就不具備這項功能。在購買前務必確認你的開發板是否支持觸控感應。

什麼是 Touch Sensor?

觸摸感測器是一種能夠檢測和回應觸摸、手勢或壓力的裝置。當物體(通常是人手指)接近或接觸到感測器表面時,感測器會產生電信號,這些信號可以被電子設備讀取並轉換為特定的動作或指令。

觸摸感測器的工作原理主要有兩種:

電阻式觸摸感測器: 這類感測器則利用壓力來改變電阻值。當手指按下感測器表面時,會壓縮兩個導電層,改變電阻值,從而產生電信號。

電容式觸摸感測器: 這類感測器利用人體與感測器表面形成電容的原理來檢測觸摸。當手指接近或接觸感測器表面時,會改變感測器表面的電容值,從而產生電信號。

ESP32 Touch Sensor 的 GPIO 腳位

ESP32 的觸控感應功能(Touch Sensor)並非每個型號或 GPIO 都支持。大部分標準 ESP32 模組包含 10 個可用於觸控的 GPIO 引腳。

  • T0: GPIO4
  • T1: GPIO0
  • T2: GPIO2
  • T3: GPIO15
  • T4: GPIO13
  • T5: GPIO12
  • T6: GPIO14
  • T7: GPIO27
  • T8: GPIO33
  • T9: GPIO32

注意:某些 ESP32 變體,例如 ESP32-C3 和 ESP32-S2,並不支援觸控感應功能。在開始之前,請確認你的開發板是否支持觸控感應。

開發環境

在開始編程之前,請確保已完成以下準備工作:

程式碼

我們用一個簡單的範例來展示 ESP32 Touch Sensor 的魔力 :

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/touch_pad.h"
#include "esp_log.h"

// Define a tag for logging
static const char *TAG = "Touch Sensor";

// Main function to initialize and handle touch sensor
void app_main(void) {
    // Log the initialization message for touch sensor
    ESP_LOGI(TAG, "Initializing touch pad");

    // Initialize the touch pad driver
    touch_pad_init();

    // Configure touch sensor channel T0 (GPIO4)
    // TOUCH_PAD_NUM0 corresponds to the T0 touch sensor, GPIO4 is typically used.
    touch_pad_config(TOUCH_PAD_NUM0, 0);

    // Start the touch sensor filter, with a filter value of 10 (for smoothing)
    touch_pad_filter_start(10);

    // Main loop for continuously reading touch sensor values
    while (1) {
        uint16_t touch_value;  // Variable to store the touch sensor reading

        // Read the touch value from the T0 sensor (GPIO4)
        touch_pad_read(TOUCH_PAD_NUM0, &touch_value);

        // Log the touch value
        ESP_LOGI(TAG, "Touch Value: %d", touch_value);

        // Check if the touch value is below a certain threshold
        // This is the touch detection threshold (in this case, 500)
        if (touch_value < 500) {
            // If the touch value is below the threshold, a touch is detected
            ESP_LOGI(TAG, "Touch detected!");
        }

        // Delay the loop to avoid overloading the system, 100 ms delay
        vTaskDelay(pdMS_TO_TICKS(100));
    }
}

程式碼解釋

初始化觸控感應器 :

  • touch_pad_init(): 初始化觸控感應器系統。這個函數會初始化硬體並準備觸控感應器進行工作,這是操作觸控感應器前必須執行的步驟。
  • touch_pad_config(TOUCH_PAD_NUM0, 0): 配置觸控感應器通道 T0(即 GPIO4),並將其設置為輸入模式。第二個參數設為 0 是為了設置觸控閾值,但在此例中並未明確使用。
  • touch_pad_filter_start(10): 啟動觸控感應器的濾波器,這裡設置濾波值為 10,表示每次讀取時會進行 10 次測量並進行平滑處理,這有助於減少環境噪聲對感應結果的影響。

主循環 :

  • while (1): 程式進入無限循環,持續檢查觸控感應器的數值。
  • uint16_t touch_value;: 定義一個 16 位無符號整數變數,用來存儲觸控感應器讀取到的數值。
  • touch_pad_read(TOUCH_PAD_NUM0, &touch_value): 從 TOUCH_PAD_NUM0(即 T0 通道,GPIO4)讀取觸控值,並將讀取的數值存入 touch_value 變數。這個數值代表了觸控感應器的電容變化,會隨著手指或導電物體接近感應區域而變化。
  • ESP_LOGI(TAG, "Touch Value: %d", touch_value): 使用日誌輸出顯示當前的觸控數值,這樣有助於查看觸控感應器的讀取值,便於調試。

觸控偵測 :

  • if (touch_value < 500): 檢查觸控數值是否小於設定的閾值(這裡設為 500)。如果觸控值低於該閾值,則表示觸控感應器偵測到觸控事件。
  • ESP_LOGI(TAG, "Touch detected!"): 如果偵測到觸控事件,則輸出 “Touch detected!” 的日誌訊息,提醒開發者觸控已經被偵測到。

輸出

會在串口監視器中看到類似以下的輸出 :

I (125) Touch Sensor: Initializing touch sensor...
D (130) Touch Sensor: Touch sensor initialized successfully!
I (145) Touch Sensor: Touch detected! Value: 350
W (160) Touch Sensor: Touch not detected. Value: 700
E (180) Touch Sensor: Error: Failed to initialize touch pad!

結論

ESP32 Touch Sensor 的操作原理簡單卻高效,依靠電容變化來檢測觸摸事件,這使得其能夠無需物理開關的情況下實現開關控制、觸控檢測及其他創新應用。從物理觸摸感應到更複雜的多點觸控,ESP32 的觸控感應技術為開發者提供了更大的創作空間。

在未來的物聯網和嵌入式系統中,隨著對智慧型、無接觸控制的需求增加,這項技術將變得越來越重要。開發者可以利用 ESP32 的觸控感應器來創建創新且高效的用戶界面,無論是在智能家居、穿戴設備還是嵌入式控制系統中。