Das dreiundzwanzigste Türchen

Heute gibt es eine besondere Variante des ESP32, nämlich den ESP32-Mini. Dieses Board zeichnet sich dadurch aus, dass es pinkompatibel zum D1-Mini ist. Das heißt es können Shields für den D1-Mini problemlos genutzt werden .

 


Die Pins mit der weißen Umrandung sind jene, die mit dem D1-Mini kompatibel sind. Bestückt man diese mit den beiliegenden kombinierten Stift- und Federleisten, so kann man den ESP32-Mini auch auf dem Dual-Base Shield verwenden.

Das Board hat aber noch zwei zusätzliche Pin-Reihen, damit möglichst viele der GPIOs des ESP32 nutzbar sind. Hier das komplette Pinout.

 

Im heutigen Projekt wollen wir mit dem ESP32-Mini und einem 0,66 Zoll OLED Display Shield einen kleinen, kompakten I2C Scanner realisieren. Die Verdrahtung ist dabei sehr einfach, da das Display nur auf den ESP32-Mini aufgesteckt werden muss. Wir bestücken das ESP32 Board mit den vier zehnpoligen Federleisten. Auf die beiden innenliegenden Federleisten stecken wir das Display-Shield wobei die zwei Pins in Richtung zum USB-Stecker frei bleiben.

Für den zu untersuchenden I2C-Bus wäre es schön, wenn die benötigten Pins so nebeneinander liegen, dass man das I2C Modul einfach aufstecken kann. Das lässt sich einfach realisieren, wenn man das I2C Modul über GPIO-Pins versorgt. Einzige Einschränkung bei dieser Methode, das Modul darf nicht mehr als 30 mA benötigen, was bei allen Sensormodulen sicher der Fall ist.
Wir werden die Pins GPIO27, GPIO25, GPIO32 und GPIO12 auf der rechten, äußeren Federleiste dafür benutzen.

  • GPIO27 = Vcc 3.3V
  • GPIO25 = GND 0V
  • GPIO32 = SCL
  • GPIO12 = SDA

Das ist die typische Pinbelegung der meisten Module mit I2C-Bus.

Das Bild zeigt den ESP32-Mini mit aufgestecktem Display und einem BMP180 Sensormodul.

 


Dieser Aufbau hat aber noch einen kleinen Nachteil. Es gibt auch Sensormodule, bei denen zwar die Pinbelegung übereinstimmt, die aber noch weitere Pins haben. Diese Pins sollten aber nicht mit den benachbarten Pins auf der ESP32 Federleiste verbunden werden. Außerdem kann man das Testmodul nicht mehr einfach einstecken, wenn der Scanner in ein Gehäuse eingebaut werden soll. Die Lösung ist eine vierpolige Verlängerung für die Testpins.


Diese Verlängerung fertigen wir uns aus einer der beiden beiliegenden, kombinierten Stift- und Federleisten an. Wir schneiden sie so ab, dass vier Pins übrigbleiben. Diese Verlängerung stecken wir auf die Testpins. Jetzt liegen zusätzliche Pins der Sensormodule einfach außerhalb der Federleiste. Beim Einbau in ein Gehäuse stehen die Testpins gut erreichbar aus dem Gehäuse heraus.

Das Programm ist sehr einfach. Zum Scannen wird nacheinander mit allen 127 I2C Adressen ein Verbindungsaufbau versucht.  Ist die Verbindung erfolgreich, so wird die entsprechende Adresse am Display angezeigt. Die Messung wird für verschiedene Busgeschwindigkeiten durchgeführt.

  • 100kHz Standard I2C
  • 400kHz Fast I2C
  • 1 MHz Fast Plus I2C
  • 4 MHz High Speed I2C

Zur Kompilierung benötigen wir das ESP32 Package und die Bibliotheken Adafruit_GFX.h und Adafruit_SSD1306.h für das Display

#include<Wire.h> //I2C Bibliothek im Package enthalten
#include <Adafruit_GFX.h> //Allgemeine Grafik Bibliothek
#include <Adafruit_SSD1306.h> //Bibliothek für den verwendeten Display Treiber


#define SDA1 21 //Daten Pin für den ersten I2C Bus für das Display
#define SCL1 22 //Takt Pin für den ersten I2C Bus für das Display

#define SDA2 12 //Daten Pin für den zweiten I2C Bus verwendet als Testbus
#define SCL2 32 //Takt Pin für den zweiten I2C Bus verwendet als Testbus
#define MVIN 27 //Pin für die Stromversorgubg immer auf HIGH
#define MGND 25 //Pin für GND immer auf LOW

#define X0 32 //Das Display hat nur 64 Pixel in der Breite, der SSD1306 kann aber nur mindestens
                       //96 Pixel richtig verarbeiten, wobei sich die übrigen 32 Pixel am linken Rand
                      //befinden. Alle Ausgaben auf das Display haben daher einen Offset von 32 Pixeln

//Instanzen für die beiden I2C Busse
TwoWire I2Ca = TwoWire(0);
TwoWire I2Cb = TwoWire(1);

//Instanz für das Display die Parameter sind
//Display-Breite, Display-Höhe und Adresse der I2C Bus Instanz
Adafruit_SSD1306 display(96,48,&I2Ca);

//Bufferspeicher für die gefundenen Adressen
//"--" bedeutet keine Adresse gefunden
char adresse[4][3] = {"--","--","--","--"};

//Ein Scan mit einer bestimmten Frequenz wird durchgeführt
//Der Parameter step gibt die Nummer der Messung an
void scan(uint32_t frequency, uint8_t step) {
  bool error = false;
  bool found = false;
  I2Cb.setClock(frequency); //I2C Busfrequenz setzen
  for(int i=1; i<128; i++){
    I2Cb.beginTransmission(i); //I2C Übertragung starten
    error = I2Cb.endTransmission(); //Beim Beenden prüfen wir auf Fehler
    if(error == 0){ //War kein Fehler aufgetreten, merken wir uns die Adresse
      sprintf(adresse[step],"%02x",i);//Adresse als zweistellige HEX Zahl speichern
      found=true;
    }
  }
  if (!found) {
    strcpy(adresse[step],"--"); //es wurde keine funktionierende Adresse gefunden
  }
}

//Die gefundenen Adressen in der zweiten Spalte des Displays anzeigen
void displayResult(){
  for (uint8_t i = 0;i<4; i++){
    display.fillRect(X0+45,8*i+16,12,8,BLACK); //Zuerst einen alten Wert löschen
    display.setCursor(X0+45,16+i*8); //Cursor setzen X=45 und Y ab Zeile 3 daher + 16
    display.print(adresse[i]); //Daten aus dem Bufferspeicher ausgeben
  }
  display.display(); //Display aktualisieren
}



void setup() {
  Serial.begin(115200);
  //Pins für die Stromversorgung des Testmodul
  pinMode(MVIN,OUTPUT);
  pinMode(MGND,OUTPUT);
  digitalWrite(MVIN,1);
  digitalWrite(MGND,0);
  //Beide i2C Busse initialisieren
  I2Ca.begin(SDA1,SCL1,400000);
  I2Cb.begin(SDA2,SCL2,400000);
  //Display initialisieren
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  //Leeres Formular anzeigen
  display.ssd1306_command(218);
  display.ssd1306_command(18);
  display.clearDisplay();
  display.setFont(NULL);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setTextWrap(0);
  display.setCursor(X0+8,2);
  display.print("I2C-Scan");
  display.setCursor(X0,16);
  display.print("100kHz");
  display.setCursor(X0,24);
  display.print("400kHz");
  display.setCursor(X0,32);
  display.print("1.0MHz");
  display.setCursor(X0,40);
  display.print("3.4MHz");
  display.display();
}

void loop() {
  //Scans für die verschiedenen Frequenzen durchführen
  scan(100000,0);
  scan(400000,1);
  scan(1000000,2);
  scan(3400000,3);
  //Ergebnis anzeigen
  displayResult();
  //1s warten
  delay(1000);
}

Und so sieht unser I2C-Scanner in einem Gehäuse aus:

 

Viel Spaß beim Nachbauen.


Hier die Links zu dem Sketch und den 3D-Druckdateien Unterteil / Oberteil.

Specials

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert

Aanbevolen blog berichten

  1. Installeer ESP32 nu van de raad van bestuur
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - ESP Programmeren via Wi-Fi