Wprawdzie w mojej „stajni” urządzeń z rodziny ESP cały czas dominują różne modele ESP8266 (ze sporą przewagą NodeMCU v3 nad innymi, ze względu na świetną płytkę deweloperską, jaką można kupić do tych modułów), to coraz śmielej rozpychają się urządzenia z serii ESP32. Nie tylko dlatego, że ich cena często jest bardzo podobna, przy mocniejszych parametrach i większej liczbie GPIO. Czasem dlatego, że tylko z ESP32 pewne rozwiązania działają. Będą to m.in. takie rozwiązania jak I2S Audio, Bluetooth (BLE), czy bohater tego wpisu, czyli ESP32 Touch Pad.

ESP32 Touch Pad (w ESPHome)

I choć z I2S Audio (Inter-IC Sound) korzystam (do komunikacji głosowej z Home Assistant), tak samo, jak z Bluetooth (do detekcji obecności na podstawie telefonu i opaski, ale na razie wymaga to jeszcze dopracowania), to zdecydowanie najczęściej wykorzystuję właśnie opcję ESP32 Touch Pad, czyli „dotykowe” piny GPIO dostępne w ESP32.

Bo o ile Home Assistant i powiązanymi z nim urządzeniami często steruję z poziomu strony internetowej lub aplikacji mobilnej, to jednak sterowanie za pomocą przycisków w wielu przypadkach jest  najszybsze i najwygodniejsze. I tak jak kiedyś przycisk musiał być faktycznie przyciskiem (lub układem dotykowym podłączonym np. do ESP), to dzięki dotykowym pinom GPIO w ESP32 przyciskiem może być wiele przedmiotów codziennego użytku. Wystarczy podłączyć je do odpowiedniego GPIO w ESP32 i odpowiednio ustawić.

Nie dość, że dzięki temu pozbywamy się mechanicznych elementów związanych z przyciskami, to jeszcze zdecydowanie łatwiej ukryć fakt, że coś jest faktycznie przyciskiem (np. klamka, rama obrazu z odpowiedniego tworzywa). A do tego w przeciwieństwie do przycisków i dotykowych układów do podłączenia, tu wystarczy dosłownie jeden przewód (kabelek), podłączony do GPIO w ESP32. Nie potrzeba nawet masy.

Konfiguracja ESP32 Touch Pad w ESPHome

Z racji tego, że obecnie najczęściej w przypadku układów ESP (ESP8266 i ESP32) korzystam z oprogramowania ESPHome, które dodatkowo sprawia, że taki układ świetnie integruje się z Home Assistant po API, to właśnie na przykładzie ESPHome pokaże, jak prosta jest konfiguracja ESP32 Touch Pad.

By aktywować funkcje dotykowe dla GPIO, wystarczy w kodzie YAML urządzenia dodać:

esp32_touch:

Choć na początek zdecydowanie sensowniej będzie dodać wraz z aktywnym trybem konfiguracyjnym:

esp32_touch:
  setup_mode: true

Dzięki temu w logach urządzenia móc przeanalizować wartości, jakie pojawiają się na danym porcie GPIO bez dotyku i w sytuacji, gdy element jest dotykany. A różnica w tych odczytach (liczbach/wartościach) jest właśnie tym, co będzie potrzebne w kolejnym kroku.

I od razu trzeba zdefiniować odpowiedni „binary sensor”, którego stan będzie monitorowany:

binary_sensor:
  - platform: esp32_touch
    name: "ESP32 Touch01"
    id: esp32_touch01
    pin: GPIO1
    threshold: 1000

W miejsce GPIO1 oczywiście trzeba wybrać pin GPIO, do którego podłączony jest „element dotykowy” (choćby zwykły drucik). I choć nie wszystkie GPIO mogą pełnić funkcje dotykowe, to w większość płytek  ESP32 jest zazwyczaj przynajmniej kilka takich GPIO.

Tu odsyłam do dokumentacji danego układu (diagram z GPIO i ich funkcjami), ale za dokumentacją ESPHome można przyjąć, że:

  • ESP32: GPIO0, GPIO2, GPIO4, GPIO12, GPIO13, GPIO14, GPIO15, GPIO27, GPIO32, GPIO33
  • ESP32-S2 i S3: GPIO1 – GPIO14

Czy całkiem sporo. Zwłaszcza że można tu korzystać nie tylko z takich opcji dostępnych w sensorach binarnych jak on_press, on_release, on_state, on_click, ale z takich jak on_double_click, on_multi_click, dzięki czemu bez problemu z jednego dotykowego elementu (i jednego GPIO) można zrobić nawet kilka wirtualnych sensorów.

Na grafice powyżej, przykład z Home Assistant, gdzie każdy sensor binarny za pomocą opcji „on_multi_click” powiązany jest z 3 wirtualnymi sensorami binarnymi: jedno zwykłe naciśnięcie, dwa zwykłe naciśnięcia i jedno długie naciśnięcie. Więc zamiast 3 sensorów mam 9, a właściwie to 12. A to nie koniec możliwości, bo w razie potrzeby można dodać kolejne opcje…

Threshold, czyli wartość progowa

Gdy już GPIO zdefiniowany, oprogramowanie wgrane, to w logach w ESPHome trzeba teraz określić wartość progową, która rozdziela stan sensora binarnego jako nieaktywny, od aktywny.

I co ważne, najlepiej zrobić to w docelowej konfiguracji sprzętowej, z podłączonym już docelowym elementem dotykowym, najlepiej w docelowym miejscu, bo wiele czynników ma wpływ na to, jakie będą tutaj pojawiać się wartości.

A że najlepiej pokazać to na przykładzie, to fragment z odczytu na szybko przygotowanej platformy na potrzeby artykułu (bo w urządzeniach już pełniących konkretne role, opcję „setup_mode” mam nieaktywną podczas normalnej pracy):

[11:53:34][D][esp32_touch:298]: Touch Pad 'ESPH13 ESP32 Touch01' (T1): 17253
[11:53:34][D][esp32_touch:298]: Touch Pad 'ESPH13 ESP32 Touch01' (T1): 17257
[11:53:34][D][esp32_touch:298]: Touch Pad 'ESPH13 ESP32 Touch01' (T1): 17238
[11:53:35][D][esp32_touch:298]: Touch Pad 'ESPH13 ESP32 Touch01' (T1): 24433
[11:53:35][D][esp32_touch:298]: Touch Pad 'ESPH13 ESP32 Touch01' (T1): 24746
[11:53:35][D][esp32_touch:298]: Touch Pad 'ESPH13 ESP32 Touch01' (T1): 24829
[11:53:36][D][esp32_touch:298]: Touch Pad 'ESPH13 ESP32 Touch01' (T1): 17243
[11:53:37][D][esp32_touch:298]: Touch Pad 'ESPH13 ESP32 Touch01' (T1): 17096
[11:53:37][D][esp32_touch:298]: Touch Pad 'ESPH13 ESP32 Touch01' (T1): 17076

Wartości w okolicach 17 000 są w sytuacji, gdy dotyk nie jest wykrywany. W przypadku wykrywania dotyku wartości są w okolicach 24 000, więc w tym przypadku wartość progową ustawiłbym gdzieś między 18 000 a 23 000, może w okolicach 22 tysięcy. Ale to już należy dobrać eksperymentalnie.

Zaawansowane parametry

W niektórych sytuacjach, np. przy większych elementach dotykowych, czy dłuższych kabelkach, różnice między odczytami mogą być na tyle małe, że potrzebne będzie wzmocnienie sygnału:

esp32_touch:
  low_voltage_reference: 0.5V
  high_voltage_reference: 2.7V
  voltage_attenuation: 0.5V

W przypadku użytego na potrzeby testów dla tego poradnika ESP32 S2 mini np. muszę, np. ustawić dodatkowy parametr, by dotyk był prawidłowo wykrywany:

esp32_touch:
  measurement_duration: 100us

Ogólnie czasem trzeba będzie trochę poeksperymentować. Dlatego odsyłam do dokumentacji…

Nie tylko dotykowe przyciski

Ale zastąpienie przycisków za pomocą ESP32 Touch Pad to tak naprawdę tylko mała część możliwości. Bo skoro mamy tu pojemnościowe wykrywanie zmian, to można to wykorzystać, by zrobić np. prosty czujnik zalania, czy wykrywania poziomu cieczy. Można też na bazie ESP32 Touch Pad zrobić prosty czujnik wilgotności gleby, bo jej wilgotność, też będzie wpływać na odczyty.

U mnie, to nawet widzę, gdy ktoś bierze prysznic, bo mam wrażenie, że szybciej i dokładniej reagują na zmiany wilgotności powietrza takie dotykowe „przyciski”, niż prawdziwe czujniki wilgotności (np. BME280, BME680 czy SHT41).

(!) Zgłoś błąd na stronie
Pomogłem? To może postawisz mi wirtualną kawę?
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Patryk