MPR121

Überblick

In dieser Lektion lernen Sie, wie man MPR121 verwendet. Es ist eine gute Wahl, wenn Sie viele Berührungsschalter zu Ihrem Projekt hinzufügen möchten. Die Elektrode des MPR121 kann mit einem Leiter verlängert werden. Wenn Sie einen Draht an eine Banane anschließen, können Sie die Banane in einen Berührungsschalter verwandeln und so Projekte wie ein Fruchtpiano realisieren.

Benötigte Komponenten

Für dieses Projekt benötigen wir die folgenden Komponenten.

Es ist definitiv praktisch, ein ganzes Set zu kaufen, hier ist der Link:

Name

ARTIKEL IN DIESEM KIT

LINK

Elite Explorer Kit

300+

Elite Explorer Kit

Sie können sie auch einzeln über die untenstehenden Links kaufen.

KOMPONENTENBESCHREIBUNG

KAUF-LINK

Arduino Uno R4 WiFi

-

Steckbrett

BUY

Jumperkabel

BUY

MPR121

-

Verdrahtung

In diesem Beispiel setzen wir MPR121 in das Breadboard ein. Verbinden Sie GND von MPR121 mit GND, 3.3V mit 3V3, IRQ mit dem digitalen Pin 2, SCL mit dem Pin SCL(A5) und SDA mit dem Pin SDA(A4). Es gibt 12 Elektroden für die Berührungserkennung.

Bemerkung

MPR121 wird mit 3.3V betrieben, nicht mit 5V.

../_images/23-mpr121_bb.png

Schaltplan

../_images/23_mpr121_schematic.png

Code

Bemerkung

  • Sie können die Datei 23-mpr121.ino direkt im Pfad elite-explorer-kit-main\basic_project\23-mpr121 öffnen.

  • Hier wird die Adafruit MPR121 Bibliothek verwendet, die Sie über den Library Manager installieren können.

    ../_images/22_mpr121_lib.png

Nachdem der Code auf das UNO-Board hochgeladen wurde, wird der Berührungszustand der MPR121-Pins „1“ und „0“ in einem 12-Bit-Boolean-Array erfasst. Dieses Array wird dann auf dem seriellen Monitor ausgegeben.

Code-Analyse

Dieser Code ermöglicht die Kommunikation und Bedienung des MPR121-Berührungssensors. Er kann den Status von Berührungselektroden erkennen und Informationen über berührte oder freigegebene Elektroden auf der seriellen Schnittstelle ausgeben. Wenn detaillierte Sensordaten erforderlich sind, kann der entsprechende Code auskommentiert werden.

Hier eine Analyse des Codes:

  1. Bibliotheken importieren:

    #include <Wire.h>
    #include "Adafruit_MPR121.h"
    
    • Wire.h: Wird für die I2C-Kommunikation verwendet.

    • Adafruit_MPR121.h: Adafruits MPR121-Bibliothek zur Bedienung des MPR121-Berührungssensors.

  2. Die Makro _BV definieren:

    #ifndef _BV
    #define _BV(bit) (1 << (bit))
    #endif
    

    _BV(bit) definiert ein Makro, das einen gegebenen Bit in den entsprechenden Binärwert umwandelt, ähnlich wie 1 << bit.

  3. Instanz der Klasse Adafruit_MPR121 initialisieren:

    Adafruit_MPR121 cap = Adafruit_MPR121();
    

    Erstellen Sie eine Instanz der Klasse Adafruit_MPR121 namens cap. Das Objekt cap wird verwendet, um mit dem MPR121-Berührungssensor zu kommunizieren und ihn zu bedienen.

  4. Funktion setup():

    Initialisieren Sie die serielle Kommunikation mit einer Baudrate von 9600. Dann initialisieren Sie den MPR121-Berührungssensor mit der Standard-I2C-Adresse 0x5A. Falls die Initialisierung fehlschlägt, geben Sie eine Fehlermeldung aus und treten Sie in eine Endlosschleife ein.

    void setup() {
        Serial.begin(9600);
    
        while (!Serial) { // needed to keep leonardo/micro from starting too fast!
            delay(10);
        }
    
        Serial.println("Adafruit MPR121 Capacitive Touch sensor test");
    
        // Default address is 0x5A, if tied to 3.3V its 0x5B
        // If tied to SDA its 0x5C and if SCL then 0x5D
        if (!cap.begin(0x5A)) {
            Serial.println("MPR121 not found, check wiring?");
            while (1);
        }
        Serial.println("MPR121 found!");
    }
    
  5. Funktion loop():

    • Ermitteln Sie den aktuellen Berührungsstatus, der als 16-Bit-Integer zurückgegeben wird.

      currtouched = cap.touched();
      
    • Durchlaufen Sie den Status der 12 Elektroden (nummeriert von 0 bis 11).

      for (uint8_t i=0; i<12; i++) {
          // it if *is* touched and *wasnt* touched before, alert!
          if ((currtouched & _BV(i)) && !(lasttouched & _BV(i)) ) {
              Serial.print(i); Serial.println(" touched");
          }
          // if it *was* touched and now *isnt*, alert!
          if (!(currtouched & _BV(i)) && (lasttouched & _BV(i)) ) {
              Serial.print(i); Serial.println(" released");
          }
      }
      
      • Wenn eine Elektrode berührt wird und vorher nicht berührt wurde, drucken Sie „x berührt“, wobei x die Nummer der Elektrode ist.

      • Wenn eine Elektrode vorher berührt wurde, aber jetzt nicht mehr berührt wird, drucken Sie „x freigegeben“.

    • Aktualisieren Sie lasttouched, um den aktuellen Berührungsstatus für den Vergleich in der nächsten Iteration zu speichern.

      lasttouched = currtouched;
      
    • Debugging-Informationen (Optional):

      // debugging info, what
      Serial.print("\t\t\t\t\t\t\t\t\t\t\t\t\t 0x"); Serial.println(cap.touched(), HEX);
      Serial.print("Filt: ");
      for (uint8_t i=0; i<12; i++) {
          Serial.print(cap.filteredData(i)); Serial.print("\t");
      }
      Serial.println();
      Serial.print("Base: ");
      for (uint8_t i=0; i<12; i++) {
          Serial.print(cap.baselineData(i)); Serial.print("\t");
      }
      Serial.println();
      
      // put a delay so it isn't overwhelming
      delay(100);