Hallo en welkom bij de blog van vandaag post.
Enige tijd geleden liet ik je zien hoe je verschillende I2C-apparaten te bedienen op een microcontroller.
Een klant heeft vandaag gevraagd of of hoe ze 2 modules met hetzelfde I2C-adres kunnen bedienen op een ESP8266.
De enige oplossing die ik dacht was het gebruik van een microcontroller met 2 I2C bussen, zoals de ESP32.
Echter, degenen die hebben geprobeerd om dit te implementeren in een project meestal al niet met de I2C scanner voorbeeld.
Daarom pakte ik vandaag een ESP32 en een paar I2C modules en presenteerde ik u een functionele I2C-scanner voor beide bussen.
1.
Voor de implementatie hebben we het volgende materiaal nodig:
- 1x NodeMCU ESP32 Dev Module
- 1x Broodbordset(Vanwege de breedte van de ESP32 module neem ik 2 breadboards)
- 4x I2C Modules (ik neem 2 OLED's van onze Weergavebereik evenals een BME280 en een BMP180)
- 16 Jumperkabel
De structuur ziet er verwarrend uit, is eigenlijk heel eenvoudig:
Elke I2C module heeft 4 pinnen. Hiervan zijn er 2 altijd voor GND en VCC. Deze sluiten we aan op GND en 3V3 op de ESP32.
Daarnaast heeft elke module een SCL/SCK en een SDA pin.
Ik sluit de SDA pinnen van elke OLED en een sensor met G21 en de respectieve SCL pinnen met G22.
Voor de tweede I2C-bus verbinden ze de SDA-pinnen van de twee modules met G17 en de SCL/SCK-pinnen op G16.
ESP-32 |
OLED 1,3 inch |
OLED 0,96 inch |
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 |
2. Programmering
Om te controleren welke module op welk adres toegankelijk is, hebben we in het verleden de I2C scanner of I2C-Detect gebruikt. Dit werkt echter niet met de ESP32 en ondersteunt de tweede I2C-bus niet.
Google zoekt snel de i2cscanner van Nkolban op GitHub. Dit kan echter niet worden gecompileerd.
Ik heb het gevonden op https://github.com/espressif/arduino-esp32/issues/977 - hier is er een I2C scanner die zelfs query's beide I2C interfaces. Het maakt alleen gebruik van de Wire.h bibliotheek, en kan daarom gemakkelijk worden geïntegreerd in bestaande projecten.
Ik heb de pinnen aangepast om je met mijn circuit te laten werken. Hier is de licht gewijzigde Schets:
/* I2C slave Adres Scanner Kutscher07: Gewijzigd voor TTGO TQ board met ingebouwde OLED Bron: https://github.com/espressif/arduino-esp32/issues/977 */ #include <Draad.H> #define SDA1 SDA1 21 #define SCL1 22 #define SDA2 SDA2 17 #define SCL2 16 TwoWire (TwoWire) I2Cone I2Cone = TwoWire (TwoWire)(0); TwoWire (TwoWire) I2Ctwo I2Ctwo = TwoWire (TwoWire)(1); Void scan1(){ Seriële.println("Scannen I2C Adressen Kanaal 1"); uint8_t Cnt=0; Voor(uint8_t I.=0;I.<128;I.++){ I2Cone I2Cone.beginTransmissie(I.); uint8_t Eg=I2Cone I2Cone.eindTransmissie(Waar); Als(Eg==0){ Als(I.<16)Seriële.Afdrukken('0'); Seriële.Afdrukken(I.,Hex); Cnt++; } Anders Seriële.Afdrukken(".."); Seriële.Afdrukken(' '); Als ((I.&0x0f)==0x0f)Seriële.println(); } Seriële.Afdrukken("Scan voltooid, "); Seriële.Afdrukken(Cnt); Seriële.println("I2C Devices gevonden."); } Void scan2(){ Seriële.println("Scannen I2C Adressen Kanaal 2"); uint8_t Cnt=0; Voor(uint8_t I.=0;I.<128;I.++){ I2Ctwo I2Ctwo.beginTransmissie(I.); uint8_t Eg=I2Ctwo I2Ctwo.eindTransmissie(Waar); Als(Eg==0){ Als(I.<16)Seriële.Afdrukken('0'); Seriële.Afdrukken(I.,Hex); Cnt++; } Anders Seriële.Afdrukken(".."); Seriële.Afdrukken(' '); Als ((I.&0x0f)==0x0f)Seriële.println(); } Seriële.Afdrukken("Scan voltooid, "); Seriële.Afdrukken(Cnt); Seriële.println("I2C Devices gevonden."); } Void Setup(){ Seriële.Beginnen(115200); I2Cone I2Cone.Beginnen(SDA1 SDA1,SCL1,400000); SDA pin 21, SCL pin 22 TTGO TQ I2Ctwo I2Ctwo.Beginnen(SDA2 SDA2,SCL2,400000); SDA2 pin 17, SCL2 pin 16 } Void Lus(){ scan1(); Seriële.println(); Vertraging(100); scan2(); Seriële.println(); Vertraging(5000); }
3.
Nadat we de schets hebben gecompileerd en geüpload naar onze ESP32, zijn we eigenlijk klaar. Om het resultaat te zien openen we de seriële monitor, stellen we de snelheid in op 115200 baud en krijgen we de adressen van alle 4 modules weergegeven:
Twee van de modules hebben het adres 3C, en de displays hebben elk 76 en 77 respectievelijk.
Projecten met 4 BME 280 op een microcontroller mogen daarom in de toekomst geen belemmering meer vormen.
We wensen u veel plezier bij de wederopbouw en zijn benieuwd hoeveel OLED-schermen u op een ESP32 draaien.
Schrijf in de comments hoeveel modules je persoonlijk opereerde op een I2C-bus op hetzelfde moment.
Ik neem vandaag afscheid van dit en ik hoop dat u morgen weer op bezoek komt.
De jouwe Markus Neumann
18 Reacties
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.
Habe den BME280 am ESP32, hat sofort auf Anhieb funktioniert! Danke!!!
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
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
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
Hallo Rene
….Ich verwende eine Nodemcu 12E klingt doch sehr nach ESP8266. Dieser Sketch hier ist für den Nachfolger den ESP32
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
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.
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
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
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
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
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
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
[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
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
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.
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