Dieses Tutorial zeigt, wie ein OLED-Display und ein BME280-Sensor mit einem Arduino zur Messung von Temperatur, Luftfeuchtigkeit und Luftdruck genutzt werden können. Die Komponenten kommunizieren über die I2C-Schnittstelle und benötigen nur wenige Kabel.

Benötigte Bauteile

OLED-Displays und ihre Eigenschaften

OLED-Displays (Organic Light Emitting Diode) benötigen keine Hintergrundbeleuchtung, da jedes Pixel selbst leuchtet. Sie bieten hohe Kontraste und sind energieeffizient. Das von mir verwendete 0,91-Zoll-Display hat 128×32 Pixel und nutzt den SSD1306-Treiber. Die Header-Pins müssen oft selbst angelötet werden.

I2C-Schnittstelle

I2C ist eine serielle Schnittstelle, die mit nur zwei Leitungen auskommt, SDA (Serial Data) für die Datenübertragung und SCL (Serial Clock) für das Taktsignal. Am Arduino UNO R3 sind die Pins A4 und A5 für diese Schnittstelle zuständig. Mehrere Geräte können an denselben Bus angeschlossen werden, da jedes eine eindeutige Adresse besitzt.

Schaltplan und Verkabelung

Vom OLED-Display zum Arduino:

  • GND → GND
  • VCC → 5V (oder 3,3V, falls das Modul keine 5V kann)
  • SDA → A4
  • SCL → A5

Vom BME280 Sensor zum Arduino:

  • GND → GND
  • VCC → 5V
  • SDA → A4
  • SCL → A5

Am einfachsten ist die Verkabelung, wenn man A4 und A5 vom Arduino zuerst aufs Breadboard zu den Pins des Displays und von dort weiter zum Sensor führt.

I2C-Adresse der Module ermitteln

Zum Test des Aufbaus kann der I2CScanner Sketch verwendet werden. Der überprüft an allen möglichen Adressen, ob sich ein I2C Gerät zurückmeldet. Der Sketch findet sich in der Arduino IDE unter

  • Arduino IDE → Beispiele → Wire → i2cscanner

Typische Adressen für OLED Display sind 0x3C oder 0x3D, für den BME280 Sensor 0x76 oder 0x77. Falls ein Modul nicht angezeigt wird, sollte die Verkabelung überprüft werden.

Bibliotheken installieren

Damit mit der nachfolgende Sketch funktioniert, müssen folgenden Bibliotheken in der Arduino IDE installiert werden:

  • Adafruit SSD1306
  • Adafruit BME280

Arduino-Code zur Anzeige der Messwerte

/***************************************************************************
 BMP280 und OLED Display 128x32
 https://www.makerblog.at

 - Arduino UNO R3 (oder vergleichbar)
 - BMP280 Klimasensor für Temperatur und Luftfeuchtigkeit
 - OLED I2C Display 128x32 (oder größer)

 Verkabelung:

 BME280 -> Arduino UNO R3
 SDA -> A4
 SVL -> A5
 GND -> GND
 VIN -> 5V

 OLED -> Arduino UNO R3
 SDA -> A4
 SVL -> A5
 GND -> GND
 VIN -> 5V

 Folgende Libraries müssen installiert sein, bei Fehlermeldung bitte mit dem Library Manager 
 kontrollieren

 - Adafruit SSD1306
 - Adafruit BME280
 ***************************************************************************/

#include <Adafruit_BME280.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128  // Horizontale Auflösung des Displays in Pixel
#define SCREEN_HEIGHT 32  // Vertikale Auflösung des Displays in Pixel
#define OLED_RESET -1     // Reset pin # (oder -1 wenn kein Reset Pin am Display)

#define SCREEN_ADDRESS 0x3C  // I2C Adresse des Displays, siehe Datenblatt, meist 0x3D für 128x64, 0x3C für 128x32
#define BME_ADDRESS 0x76     // I2C Adresse des Sensors

#define DELAY_TIME 500  // Wartezeit zwischen Messungen

// display Objekt mit Parametern erstellen
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

Adafruit_BME280 bme;  // bme Objekt für den Temperatursensor

void setup() {
  Serial.begin(9600);

  while (!Serial)
    ;  // Warten bis serielle Kommunikation funktioniert
  Serial.println(F("OLED mit BME280 Projekt"));

  if (!bme.begin(BME_ADDRESS)) {
    Serial.println("Kein BME280 Sensor an der Adresse gefunden.");
    while (1) {
      delay(100);
    }
  }

  // SSD1306_SWITCHCAPVCC = 3.3V Spannung wird intern erzeugt
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("Keinen SSD1306 Verbindung gefunden"));
    while (1) {
      delay(100);
    }
  }

  display.clearDisplay(); // Displayinhalt leeren
  display.setTextSize(1); // Schriftgrösse 1
  display.setTextColor(SSD1306_WHITE); // Pixel leuchtet
  display.cp437(true); // Use full 256 char 'Code Page 437' font
  display.display(); // Displayinhalt anzeigen

  Serial.println("Setup finished");
}


void loop() {

  display.clearDisplay(); // Display leeren
  display.drawRect(0, 0, 128, 32, SSD1306_WHITE); // Rahmen zeichnen

  display.setCursor(2, 2); //Cursorposition x, y
  display.print("Temp: ");
  display.setCursor(50, 2);
  display.print(bme.readTemperature());
  display.print(" ");
  display.write(248); // Hochgestellter Kreis für °C
  display.println("C");

  display.setCursor(2, 12);
  display.print("Luftf: ");
  display.setCursor(50, 12);
  display.print(bme.readHumidity());
  display.println(" %");

  display.setCursor(2, 22);
  display.print("LDruck: ");
  display.setCursor(50, 22);
  display.print(bme.readPressure() / 100.0F);
  display.println(" hPa");  

  display.display();
  delay(DELAY_TIME);
}Code-Sprache: PHP (php)

Fazit und Erweiterungsmöglichkeiten

Geschafft. Das OLED-Display zeigt die Messwerte des BME280-Sensors an. Mögliche Erweiterungen sind:

  • Anzeige von Symbolen oder größeren Schriftarten
  • Einbau in ein Gehäuse
  • Übertragung der Werte per Bluetooth oder WLAN an eine IoT-Plattform mit einem geeigneten Arduino, z.B. dem neuen Arduino UNO R4

Tagged on:     

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Time limit is exhausted. Please reload the CAPTCHA.

Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..