Hardwarenahe Programmierung
You are viewing an older revision! See the latest version
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
#define SEALEVELPRESSURE_HPA (1013.25)
TwoWire I2CBME = TwoWire(0);
Adafruit_BME280 bme;
unsigned long delayTime;
void setup() {
Serial.begin(115200);
Serial.println(F("BME280 test"));
I2CBME.begin(I2C_SDA, I2C_SCL, 100000);
bool status;
// default settings
// (you can also pass in a Wire library object like &Wire2)
status = bme.begin(0x76, &I2CBME);
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();
delay(delayTime);
}
void printValues() {
Serial.print("Temperature = ");
Serial.print(bme.readTemperature());
Serial.println(" *C");
// Convert temperature to Fahrenheit
/*Serial.print("Temperature = ");
Serial.print(1.8 * bme.readTemperature() + 32);
Serial.println(" *F");*/
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();
}
- In Zeile 5 ud 6 werden die Pins definiert.
- In Zeile 10 wird eine TwoWire-Instanz I2CBME gebildet, was eine I2C Bus erzeugt.
- Zeile 18 initialisiert die I2C Kommunikation
- In Zeile 24 wird schließlich ein BME280 Object mit der entsprechenden I2C Adresse und dem TwoWire Object initialisiert.
Jetzt können die üblichen Methoden für das bme-Objekt verwendet werden, um Temperatur, Luftfeuchtigkeit und Druck abzufragen.