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.