Guten Morgen,
ich suche immer gute Sensoren für den Smarthome Bereich und jetzt gibt's
ja den BME680 mit zusätzlichem Luftqualitätssensor.
Da mir I2C Sensoren nicht viel bringen habe ich schon den BME280 als
onewire umgestrickt. Extra so gebaut, dass man alte DHT22 Gehäuse nutzen
kann.
Leider ist die BME680 Library für mich etwas zu objektorientiert
gestrickt. Die vom BME280 konnte ich noch selbst ganz gut umschreiben.
Diesmal brauche ich etwas Hilfe.
Ich nutze die Adafruit Library, die so strukturiert ist:
Adafruit_BME680.cpp
Adafruit_BME680.h
bme680.c
bme680.h
bme680_defs.h
Die "bme680" Sourcen kommen diesmal scheinbar direkt von Bosch.
zunächst ist eine Struktur für den Sensor definiert, darin werden ein
paar Einstellungen und Sensordaten hinterlegt, soweit kein Problem.
Auch darin enthalten sind aber Pointer zu den I2C schreib und
lese-Funktionen und da wird's für mich kompliziert. Die
Schreib-/Lesefunktionen selbst sind nicht in der Adafruit Klasse,
deshalb muss ich einen Pointer auf mein Onewire Element übergeben.
Die Funktionen kennen aber den Datentyp Onewire scheinbar nicht, was ich
nicht verstehe.
Definition der read/write Funktionen mit hinzugefügtem Onewire Pointer:
1 | typedef int8_t (*bme680_com_fptr_t)(Onewire* onewire, uint8_t dev_id, uint8_t reg_addr, uint8_t *data, uint16_t len);
|
Beispielaufruf der Funktion auch mit hinzugefügtem Onewire:
1 | gas_sensor->write(gas_sensor->onewire, gas_sensor->dev_id, BME680_MEM_PAGE_ADDR & BME680_SPI_WR_MSK, ®, 1);
|
Die Funktion wird also aus dem struct aufgerufen und noch mit Daten aus
dem struct gefüttert. Augenverdreh
Die Eigentliche Frage ist aber quasi warum die read write Funtkionen
behaupten sie kennen den Datentyp onewire nicht?
Das ganze ist natürlich für jemand der das ganze nicht vorliegen hat nun
auch nicht einfach zu verstehen, aber vielleicht hat trotzdem jemand
eine Idee.
zwanni