touch.ino

ESP32-S2 · Fichier : touch.ino · Langage : Arduino · Usage : Utiliser une broche comme touche tactile capacitive

Le S2 possède 14 pads tactiles capacitifs matériels : touchRead() renvoie une valeur qui chute quand un doigt s'approche du fil. Idéal pour des interfaces sans bouton mécanique, même à travers un tissu fin.

Matériel requis

Une carte ESP32-S2 (simple cœur Xtensa, Wi-Fi, USB-OTG natif sur GPIO19/20, 14 touches capacitives) type DevKitC-1 ou QT Py, alimentée par USB. Un fil électrique souple (10-20 cm) ou une pastille de cuivre sur la broche de touche.

Branchement

Fil nu sur GPIO2. Les 14 pads (GPIO1-14) fonctionnent aussi ; éviter les broches flash. Un court fil fait déjà une bonne antenne.

Fonctionnement

Le contrôleur tactile charge/décharge la broche et compare les cycles ; le doigt ajoute sa capacité et fait baisser la valeur lue. On calibre le seuil au repos, puis on filtre par hystérésis temporelle (50 ms). Dans l'Arduino IDE (paquet esp32), choisissez « ESP32S2 Dev Module » ; le S2 se flashe directement par son USB natif (double reset sur certaines cartes pour entrer en bootloader).

Pour aller plus loin

Trois touches = variateur virtuel ; ou matrice 3×3 sous du carton pour un pavé numérique.

touch.ino

// Tactile capacitif natif du S2 : touchRead() sur GPIO1..GPIO4.
// Approcher le doigt d'un fil nu ou d'une plaque de cuivre sur la broche.
const int TOUCH_PIN = 2;
const int SEUIL = 40;        // a calibrer : voir sortie de setup()

unsigned long precedent = 0;
bool touche = false;

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.println("Calibration : ne touchez a rien pendant 3 s");
  delay(3000);
  Serial.printf("Repos ~ %d, touche ~ %d\n", touchRead(TOUCH_PIN), 0);
}

void loop() {
  if (millis() - precedent < 50) return;
  precedent = millis();
  int v = touchRead(TOUCH_PIN);
  bool maintenant = v < SEUIL;      // toucher fait CHUTER la valeur
  if (maintenant != touche) {
    touche = maintenant;
    digitalWrite(LED_BUILTIN, touche ? HIGH : LOW);
    Serial.printf("%s (touch=%d)\n", touche ? "TOUCHE" : "libre", v);
  }
}

← Retour à la fiche