Hardwarenahe Programmierung

I2C Pinänderung

Mit dem ESP32 kann fast jeden Pin auf I2C eingestellt werden. Es wird die Wire.h-Bibliothek verwendet, um mit Geräten zu kommunizieren, die I2C verwenden:

Wire.begin(I2C_SDA, I2C_SCL);

Allerdings funktioniert das nicht immer, wenn z.B. die Bibliothek des Sensors direkt verwendet wird, da diese die Pins überschreiben, wenn keine eigene Wire-Instanz übergeben werden kann. In diesen Fällen muss die CPP-Bibliotheksdatei genauer angesehen werden, wie eigene TwoWire-Parameter übergeben werden können.

Hier ein Beispielprogramm zum Lesen vom BME280 mit anderen Pins, z. B. GPIO 33 als SDA und GPIO 32 als SCL:

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
 
#define I2C_SDA 33
#define I2C_SCL 32
 
TwoWire I2CBME = TwoWire(0);
Adafruit_BME280 bme;
 
void setup() {
  Serial.begin(115200);
  Serial.println(F("BME280 Test"));
  I2CBME.begin(I2C_SDA, I2C_SCL, 100000);
 
  bool status = bme.begin(0x76, &I2CBME);  
  if (!status) {
    Serial.println("no sensor found");
    while (1);
  }
}
 
void loop() { 
  printValues();
  delay(1000);
}
 
void printValues() {
  Serial.print("Temperatur = ");
  Serial.print(bme.readTemperature());
  Serial.println(" *C");
  
  Serial.print("Luftdruck = ");
  Serial.print(bme.readPressure() / 100.0F);
  Serial.println(" hPa");
 
  Serial.print("Luftfeuchtigkeit = ");
  Serial.print(bme.readHumidity());
  Serial.println(" %");
 }
  • In Zeile 5 ud 6 werden die Pins definiert.
  • In Zeile 8 wird eine TwoWire-Instanz I2CBME gebildet, was eine I2C Bus erzeugt.
  • In Zeile 9 wird bme-Objekt erzeugt (Arduino Test).
  • Zeile 14 initialisiert die I2C Kommunikation
  • In Zeile 16 wird schließlich ein BME280 Object mit der entsprechenden I2C Adresse und dem TwoWire Object initialisiert.
  • Zeile 28-40: Jetzt können in der Funktion printValues() die üblichen Methoden für das bme-Objekt verwendet werden, um Temperatur, Luftfeuchtigkeit und Luftdruck abzufragen und auszugeben.


All wikipages