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.
10 Kommentare
Andreas Wolter
@Ineichen: der VIN auf dem Board ist ein geregelter Eingang und braucht daher mehr als 5V. Ich würde es mit 9V versuchen. Das ist auf vielen Boards gleich und eigentlich kein Problem. Man könnte auch über den USB-Eingang gehen, wenn man nur 5V zur Verfügung hat. Dann wäre ein Adapter notwendig.
Grüße,
Andreas Wolter
AZ-Delivery Blog
Ineichen
Hallo zusammen
Hat den jemand das Problem gelöst mit den VIN. Das Bord läuft nicht mit angelegten geregelten 5VOLT. Über den usb Anschluß kein Problem.
Gruss bruno und danke für Hilfe.
Andreas Wolter
@Marc: ich bedauere, aber 3D-Vorlagen der Module bietet AZ derzeit nicht an.
Grüße,
Andreas Wolter
AZ-Delivery Blog
Marc
Guten Tag, ich suche für den ESP32 Mini die CAD Files, damit ich ihn in Fusion360 importieren kann und so z.B. für das Design von Gehäusen die richtigen Maße habe. Andere Hersteller (z.B. adafruit) bieten diese auch auf Github an. Leider Ist ihr Repo leer.
Stelle sie die *.f3s, *.stl sowie *.step zur Verfügung?
Danke für eine Rückmeldung.
Andreas Wolter
@Thomas Wolter: ich vermute, dass die Spannung (oder der Strom) noch nicht ausreicht. Unbedingt darauf achten, dass der 5V-Pin und nicht der 3.3V-Pin verwendet wird. Siehe eines meiner älteren Kommentare.
Grüße,
Andreas Wolter
Thomas Wolter
Hallo Zusammen
Habe das selbe Problem, das über USB das Board läuft und über den VCC anschluß mit externem Netzteil (gibt 5,5V raus) nicht läuft.
Hat da einer eine Lösung für.
VG
Thomas
Andreas Wolter
@Marco Roll: versuchen Sie bitte meine Lösung aus dem Kommentar direkt darüber. Der Vin eines ESP32 ist regulated. Also müssen mehr als 5V anliegen. Im günstigsten Fall 6V-7V. Meistens werden 9V genutzt (z.B. 9V Block), maximal 12V.
Marco Roll
Ich habe das selbe Problem wie Fabio Tensi beschreibt.
Über USB lassen sich die Boards problemlos betreiben, mit 5V am VCC tut sich nichts.
Grüße
Marco
Andreas Wolter
@Fabio Tensi:
You can power the board in three different ways: via USB port, via Vin 5V pin (unregulated), via Vin 3.3V (regulated).
If you want to use the 5V Vin pin, you should apply a voltage between 5V and 12V. The higher the voltage, the warmer the voltage regulator becomes. Therefore, 9V is often used.
If the 3.3V Vin Pin is used, the 3.3V should not be exceeded. Also, avoid using multiple voltage sources at the same time.
Fabio Tensi
Hi I bought 3 x D1 mini esp-32, all 3 work correctly when I use the usb port, when I use the 5V power supply connected to the VCC PIN (+ 5V),it does not boot.
I have tried with the D1-mini and the D1-mini-pro which are currently working.
Can you help me ?
Thank you.
Fabio Tensi