Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
ESP32 I2C Bus Interface
Der ESP32 unterstützt die I2C-Kommunikation über seine zwei I2C-Busschnittstellen, die je nach Konfiguration des Benutzers als I2C-Master oder -Slave dienen können. Entsprechend dem ESP32-Datenblatt unterstützen die I2C-Schnittstellen des ESP32:
- Standardmodus (100 Kbit / s)
- Schneller Modus (400 Kbit / s)
- Bis zu 5 MHz, jedoch eingeschränkt durch die SDA-Pull-up-Stärke
- 7-Bit / 10-Bit Adressierungsmodus
- Dualer Adressierungsmodus. Benutzer können Befehlsregister zur Steuerung von I²C-Schnittstellen programmieren, um mehr Flexibilität zu erhalten
Das I2C-Kommunikationsprotokoll verwendet zwei Drähte, um Informationen auszutauschen. Eine wird für das Taktsignal (SCL) und die andere zum Senden und Empfangen von Daten (SDA) verwendet. Die SDA- und SCL-Leitungen sind aktiv low, daher sollten sie mit Widerständen hochgezogen werden, die aber meist schon eingebaut sind. Die Default- Pin sind wie folgt, wobei auch andere Pins verwendet werden können:
I2C Sensor | ESP32 |
SDA | SDA (default is GPIO 21) |
SCL | SCL (default is GPIO 22) |
GND | GND |
VCC | 3.3V oder 5V |
Bei der I2C-Kommunikation verfügt jeder Slave am Bus über eine eigene Adresse, mit der der ESP32 mit jedem Gerät kommunizieren kann. Die I2C-Adresse finden man im Datenblatt der Komponente. Wenn es jedoch schwierig ist, dies herauszufinden kann mit dem folgenden I2C-Scanner die I2C-Adresse herausgefunden werden:
I2C-Scanner.ino
#include <Wire.h> void setup() { Wire.begin(); Serial.begin(115200); Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ) { Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address<16) { Serial.print("0"); } Serial.println(address,HEX); nDevices++; } else if (error==4) { Serial.print("Unknow error at address 0x"); if (address<16) { Serial.print("0"); } Serial.println(address,HEX); } } if (nDevices == 0) { Serial.println("No I2C devices found\n"); } else { Serial.println("done\n"); } delay(5000); }
Folgendes wird auf der seriellen Schnittstelle (Arduino-IDE->Tools->Serial Monitor; Ctrl+Shift+M) angezeigt: