Einführung
Eventuell haben Sie bereits Erfahrungen gemacht mit dem D1 Mini NodeMCU ESP8266 oder den ESP32 DevKits. In diesem Beitrag möchte ich Ihnen ein weiteres Entwicklungsboard zeigen, das so wirkt, als hätten die beiden ein Kind zur Welt gebracht. Dabei handelt es sich um das ESP32 D1 Mini Entwicklungsboard. Ich möchte sie ein wenig miteinander vergleichen und testen, ob das 0,66 OLED Shield zu beiden Minis kompatibel ist. Am Ende zeige ich Ihnen noch ein Programm, mit dem Sie auf dem Display jeweils eine bestehende Bluetooth- oder WLAN-Verbindung anzeigen können, die sich bei Veränderung aktualisiert. Los geht's.
Was wir benötigen
Anzahl | Bauteil | Anmerkung |
---|---|---|
1 | ESP32 D1 Mini NodeMCU | |
1 | D1 Mini NodeMCU 8266 | |
1 | 0,66" OLED Display Shield | |
PC mit Arduino IDE und Internetverbindung | ||
Lötkolben (für die Pinheader) |
Zweimal D1 Mini
Auf dem folgenden Bild sehen Sie den direkten Vergleich der beiden Boards (Ansicht von unten). Ich habe für Sie die Pinbezeichnung des ESP32 etwas hervorgehoben, um zu zeigen, wie die Beschriftung zu verstehen ist:
Außerdem habe ich die Pin-Funktionen dazu geschrieben. Die weißen Pin-Reihen des ESP32 passen zu den Pins des ESP8266. Die Schnittstellen SPI und I²C sind bei beiden Boards auf die gleichen Pins ausgeführt, auch wenn sie anders benannt sind. Die Spannungsversorgung und Reset-Pin liegen ebenfalls an gleicher Position. Somit sollten Shields für das ESP32 genauso passen, wie für das ESP8266 Board. Vorausgesetzt, dass man für dazugehörige Bibliotheken die GPIO-Nummern bei Bedarf selbst festlegen kann.
Das 0,66" I2C OLED Shield
Das 0,66" OLED Display Shield mit I²C-Schnittstelle hat eine Auflösung von 64 x 48 Pixeln. Es arbeitet mit dem SSD1306 Chip und kann huckepack auf dem D1 Mini seinen Dienst tun. Da nun klar ist, dass die Pins der I²C-Schnittstelle bei beiden Boards an der gleichen Position sind, sollte es dort auch genauso funktionieren. Das können wir testen, indem wir die U8G2-Bibliothek über die Bibliotheksverwaltung installieren.
ESP32 und ESP8266
Wir müssen nun noch die Pin-Header an die Boards löten. Wenn Sie neben dem Display noch andere Komponenten wie Sensoren, Taster oder LEDs anschließen möchten, sollten Sie weibliche Header mit langen Beinchen (sogenannte Stacking Header) nutzen. So können Sie das Display auf das Board und anschließend beides auf ein Breadboard stecken. Es sind dann nämlich alle Pins am ESP8266 belegt. Hier haben wir den ersten Vorteil des ESP32 D1 Mini, denn der hat neben diesen Pins auf jeder Seite jeweils eine weitere Pin-Reihe.
WICHTIG!: Um den ESP32 Mini auf einem Breadboard verwenden, dürfen die Header nach unten entweder nur auf den inneren oder den äußeren Reihen angelötet werden. Auf die jeweils andere Reihe können dann männliche oder weibliche Header nach oben angelötet werden.
Ich habe an den ESP8266 die weiblichen Header mit langen Beinen angebracht, um das Display aufstecken und es auf einem Breadboard nutzen zu können. An dem ESP32 habe ich nur weibliche Header an der Oberseite angebracht. Ich kann dann zwar die Pins der inneren Reihen (auch I²C und SPI) nur für das Display nutzen. Man sieht hier allerdings den Vorteil, dass weitere GPIOs daneben zur Verfügung stehen. Man könnte hier, genau wie beim ESP8266, weibliche Header mit langen Beinchen für die inneren Pin-Reihen nutzen. Das hängt alles ganz davon ab, wie Sie die Komponenten einsetzen wollen.
Hinweis: Achten Sie beim Aufstecken des Displays darauf, dass die Pin-Bezeichnungen auf der richtigen Seite sind. Ich habe mich an Pins TX und RST orientiert.
In den Voreinstellungen sollten diese zusätzlichen Quellen für den Boardverwalter eingetragen sein:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
und
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Beides mit einem Komma getrennt hintereinander. Wenn noch nicht passiert, müssen Sie die passenden Bibliotheken über Werkzeuge -> Board -> Boardverwalter installieren. Suchen Sie nach ESP8266 und ESP32 und installieren Sie sie. Nach der Installation wählen Sie entweder den D1 Mini unter den ESP8266 Boards, oder das ESP32 Dev Module unter ESP Arduino aus.
Es ist möglich, dass Sie zuerst die Treiber für die Boards installieren müssen, damit Sie in Ihrem Betriebssystem erkannt werden. Die Windows-Installation für den CP2104, der auf dem ESP32 D1 Mini verwendet wird, finden Sie hier. Für den D1 Mini ESP8266 benötigen Sie den Windows-Treiber für den CH340-Chip. Diesen finden Sie hier. Wenn alles funktioniert, sollten Sie unter Werkzeuge -> Port einen COM-Port sehen. Diesen müssen Sie eventuell noch einmal separat auswählen.
Displaytest
Wenn Sie die U8G2-Bibliothek installiert haben, finden Sie in den Beispielen unter full_buffer den Sketch "HelloWorld". Wenn Sie diesen öffnen, müssen Sie noch die passende Zeile zu dem Display einkommentieren:
U8G2_SSD1306_64X48_ER_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
Steckt das Display auf dem Board, ist es in der Arduino IDE eingestellt und der Port ausgewählt, dann laden Sie das Beispielprogramm auf den ESP. Sie werden dann wahrscheinlich ein abgeschnittenes Hello World! erkennen, wenn alles geklappt hat.
Da dieses Display etwas kleiner ist, muss entweder eine kleinere Schrift gewählt werden, oder wir schreiben das zweite Wort in die zweite Zeile:
void loop(void) {
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
u8g2.drawStr(0,10,"Hello"); // write something to the internal memory
u8g2.drawStr(0,30,"World!"); // write something to the internal memory
u8g2.sendBuffer(); // transfer internal memory to the display
delay(1000);
}
Ich habe das Display dann auf den anderen ESP gesteckt, das passende Board ausgewählt und dort noch einmal das gleiche Programm hochgeladen. Das funktionierte anstandslos:
Das Display Shield ist also kompatibel mit beiden D1 Mini. Ohne Breadboard kann ich am ESP32 nun noch weitere Komponenten verbinden, da auf beiden Seiten noch Pins frei sind.
Gemeinsamkeiten und Unterschiede
Rein äußerlich haben wir bereits die Unterschiede gesehen. Der ESP32 D1 Mini hat mehr Pins, die auch anders benannt sind. Er ist daher ein klein wenig breiter. Auf dem ESP32-Board sind jedoch die Pins so angeordnet, dass die Schnittstellen und die Spannungsversorgung an den gleichen Positionen ausgeführt sind, wie beim ESP8266. So sollten dann die Shields für beide Varianten passen.
Es kommt aber auch immer auf die inneren Werte an. Die Tensilica L106-32Bit CPU des ESP8266MOD-F12 SoC taktet mit maximal 160MHz auf einem Prozessorkern. Es ist ein WiFi-Chip enthalten, der die Spezifikationen B, G und N unterstützt. 4MB Flashspeicher sind ebenfalls inklusive. Der ESP32-WROOM-32 hingegen taktet mit zwei CPU-Kernen bis maximal 240MHz.
Der zweite Kern ist allerdings für Wifi zuständig und sollte daher nur bedingt für Multiprozessoranwendungen genutzt werden. Zumindest, wenn Sie die Netzwerkverbindung nutzen. Neben dem etwas schnelleren Wifi b/g/n Chip gibt es hier auch noch ein Bluetooth 4.2 Modul, das den BLE- und den normalen Modus unterstützt. Den Stromverbrauch habe ich nicht gemessen.
Der ESP32 hat tatsächlich seine Vorteile. Vor allem seine kompakte Bauform, die nochmal kleiner ist als die der anderen DevKits, aber die gleichen Eigenschaften mitbringt:
(v.l.n.r: ESP32 Devit C V4, ESP32 NodeMCU, ESP32 D1 Mini NodeMCU)
Viele Details zum D1 Mini ESP8266 finden Sie auch im Handbuch oder im kostenlosen E-Book. Infos zum ESP32 D1 Mini NodeMCU finden Sie auf der AZ-Delivery Shopseite.
Zum Schluss ein praktisches Beispiel
Je nachdem, welches der Mini-Boards wir verwenden, haben wir neben der Wifi-Verbindung auch noch die Möglichkeit, Bluetooth zu verwenden. Nehmen wir also an, wir haben ein Projekt in Planung, für das wir eines der kleinen Entwicklungsboards brauchen. Wir haben beide zur Verfügung und wollen das Display Shield verwenden, egal welches Board wir auswählen. Auf dem Display soll angezeigt werden, ob eine Wifi- oder Bluetooth-Verbindung besteht. Das soll durch zwei Icons dargestellt werden.
Wenn eine der Verbindungen abbricht oder wieder aufgebaut wird, soll auch das entsprechende Bild entweder angezeigt oder nicht angezeigt werden. Beim Aufbau der Wifi-Verbindung soll das Logo animiert dargestellt werden. Da der ESP8266 kein Bluetooth onboard hat, müssen wir dafür sorgen, dass das dann auch so auf dem Display angezeigt wird.
Ich habe dazu ein kleines Programm geschrieben. Es unterscheidet zwischen ESP32 und ESP8266. Es können auch die größeren Boards verwendet werden. Es ist also nicht auf die Minis beschränkt. Jedoch werden AVR-Boards (Arduino Uno, Nano, Mega, etc.) ausgeschlossen, da der Speicher nicht ausreicht und eben kein Wifi oder Bluetooth vorhanden ist.
Der Programmablauf sieht vor, das Wifi, Bluetooth (wenn ESP32) und das Display initialisiert werden. Ich habe mehrere Bilder als Icons erstellt und in XBM gewandelt. Wenn Sie eigene Bilder erstellen möchten, können Sie das mit der Exportfunktion des freien Grafikprogramms GIMP tun. Ich habe diese Webseite benutzt und meine erstellten PNGs in XBM exportiert. Für das Wifi-Logo habe ich drei Bilder erzeugt, die ich im Arduino-Sketch als Array aus Bitmap-Arrays deklariert habe.
Dadurch kann ich mit einer Schleife drüber laufen. Das ermöglicht eine Animation mit kürzerem Quellcode. Für das Bluetooth-Logo habe ich zwei einzelne Bitmap-Arrays erstellt. Einmal mit dem Logo und einmal mit dem Hinweis "no BT", falls kein Bluetooth onboard ist.
Wenn unter dem Menü "Werkzeuge" der Arduino IDE das ESP32 Dev Module ausgewählt ist, finden Sie in den Beispielen den Punkt BluetoothSerial. Das Beispiel SerialToSerialBT dient als Quellcodevorlage, um Daten zwischen PC und ESP32 auszutauschen. Auf dem Smartphone können Sie die App "Serial Bluetooth Terminal" installieren. Wir können dann zwischen Smartphone und PC Chatnachrichten verschicken.
Dem Beispiel müssen wir noch eine Möglichkeit hinzufügen zu erkennen, ob der Bluetooth-Partner verbunden ist oder nicht. Ich habe dazu eine Lösung auf dieser Webseite gefunden, die ich in das BluetoothSerial-Beispiel integriert habe. Dazu wird eine Callback-Funktion implementiert:
void callback(esp_spp_cb_event_t event, esp_spp_cb_param_t *param){
if(event == ESP_SPP_SRV_OPEN_EVT){
Serial.println("Client Connected");
}
if(event == ESP_SPP_CLOSE_EVT ){
Serial.println("Client disconnected");
}
}
die im setup() initialisiert wird:
SerialBT.register_callback(callback);
Das funktioniert dann wie eine Interrupt Service Routine (ISR). Da dort nur sehr wenig Programmcode stehen sollte, werde ich dort nur eine Variable ändern. Alle damit zusammenhängenden Kommandos werden außerhalb durchgeführt.
Für die Darstellung auf dem Display habe ich als Quellen die Beispiele der U8G2-Bibliothek genutzt. Für die Wifi-Verbindung gibt es ebenfalls Beispiele.
Den fertigen Sketch können Sie hier herunterladen: Download des fertigen Programms
Ich habe die Wifi-Verbindung so verändert, dass die Initialisierung nicht im setup(), sondern in der loop() durchgeführt wird. Es muss dort unterschieden werden, ob das Programm zum ersten Mal gestartet und Wifi initialisiert wurde. Oder ob die Wifi-Verbindung bereits bestand und ein Reconnect durchgeführt werden soll. Die Initialisierung und die Animation des Logos auf dem Display sind nicht-blockierend.
Wir stellen zwei Logos auf dem Display dar. Wenn eine der Verbindungen hergestellt oder unterbrochen ist, soll auch nur der Teil auf dem Display verändert werden. Es gibt dazu ein Beispiel, um die updateDisplayArea()-Funktion zu zeigen. Die funktionierte in meinem Fall aber nicht. Eventuell, weil ich Bitmaps statt Text und geometrische Figuren verwende. Daher musste ich den Quellcode erweitern. Er wirkt eventuell etwas unübersichtlich. Jedes Mal, wenn man eines der Logos anzeigt, muss abgefragt werden, ob das jeweils andere auch angezeigt werden muss.
Vergessen Sie nicht, im oberen Teil des Quellcodes Ihre WLAN-Daten einzutragen, bevor Sie den Sketch kompilieren und hochladen.
Laden Sie das Programm auf den ESP32 D1 Mini und öffnen dann den Seriellen Monitor. Haben Sie keine korrekten WLAN-Daten eingetragen, wird das Programm dauerhaft versuchen, die Verbindung herzustellen. Allerdings wird die Bluetooth-Verbindung nicht blockiert. Wir können also auf dem Smartphone die BT-Verbindung mit dem Gerät "ESP32test" herstellen. Dann öffnen wir das Serial Bluetooth Terminal und verbinden uns mit dem dem ESP32.
Auf dem PC im Seriellen Monitor sollten wir für die erfolgreiche Verbindung einen Hinweis erhalten und das OLED sollte das Bluetooth-Logo anzeigen.
Wenn wir die Verbindung trennen, sollte das Logo wieder verschwinden. Wir können nun Textnachrichten austauschen. Entweder schreiben Sie am PC etwas in die Eingabe des Seriellen Monitors, oder in die Texteingabe des Serial Bluetooth Terminals. Der ESP32 wird weiterhin versuchen, die Wifi-Verbindung herzustellen. Sollten Sie korrekte WLAN-Daten eingetragen haben, wird das Wifi-Logo dauerhaft angezeigt werden.
Wenn Sie das gleiche Programm auf den ESP8266 laden, sollte auf der rechten Seite des Displays dauerhaft der Hinweis "no BT" angezeigt werden. Der Austausch via Bluetooth ist dann wegen des fehlenden Bluetooth-Moduls nicht möglich.
Selbstverständlich kann man fehlende Wifi- und Bluetooth-Module extern nachrüsten. Ich beziehe mich hier allerdings nur auf die Onboard-Varianten. Die Verbindung zum WLAN-Netzwerk habe ich nur hergestellt, jedoch keine weiteren Daten ausgetauscht. Schauen Sie sich dafür die Wifi-Beispiele an.
Sie können nun den Zustand der Wifi- und Bluetooth-Verbindung auf dem Display anzeigen und aktualisieren. Es ist möglich, Sensordaten über die beiden Verbindungen mit anderen Geräten auszutauschen. Wobei Ihnen auf dem OLED angezeigt wird, ob die passende Verbindung besteht, oder nicht.
Wenn Sie andere Shields für den D1 Mini ESP8266 haben, sollten diese auch auf dem ESP32 D1 Mini verwendet werden können. Achten Sie dabei auf die richtige Pinbelegung, wenn es sich nicht um die fest eingestellten Pins für die SPI- oder I²C-Schnittstelle handelt.
Viel Spaß beim Basteln.
Andreas Wolter
für AZ-Delivery Blog
4 Reacties
Peter von Deparade
Befasse mich erst seit kurzem mit dem Arduino aus Interesse und finde diesen Beitrag sehr hilfreich für die nächsten Experimente. Super
Nils Sappok
Da ich noch sehr neu an der Sache bin, die Bauteile von letztem Jahr jedoch schon staub sammeln, vielen Dank für diesen Blog!
An das OLED hatte ich mich noch nicht getraut.
Ich habe es erst mal mit dem LCD versucht, da ein CO2-Sensor für meine Frau und meine Tochter als Lehrer sinnvoll ist:
https://www.instructables.com/Corona-Beginners-Arduino-CO2-Measuring-and-Ampel-D/
Ich weiß, dass ich noch so gut wie keine Ahnung habe, aber es hat sehr viel Spass gemacht und auch definitiv Lust auf mehr!
Das CO2-Messgerät mit einem OLED wäre natürlich noch viel cooler und dann noch mit Web-Server-Historie….
Es gibt soooo viele coole Sachen und Möglichkeiten….
….und Ihr macht’s möglich!
Viele Grüße aus Heidelberg,
weiter so und bleibt gesund,
Nils
Claus Kühnel
Toller Beitrag mit grundlegenden Funktionen, die angepasst wieder in eigene Programme übernommen werden können.
Peter Stauffert
Das Battery Shield für D1 Mini funktioniert auch problemlos mit dem ESP32 D1 Mini, damit kann man einen ESP32 D1 Mini auch mit einem LiPo betreiben. Da bei dem Battery Shield auch alle Pins durchgeschleift werden, kann man es auch zwischen den ESP32 D1 Mini und das OLED Display stecken