Hydraulik Ventile von Duplomatic


Google-Suche auf MEINE-SCHALTUNG.de :





Online Rechner

Chronik

Dauerkalender


Touchsensoren des ESP32

Reisszwecke

Berührungssensoren kann man zu Testzwecken sehr leicht mithilfe von Reißzwecken konstruieren.

Der ESP32 stellt für diverse Experimente und Projekte zehn interne Touchsensoren zur Verfügung. Diese Touch Pins des Mikrocontrollers reagieren auf Kapazitäten, wie z.B. menschliche Haut, die ebenfalls eine Kapazität darstellt. In dem Fall, dass die ESP32-Lösung zuverlässig arbeitet, kann man auf mechanische Taster und Schalter verzichten. Die Berührungssensoren, das ist ein der Unterschiede zu den mechanischen Schalter, arbeiten prellfrei. Die Funktionalität beruht auf Messung der Kapazität zwischen dem Sensor und der Umgebung. Bei Berührung mit z.B. einem Finger verändert sie sich, kann gemessen und schließlich für Steuerungsvorgänge angewendet werden. Folgende GPIOs können als kapazitive Sensoren genutzt werden:

Touchsensor 0 – GPIO 4
Touchsensor 1 – GPIO 0
Touchsensor 2 – GPIO 2
Touchsensor 3 – GPIO 15
Touchsensor 4 – GPIO 13
Touchsensor 5 – GPIO 12
Touchsensor 6 – GPIO 14
Touchsensor 7 – GPIO 27
Touchsensor 8 – GPIO 33
Touchsensor 9 – GPIO 32


PinoutTouchsensoren

Pinout des ESP32 (Touchsensoren). Auf dem Pinout sind die Touch fähige Pins grün gekenzeichnet.

Beispiel

Die Funktionalität des Touchsystems des ESP32 kann man an einem praktischen Beispiel erläutern. An dem kleinen Experiment nehmen eine RGB-Leuchtiode, drei Widerstände und drei Reißzwecken teil.
Die Reißzwecken stellen unsere Berührungssensoren dar. Sie werden mit drei Leitungen an die GPIOs 12, 13 und 14 angeschlossen. Die drei einzelnen farbigen Dioden der RGB-Leuchtdiode schließen wir an die GPIOs 21, 22 und 23 an. Das vierte Beinchen der LED wird dann mit Masse verbunden. Damit ist die Testschaltung fertig. Der entsprechende Schaltplan sieht dann wie folgt aus:

Der Schaltplan

Schaltplan

Schaltplan

Die Testschaltung

Testschaltung

Testschaltung

Das Programm

// *************************************************************************************
// ESP32
// Touch-Sensoren des ESP32
// ESP32-Dev-KitC V4
// Arduino IDE 1.8.19
// *************************************************************************************
  
  int Touch_Messwert;
  int Touch_LED_Tabelle [3][4] = { 
      { 14, 23, 0, 0 },                    // Touch GPIO, LED GPIO, LOW-HIGH, Status
      { 12, 22, 0, 0 },
      { 13, 21, 0, 0 } };

  // ***********************************************************************************
  void setup() {

      for (int i=0; i<3; i++) {
          pinMode (Touch_LED_Tabelle [i][1], OUTPUT); }
  }

  // ***********************************************************************************
  void loop() {

      for (int i=0; i<3; i++) {
          int Touch_Messwert = touchRead(Touch_LED_Tabelle [i][0]);
          delay(50);
          if ((Touch_Messwert < 15) and (not Touch_LED_Tabelle [i][3])) {
              Touch_LED_Tabelle [i][3] = true;
              Touch_LED_Tabelle [i][2] = !Touch_LED_Tabelle [i][2];
              digitalWrite(Touch_LED_Tabelle [i][1], Touch_LED_Tabelle [i][2]); }
          if ((Touch_Messwert > 20) and (Touch_LED_Tabelle [i][3])) {
              Touch_LED_Tabelle [i][3] = false; }              
      } 
  } 
  // ***********************************************************************************     
  

Die Aufgabe des Programms ist schnell erklärt. Die drei Reißzwecke-Sensoren werden kontinuierlich in einer For-Schleife abgefragt. Sobald eine Finger-Berührung erkannt wird, wird die zugehörige farbige Leuchtdiode der RGB-Leuchtdiode geschaltet. Dabei handelt es sich um eine UM-Funktion. War die LED AUS, wird sie eingeschaltet. War sie AN, wird sie abgeschaltet. Auf diese Weise kann man der RGB-Leuchtdiode manuell sieben Farbtöne verpassen.
Das Auslesen eines Berührungssensors gestaltet sich recht unkompliziert. Hierzu wird die Funktion touchRead() verwendet, die als Parameter lediglich die GPIO-Nummer erwartet.
Der ausgelesene Wert wird in der Variable Touch_Messwert gespeichert. Anschließend erfolgt die Prüfung, ob Touch_Messwert über oder unter der eingestellten Schaltschwelle liegt. Wird der festgelegte Schwellenwert (hier 15) unterschritten, erfolgt ein Schaltvorgang.
Um das Schalten zu koordinieren, wurde die Touch_LED_Tabelle eingeführt. Sie besteht aus drei Feldern, die sich auf unsere drei LEDs der RGB-LED beziehen. In jedem Feld befinden sich vier Elemente:

int Touch_LED_Tabelle [3][4] = {
{ 14, 23, 0, 0 },
{ 12, 22, 0, 0 },
{ 13, 21, 0, 0 } };

Das erste Element in einem Feld ist die GPIO-Nummer des Touchsensors, der auf Berührung untersucht wird. Das zweite Element ist die GPIO-Nummer des Ausgangs, an dem die entsprechende farbige LED angeschlossen ist. Die beiden Elemente verändern im Laufe des Programms ihre Werte nicht. Das dritte Element wird im Laufe des Programms verändert. Es steht für LOW oder HIGH des zugehörigen Ausgangs. Das Element entscheidet, ob der Ausgang ein- bzw. ausgeschaltet wird. Das vierte und letzte Element steht für den aktuellen Status des Ausgangs. Sein Wert wird ebenfalls verändert und wird als ein Hilfsmerker verwendet.

Damit die Komposition aus Hard- und Software zufriedenstellend funktioniert, muss der Schwellenwert gefunden und richtig eingestellt werden. Dazu ergänzt man das Programm um serielle Ausgabe und lässt sich die Ergebnisse, indem man die Sensoren abwechselnd berührt, auf dem seriellen Monitor anzeigen.
Das Programm würde dann wie folgt aussehen:

// *************************************************************************************
// ESP32 (serielle Ausgabe)
// Touch-Sensoren des ESP32
// ESP32-Dev-KitC V4
// Arduino IDE 1.8.19
// *************************************************************************************
    
  int Touch_Messwert;
  int Touch_LED_Tabelle [3][4] = { 
      { 14, 23, 0, 0 },                    // Touch GPIO, LED GPIO, LOW-HIGH, Status
      { 12, 22, 0, 0 },
      { 13, 21, 0, 0 } };

  // ***********************************************************************************
  void setup() {

      for (int i=0; i<3; i++) {
          pinMode (Touch_LED_Tabelle [i][1], OUTPUT); }
      Serial.begin (57600);
  }

  // ***********************************************************************************
  void loop() {

      for (int i=0; i<3; i++) {
          int Touch_Messwert = touchRead(Touch_LED_Tabelle [i][0]);
          Serial.print("Aktuelle Messung Touchsensor GPIO: ");
          Serial.print(Touch_LED_Tabelle [i][0]);
          Serial.print(" Messergebnis: ");
          Serial.println(Touch_Messwert);
          delay(50);
          if ((Touch_Messwert < 15) and (not Touch_LED_Tabelle [i][3])) {
              Serial.println("Betätigt");
              Touch_LED_Tabelle [i][3] = true;
              Touch_LED_Tabelle [i][2] = !Touch_LED_Tabelle [i][2];
              digitalWrite(Touch_LED_Tabelle [i][1], Touch_LED_Tabelle [i][2]); }
          if ((Touch_Messwert > 20) and (Touch_LED_Tabelle [i][3])) {
              Touch_LED_Tabelle [i][3] = false; }              
      } 
  } 
  // ***********************************************************************************    
  


Ergebnisse

Ergebnisse

Ergebnisse auf dem seriellen Monitor

In diesem Fall erreichen die maximale Werte (Sensor nicht betätigt) die Werte bis 60. Beim Betätigen eines Sensors fallen die Werte bis auf 10. Um unerwünschte Werte, die gelegentlich auftreten, auszuschließen, erschien hier die Schwelle bei 15 als sinnvoll. Um gewisse Hysterese einzuführen, wurde in dem Beispiel die Schwelle für „nicht betätigt“ auf 20 eingestellt. Man kann die Ergebnisse auch auf dem seriellen Plotter betrachten:

Messergebnisse auf dem seriellen Plotter

Messergebnisse auf dem seriellen Plotter


Kurzvideo

Kurzvideo


Weitere Themen:



Google-Suche auf MEINE-SCHALTUNG.de :


Home Impressum Datenschutz