ESP32: Beide I²C-Schnittstellen verwenden

Hallo und willkommen zum heutigen Blog-Beitrag.

 

Vor einiger Zeit habe ich Ihnen gezeigt wie Sie mehrere I²C Geräte an einem Mikrocontroller betreiben können.

Ein Kunde hat heute angefragt ob bzw. wie er 2 Module mit identischer I²C-Adresse an einen ESP8266 betreiben kann.

Mir ist als Lösung nur die Verwendung von einem Mikrocontroller mit 2 I²C Bussen eingefallen, wie z.B. der ESP32.

Wer jedoch schon mal versucht hat dies in einem Projekt umzusetzen, scheitert in der Regel schon am I²C-Scanner-Beispiel.

Daher habe Ich mir heute einen ESP32 und ein Paar I²C-Module geschnappt, und präsentiere Ihnen einen Funktionsfähigen I²C Scanner für beide Busse.

 

1. Der Aufbau

Für Die Umsetzung benötigen wir folgendes Material:

Der Aufbau sieht verwirrend aus, ist eigentlich ganz einfach:

Jedes I²C Modul verfügt über 4 Pins. Davon sind 2 Immer für GND und VCC. Diese verbinden wir mit GND und 3V3 auf dem ESP32.

Des Weiteren verfügt jedes Modul über ein SCL/SCK und einen SDA Pin.

Ich verbinde die SDA Pins von je einem OLED und einem Sensor mit G21 und die jeweiligen SCL Pins mit G22.

Für den zweiten I²C-Bus verbinden die die SDA Pins der beiden Module mit G17 und die SCL/SCK Pins mit G16.

ESP-32

OLED 1,3 Zoll

OLED 0,96 Zoll

BME-280

BMP-180

GND

GND

GND

GND

GND

3V3

VDD

VCC

VIN

VIN

21

 

SDA

SDA

 

22

 

SCL

SCL

 

17

SDA

 

 

SDA

16

SCK

 

 

SCL

 

ESP-32 in Breadboards mit 4 Modulen

 

2. Die Programmierung

Um zu überprüfen welches Modul unter welcher Adresse erreichbar ist, haben wir in der Vergangenheit den I²C-Scanner oder I²C-Detect verwendet. Dieser funktioniert jedoch mit dem ESP32 nicht, und unterstützt den zweiten I²C-Bus nicht.

Bei der Google-Suche findet man schnell den i2cscanner von nkolban auf GitHub. Dieser lässt sich jedoch nicht kompilieren.

Fündig geworden bin ich auf https://github.com/espressif/arduino-esp32/issues/977 – hier gibt es einen I²C Scanner der sogar beide I²C Schnittstellen abfragt. Er benutzt lediglich die Wire.h-Bibliothek, und kann somit problemlos in bestehende Projekte eingebunden werden.

Ich habe die Pins angepasst damit Sie mit meiner Schaltung funktionierten. Hier nun der leicht modifizierte Sketch:

 

 

/* I2C slave Address Scanner
Kutscher07: Modified for TTGO TQ board with builtin OLED
Quelle: https://github.com/espressif/arduino-esp32/issues/977
*/

#include <Wire.h>

#define SDA1 21
#define SCL1 22

#define SDA2 17
#define SCL2 16

TwoWire I2Cone = TwoWire(0);
TwoWire I2Ctwo = TwoWire(1);

void scan1(){
Serial.println("Scanning I2C Addresses Channel 1");
uint8_t cnt=0;
for(uint8_t i=0;i<128;i++){
  I2Cone.beginTransmission(i);
  uint8_t ec=I2Cone.endTransmission(true);
  if(ec==0){
    if(i<16)Serial.print('0');
    Serial.print(i,HEX);
    cnt++;
  }
  else Serial.print("..");
  Serial.print(' ');
  if ((i&0x0f)==0x0f)Serial.println();
  }
Serial.print("Scan Completed, ");
Serial.print(cnt);
Serial.println(" I2C Devices found.");
}

void scan2(){
Serial.println("Scanning I2C Addresses Channel 2");
uint8_t cnt=0;
for(uint8_t i=0;i<128;i++){
  I2Ctwo.beginTransmission(i);
  uint8_t ec=I2Ctwo.endTransmission(true);
  if(ec==0){
    if(i<16)Serial.print('0');
    Serial.print(i,HEX);
    cnt++;
  }
  else Serial.print("..");
  Serial.print(' ');
  if ((i&0x0f)==0x0f)Serial.println();
  }
Serial.print("Scan Completed, ");
Serial.print(cnt);
Serial.println(" I2C Devices found.");
}

void setup(){
Serial.begin(115200);
I2Cone.begin(SDA1,SCL1,400000); // SDA pin 21, SCL pin 22 TTGO TQ
I2Ctwo.begin(SDA2,SCL2,400000); // SDA2 pin 17, SCL2 pin 16 
}

void loop(){
scan1();
Serial.println();
delay(100);
scan2();
Serial.println();
delay(5000);
} 

 

3. Der Test

Nachdem wir den Sketch kompiliert und auf unseren ESP32 hochgeladen haben, sind wir eigentlich schon fertig. Um das Ergebnis zu sehen öffnen wir den Seriellen Monitor, stellen die Geschwindigkeit auf 115200 baud ein, und wir bekommen die Adressen aller 4 Module angezeigt:

Zwei der Module haben die Adresse 3C, und die Displays haben jeweils 76 und 77. 

Damit sollten auch Projekte mit 4 BME 280 an einem Mikrocontroller in der Zukunft kein Hindernis mehr darstellen.

 

Wir wünschen viel Spaß beim nachbauen, und sind gespannt wie viele OLED Displays Sie an einem ESP32 zum laufen bekommen.

 

Schreiben Sie doch in den Kommentaren wie viele Module Sie persönlich gleichzeitig an einem I²C-Bus betrieben haben.

 

Damit verabschiede ich mich für heute, und hoffe dass Sie auch morgen wieder vorbeischauen.

Ihr Markus Neumann

Letzter Artikel Kleine Helfer im Bastleralltag
Neuer Artikel Netzwerküberwachung: Wlan-Sicherheit

Kommentar

OlegR - September 14, 2018

[quote]
Zwei der Module haben die Adresse 3C, und die Displays haben jeweils 76 und 77
[/quote]
Are you sure? Die Displays haben Addresse 3C und die Sensoren jeweils 76 & 77 ;-)

Peter Derf - September 14, 2018

Sehr schöne Lösung. Hat man jedoch nur digitale Anschlüsse für einen I2C Bus, dann funktioniert auch ein I2C Multiplexer sehr gut, um viele Sensoren mit gleicher Adresse anzuschließen, Bei Bedarf kann man diese auch kaskadieren kann. Beispiel TCA9548A von TI.
P.D.

Günther Ehrenberger - September 14, 2018

Hallo,
Echt super die Projekte, komme gar nicht nach alles auszuprobieren. Habe ein OLED und den BME280 an einem Micro:Bit auf i2c angeschlossen. Temperatur und Luftdruck hat einmal was gescheites angezeigt. Beim nächsten Mal wurde nur Mist angezeigt. Wie zuverlässig ist der BME280? Sonst liegt es an der Bibliothek vom Micro:Bit.
Danke. mfg Günther

Bernd J. - September 13, 2018

Superklasse,
gestern habe ich die Frage nach vier BME280 Sensoren an einem I2C Bus gestellt und heute gibt es schon ein Projekt im Blog, welches meine Frage beantwortet.
Danke
Bernd

Hinterlasse einen Kommentar

Kommentare müssen vor der Veröffentlichung überprüft werden

Erforderliche Angabe