ESP-8266-OLED

Das hier besprochene Modul besitzt alle Features eines ESP-8266-Boards mit einer zusätzlich fest integrierter 0,96″ OLED-Anzeige mit einer Auflösung von 128×64 Pixel und einem Micro-USB-Anschluss zur Programmierung und Stromversorgung. Beim erstmaligen Betreiben wird auf dem OLED ein Test angezeigt, der dem folgenden Bild entspricht.

ESP-8266-OLED

Spezifikationen

Mikrocontroller: ESP-12E
CPU: Tensilica Xtensa 32-bit LX106 RISC-Prozessor
Taktfrequenz: 80MHz bis 160MHz
Speicher: RAM: 128kB
Flash: 4MB
Betriebsspannung: 3,3V
Digital E/A Pins: 16
OLED: Größe: 0,96″
Farben: gelb und blau
Treiberchip: SSD1306
Auflösung: 128×64 Pixel

Anschlüsse

Das integrierte 0,96″ OLED ist an der I²C-Schnittstelle verfügbar mit den folgenden Pins:
SDA: GPIO12
SCL/CLK: GPIO14

Anschlüsse des ESP-8266-OLED
Abb.: Anschlüsse des ESP-8266-OLED

Einrichtung und Programmierung in der Arduino-IDE

Man fügt unter "Datei → Voreinstellungen → Zusätzliche Boardverwalter-URLs" folgende URL hinzu: http://arduino.esp8266.com/stable/package_esp8266com_index.json.
Falls schon eine andere URL in diesem Feld steht, kann diese mit einem Komma separiert werden.
Dann muss das ESP8266-Board hinzugefügt werden. Dazu geht man unter "Werkzeuge → Boards → Boardverwalter": Hier sucht man nach "esp8266" und installiert das Board:

Hinweis: Unter Microsoft Windows sollte darauf geachtet werden, dass der neueste Treiber CP340 USB to UART Bridge installiert ist, damit der Port erkannt wird.

Installation von ESP8266 in der Arduino-IDE

Wenn die Installation abgeschlossen ist, kann man nun im Menu "Werkzeuge → Boards" das Board NodeMCU 1.0 (ESP-12E Module) auswählen.
Die folgenden Einstellungen haben bei mir gut funktioniert:

Auswahl des Boards in der Arduino-IDE

Nun kann man Sketches wie gewohnt kompilieren und auf das Board hochladen.

Programmierung

Ex.1: LED-Blink

Mit diesem wird überrüft, ob die obige Einrichtung erfolgreich war:

void setup()
{
    pinMode(BUILTIN_LED, OUTPUT);
}

void loop()
{
    digitalWrite(BUILTIN_LED, !digitalRead(BUILTIN_LED));
    delay(500);
}

Ex.2: Pixel-Anzeige auf dem OLED

Für diesen und alle weiteren Sketches wird die Library olikraus/u8g2 verwendet, die auch für eine Vielzahl anderer Displays benutzt werden kann.

#include <Arduino.h>
#include <Wire.h>
#include <U8g2lib.h>

#define PIN_CLK 14
#define PIN_SDA 12

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, PIN_CLK, PIN_SDA, U8X8_PIN_NONE);

void setup()
{
    u8g2.begin();
    randomSeed(analogRead(0));
}

void loop()
{
    u8g2.clearBuffer();
    for(byte i=0; i<150; i++) {
        //u8g2.drawCircle(random(128), random(64), random(50));
        u8g2.drawPixel(random(128), random(64));
    }
    u8g2.sendBuffer();
    delay(1000);
}

Ex.3: Ausgabe der seriellen Konsole auf dem OLED

#include <Arduino.h>
#include <Wire.h>
#include <U8g2lib.h>

#define PIN_CLK 14
#define PIN_SDA 12

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, PIN_CLK, PIN_SDA, U8X8_PIN_NONE);
U8G2LOG u8g2log;

// assume 4x6 font, define width and height
#define U8LOG_WIDTH 32
#define U8LOG_HEIGHT 10

// allocate memory
uint8_t u8log_buffer[U8LOG_WIDTH * U8LOG_HEIGHT];

void setup(void)
{
    Serial.begin(9600);
    u8g2.begin();
    u8g2.setFont(u8g2_font_tom_thumb_4x6_mf);   // set the font for the terminal window
    u8g2log.begin(u8g2, 32, 10, u8log_buffer);  // connect to u8g2, assign buffer
}

void loop(void)
{
    char c;
    while (Serial.available() > 0) {
        c = Serial.read();   // read from Serial Monitor
        u8g2log.print(c);    // print to display
        Serial.print(c);     // and print back to monitor
    }
}

Ex.4: Anzeige von UTF8-Zeichen auf dem OLED

#include <Arduino.h>
#include <Wire.h>
#include <U8g2lib.h>

#define PIN_CLK 14
#define PIN_SDA 12

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, PIN_CLK, PIN_SDA, U8X8_PIN_NONE);

void setup(void)
{
    u8g2.begin();
    // enable UTF8 support for the Arduino print() function
    u8g2.enableUTF8Print();
}

void loop(void)
{
    // use chinese2 for all the glyphs of "你好世界"
    u8g2.setFont(u8g2_font_unifont_t_chinese2);
    u8g2.setFontDirection(0);
    u8g2.firstPage();
    do {
        u8g2.setCursor(0, 15);
        u8g2.print("Hello World!");
        u8g2.setCursor(0, 40);
        // Chinese "Hello World"
        u8g2.print("你好世界");
    } while ( u8g2.nextPage() );
    delay(1000);
}
zurück