Mehrere I²C Module an einem Mikrocontroller

Hallo und willkommen zu unserem heutigen Beitrag.

 

aufgrund der aktuellen Hitzewelle habe ich meinen für heute geplanten Beitrag nicht zum laufen bekommen. Es war unmöglich mich bei den Temperaturen zu konzentrieren...

Da sitzt man nun an seinem Arbeitsplatz, umgeben von Temperatursensoren, und hat kein einziges Modul in Betrieb welches die Temperatur ausgibt...  Ich hatte schon einen Nano V3 in der Hand und wollte anfangen zu basteln, als ich mich an einen meiner letzten Blog-Beiträge erinnert habe: "Ab sofort zählt bei mir Faulheit nicht mehr als Ausrede um den STM32 in der Schublade liegen zu lassen."

Also mein Ziel für heute: mit dem neu geflashten STM32 einen Temperatursensor auslesen (BME280). 

Aufgrund einer Kundenanfragen wie man 2 I²C Geräte kombinieren kann, geben wir die Temperatur dann noch auf einem I²C OLED aus.

Wir benötigen also für das heutige Projekt:

1x STM32 Mikrocontroller (ein Nano V3 würde es auch tun)
1x BME280 Sensor
1x 1,3 Zoll OLED Display
1x Breadboard
Jumperkabel

 Wir schließen die Bauteile wie folgt an:

STM32

BME280

I2C OLED

G

GND

GND

3.3

VIN

VDD

B7

SDA

SDA

B6

SCL

SCK

 

 

 

 

Um den Sensor auszulesen nehme ich die BME280 Bibliothek von Adafruit, welche einfach über den Bibliotheksverwalter installiert werden kann.

 

Nun öffne ich den Beispielsketch unter "Datei" -> "Beispiele" -> "Adafruit BME 280 Library" -> "bme280test".

Beim ersten Test-Upload kommt die Meldung dass kein BME280 gefunden wurde. Mittels "status = bme.begin(0x76);" können wir die richtige I²C Adresse für unseren Sensor mit angeben, und im Seriellen Monitor erscheint die Ausgabe:

 

 

Der Sensor liefert die erwarteten Werte. Schön warm ist es heute. Ein leckeres Eis wäre jetzt eine gute Idee!

Nein, ich muss mich konzentrieren. Das Display müssen wir ja noch einbinden.

Ich greife dabei wie so oft auf meine bevorzugte Bibliothek zurück: U8g2 von Oliver Kraus. Die Bibliothek bietet alles was man sich wünschen würde, und ist darüber hinaus mit wenig Aufwand einzubinden.

Wir ändern den BME280test wie fogt ab:

  • bei den Include Statements am Anfang fügen wir folgende Zeile hinzu: "#include <U8g2lib.h>".
  • mittels "U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);" legen wir die verwendete Hardware fest.
  • im "void setup()"-Teil starten wir das Display mittels "u8g2.begin();"

Im "void loop()" teil können wir nun mittels dem u8g2.print Befehl Text auf das Display ausgeben.

Der Fertige Code sieht dann am Ende so aus:

 

 

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define SEALEVELPRESSURE_HPA (1013.25)

#include <U8g2lib.h>

Adafruit_BME280 bme; // I2C

U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

unsigned long delayTime;

void setup() {
    Serial.begin(9600);
    u8g2.begin();
    Serial.println(F("BME280 test"));
    bool status;
    status = bme.begin(0x76);  
    if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
        while (1);
    }
    
    Serial.println("-- Default Test --");
    delayTime = 1000;
    Serial.println();
}

void loop() { 
    printValues();
    u8g2.setFont(u8g2_font_courR14_tf);
    u8g2.firstPage();
    do {
      u8g2.setCursor(0, 20);
      u8g2.print("Temperatur:");
      u8g2.setCursor(32, 50);
      u8g2.print(bme.readTemperature());
      } while ( u8g2.nextPage() );
    delay(delayTime);
}

void printValues() {
    Serial.print("Temperature = ");
    Serial.print(bme.readTemperature());
    Serial.println(" *C");
    Serial.print("Pressure = ");
    Serial.print(bme.readPressure() / 100.0F);
    Serial.println(" hPa");
    Serial.print("Approx. Altitude = ");
    Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
    Serial.println(" m");
    Serial.print("Humidity = ");
    Serial.print(bme.readHumidity());
    Serial.println(" %");
    Serial.println();
}

 

Geschafft! Wir haben erfolgreich ein Projekt mit einem STM32 verwirklicht, und gezeigt wie man zwei I²C Module an den I²C Bus anschliessen kann.

Ich hoffe Sie fanden den heutigen Beitrag nützlich. Wir haben Ihnen gezeigt wie einfach es ist mit dem STM32 zu arbeiten. Der einzige Unterschied zum Nano (bis auf die Benennung der Pins) ist die Tatsache dass der Sketch um ein vielfaches schneller auf den Mikrocontroller hochgeladen ist.

In diesem Sinne verabschiede ich mich für heute, und hoffe dass Sie auch morgen wieder vorbeischauen.

Ihr Markus Neumann

Letzter Artikel Blink Sketch ohne delay()
Neuer Artikel Unser Farbsensor TCS230 (ohne Bibliothek)

Kommentar

Bernd - August 27, 2018

Ist es möglich mehrere I2C Busse an einem Arduino oder ESP8266 zu betreiben?
Hintergrund: ich möchte an einer Lüftungsanlage an vier Stellen gleichzeitig Temperatur, Feuchte und Luftdruck messen, dazu ist der BME 280 perfekt geeignet. Zwei BME280 an einem Bus geht prima (0×76)+(0×77).
Aber gehen auch mehr? Kann ich irgendwie zwei oder mehr getrennte I2C Busse erstellen, and denen dann jeweils zwei BME280 hängen.
Vieleich hat mir da jemand eine Idee dafür.
Danke für eure Ideen, Bernd

Markus Neumann - August 2, 2018

Sehr geehrter Kunde,

vielen Dank für Ihren Kommentar. Wir haben Ihren Vorschlag auf unsere Liste abzuarbeitender Themen aufgenommen. Momentan versuchen wir vor allem unseren Kunden den Einstieg in die Programmierung zu erleichtern und möglichst vielen Kunden damit weiterhelfen zu können. Es gibt unzählige Frameworks und Toolchains für unzählige Controller, und somit unendliche Kombinationsmöglichkeiten. Wir werden in Zukunft mit Sicherheit einmal darauf zurückkommen.

Manfred - Juli 31, 2018

Es wäre nett, wenn auch mal etwas anderes als nur das Arduino-Framework zum Einsatz käme. Beispiel: Mongoose-OS von Cesanta (https://mongoose-os.com) eine echte Open-Source-Variante für die ESP-Welt (als auch für STM32Fx und CC32x0). Nur mal so als Hinweis, ich selbst bin mehr zufällig an diesem Framework hängengeblieben, weil ich mit der Arduino-Welt nicht mehr so recht weiterkam und auch die Software an vielen Stellen unvollständig und unzuverlässig war. Wäre ja vielleicht mal eine Überlegung wert … ;-) (Nein, das ist keine Werbung, ich bin reiner Anwender)

Gruß, M.

Hinterlasse einen Kommentar

Kommentare müssen vor der Veröffentlichung überprüft werden

Erforderliche Angabe