ESP32: use ambas interfaces I²C

Hola y bienvenidos a la publicación del blog de hoy.

 

Hace algún tiempo le mostré cómo puede operar varios dispositivos I²C en un microcontrolador.

Un cliente preguntó hoy si o cómo puede operar 2 módulos con una dirección I²C idéntica en un ESP8266.

La única solución que se me ocurre es el uso de un microcontrolador con 2 buses I²C, p. El ESP32.

Sin embargo, cualquiera que haya intentado implementar esto en un proyecto generalmente falla con el ejemplo del escáner I²C.

Así que hoy tomé un ESP32 y un par de módulos I²C y les presento un escáner I²C funcional para ambos buses.

 

1. La estructura

Para la implementación necesitamos el siguiente material:

La estructura parece confusa, en realidad es bastante simple:

Cada módulo I²C tiene 4 pines. 2 de los cuales son siempre para GND y VCC. Los conectamos a GND y 3V3 en el ESP32.

Además, cada módulo tiene un SCL / SCK y un pin SDA.

Conecto los pines SDA de un OLED y un sensor a G21 y los pines SCL respectivos a G22.

Para el segundo bus I²C, conecte los pines SDA de los dos módulos a G17 y los pines SCL / SCK a G16.

ESP-32

OLED 1.3 pulgadas

OLED 0.96 pulgadas

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 en placas de prueba con 4 módulos

 

2. La programación

En el pasado, utilizamos el escáner I²C o la detección I²C para verificar qué módulo se puede alcanzar en qué dirección. Sin embargo, esto no funciona con el ESP32 y no es compatible con el segundo bus I²C.

Con la búsqueda de Google, puede encontrar rápidamente el i2cscanner de nkolban en GitHub. Sin embargo, esto no se puede compilar.

Encontré lo que estaba buscando https://github.com/espressif/arduino-esp32/issues/977  - Aquí hay un escáner I²C que incluso consulta ambas interfaces I²C. Solo utiliza la biblioteca Wire.h y, por lo tanto, puede integrarse fácilmente en proyectos existentes.

Ajusté los pines para que funcionaran con mi circuito. Aquí está el boceto ligeramente modificado:

 

 

/ * Escáner de direcciones esclavo I2C
Kutscher07: modificado para la placa TTGO TQ con OLED incorporado
Fuente: https://github.com/espressif/arduino-esp32/issues/977
*/

#include <Alambre.h>

#definir SDA1 21
#definir SCL1 22

#definir SDA2 17
#definir SCL2 16

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

nulo scan1(){
De serie.println("Escaneo de direcciones I2C Canal 1");
uint8_t cnt=0;
para(uint8_t yo=0;yo<128;yo++){   I2Cone.beginTransmission(yo);   uint8_t ec=I2Cone.endTransmission(cierto);   si(ec==0){     si(yo<16)De serie.imprimir('0');     De serie.imprimir(yo,Hexadecimal);     cnt++;   }   otra cosa De serie.imprimir("..");   De serie.imprimir(' ');   si ((yo&0x0f)==0x0f)De serie.println();   }
De serie.imprimir("Escaneo completado");
De serie.imprimir(cnt);
De serie.println("Dispositivos I2C encontrados".);
}

nulo scan2(){
De serie.println("Escaneo de direcciones I2C Canal 2");
uint8_t cnt=0;
para(uint8_t yo=0;yo<128;yo++){   I2Ctwo.beginTransmission(yo);   uint8_t ec=I2Ctwo.endTransmission(cierto);   si(ec==0){     si(yo<16)De serie.imprimir('0');     De serie.imprimir(yo,Hexadecimal);     cnt++;   }   otra cosa De serie.imprimir("..");   De serie.imprimir(' ');   si ((yo&0x0f)==0x0f)De serie.println();   }
De serie.imprimir("Escaneo completado");
De serie.imprimir(cnt);
De serie.println("Dispositivos I2C encontrados".);
}

nulo configuración(){
De serie.comenzar(115200);
I2Cone.comenzar(SDA1,SCL1,400000); // SDA pin 21, SCL pin 22 TTGO TQ
I2Ctwo.comenzar(SDA2,SCL2,400000); // SDA2 pin 17, SCL2 pin 16 
}

nulo bucle(){
scan1();
De serie.println();
retrasar(100);
scan2();
De serie.println();
retrasar(5000);
}  

 

3. La prueba

Después de compilar el boceto y subirlo a nuestro ESP32, ya hemos terminado. Para ver el resultado, abrimos el monitor en serie, establecemos la velocidad en 115200 baudios y obtenemos las direcciones de los 4 módulos:

Dos de los módulos tienen la dirección 3C y las pantallas tienen 76 y 77, respectivamente.

Los proyectos con 4 BME 280 en un microcontrolador ya no deberían ser un obstáculo en el futuro.

 

Le deseamos mucha diversión al construirlo, y tenemos curiosidad por ver cuántas pantallas OLED puede obtener en un ESP32.

 

Escriba en los comentarios cuántos módulos usted operó personalmente en un bus I²C al mismo tiempo.

 

Me despido de hoy y espero que vuelvas mañana.

Tuyo Markus Neumann

MuestraEsp-32Proyectos para principiantes

18 comentarios

Martin

Martin

Guten Tag, woran könnte es liegen wenn ich zB. einen BME280 oder SHT21 an einem ESP8266 oder Arduino anschließe bekomme ich dieselben Werte, schließe ich die Sensoren an einem ESP32 an bekomme ich Temperaturwerte die 2-3 Grad höher sind (gleicher Sketch) ????

Mit Dank im voraus
Martin

Michael D.

Michael D.

Habe den BME280 am ESP32, hat sofort auf Anhieb funktioniert! Danke!!!

AnFi

AnFi

Funktioniert auf Anhieb mit ESP32 Heltec.
Ich habe 2 unabhängige OLED’s (OnBoard an SDA 4/SCL 15 und separate OLED an SDA 21/ SCL 22) angeschlossen: beide werden erkannt (jeweils 0×3C).
Vielen Dank für die gute Beschreibung!
AnFi

Fabian

Fabian

Hallo zusammen,

zuerst einmal, vielen Dank für die Bereitstellung der Infos :D
Kann man auch mit zwei ESP32 über I2C kommunizieren. Wie würde es hier aussehen bezüglich Master und Slave bzw. gibt es hier Beispiele.
Vielen Dank im Voraus

Martin

Martin

Das Scanprogramm funktioniert. Ich habe zwei kleine OLED-Displays dran, eines an den pins 21,22 das zweite an 17,16 und möchte die u8g2-Lib benutzen. Wie mach ich das, dass er auch auf das zweite display schreibt ?
Ich steh da auf dem Schlauch…

VG Martin

Ralf

Ralf

Hallo Rene
….Ich verwende eine Nodemcu 12E klingt doch sehr nach ESP8266. Dieser Sketch hier ist für den Nachfolger den ESP32

Martin

Martin

Copy/Paste in die Arduino IDE führt zu Fehler: “stray ‘/302’ in program error” when compiling
Das liegt an non-ASCII characters
Lösung: Den code vorm einfügen in die IDE noch durch dieses Tool jagen:
https://pteo.paranoiaworks.mobi/diacriticsremover/

Rene Weißflog

Rene Weißflog

Wollte den Scannertest auf meinem Nodeemcu Board laufen lassen aber Ide stößt sich immer an den Wort TwoWire. Was mache ich falsch oder wo liegt der Fehler. Ich verwende eine Nodemcu 12E mit einem BMP 180 dran. Ich habe schon ein Projekt laufen mit einen DHT22 Sensor das läuft absolut einwandfrei. Auf dem Bord wurde ein Kernel mit I2C, DHT22, Onwire, Http, u. a. Modulen geflasht. Insgesamt sind 18 Module auf dem Bord für meine zukünftigen Projekte, so das ich vom Kernel her flexibel bin. Aber den I2C Bus habe ich auf dem Node noch nicht zum laufen bekommen. Auf dem Raspi war das alles kein Problem. Ich hoffe mir kann da jemand weiterhelfen, wo mein evtl. Denkfehler liegt.

Hans-Georg B.

Hans-Georg B.

Klasse!
Mir war unklar, wo man bei ESP32-CAM die I2C-Schnittstelle verwenden kann. Auf den “microSD-Card Reader” habe ich verzichtet und den PIN GPIO14 für SCL und GPIO15 für SDA verwendet. Der angeschlossene Kompass hatte mit dem Scanner die Adresse 0×0D

Klaus

Klaus

Danke für deinen Beitrag.
Zitat: “Mir ist als Lösung nur die Verwendung von einem Mikrocontroller mit 2 I²C Bussen eingefallen, wie z.B. der ESP32.”

Wer kein ESP32 mit 2x I²C Schnittstellen verwendet, kann einen I²C Multiplexer wie z.B. TCA9548A verwenden. Über die I²C-Kommunikation mit dem Multiplexer wird jeweils ein einzelner I²C-BUS durchgeschaltet (Re-route) und alle anderen sind während dieser Zeit hochohmig. So können z.B. mit einem TCA9584A hintereinander bis zu 8 Sensoren mit identischer I²C-Adresse abgefragt werden.

Immanuel Schade

Immanuel Schade

Eine Frage, gibt es da irgendwo ein Beispiel wie man danach den BME280 einbindet und auslesen kann um danach weiterarbeiten zu können.

Sorry für die Frage aber ich stehe noch ganz am Anfang.

Danke Immanuel

Jürgen Walter

Jürgen Walter

Das Programm funktioniert sehr gut.

ABER: Wird das Programm einfach kopiert erscheinen erweiterte ASCII Zeichen, welche zunächst entfernt werden müssen. UTF-8 + Arduino

Otmar

Otmar

Hallo Reinhard,

aufgrund deines Posts hab ich mir das IC mal genauer angesehen. Da werd ich mal welche bestellen.
Hast du berücksichtigt, dass Bit0 der Adresse den R/W-Modus definiert?
Der muss natürlich passend gesetzt sein.

Gruß,
Otmar

Reinhard

Reinhard

Hallo.
Vielleicht kann mir jemand helfen:
Habe den Scan erfolgreich laufen.
Es werden 4 Adressen gefunden: 0×38, 0×39, 0×3A sowie 0×3B
Es sind 4 Stk PCF8574AN IO Expander.

Nun gelingt es mir nur nicht die IOs einzulesen.
Egal was ich mache, es werden immer alle Eingänge als 0 gelesen (sind tatsächlich High)
Wenn ich einen Eingang auf GND ziehe bleibt ebenso alles bei 0.

Vielen Dank schon mal für Eure Tipps!
LG
Reinhard

OlegR

OlegR

[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

Peter Derf

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

Günther Ehrenberger

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.

Bernd J.

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

Deja un comentario

Todos los comentarios son moderados antes de ser publicados

Artículos de blog

  1. Ahora instalamos el esp32 a través de la administración.
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. Transporte Aéreo - programación de ESP mediante redes locales inalámbricas