Hallo,
ich würde die Routinen, die zum Auslesen des BME680 von Bosch nötig
sind, gerne etwas vereinfachen/optimieren. Wie ihr vielleicht wisst,
gibt der Sensor aus irgendeinem Grund nur Rohdaten und eine Tabelle mit
Kalibrierungsdaten raus und der arme µC muss damit klar kommen.
Das hier ist aus dem offiziellen Code von
https://github.com/BoschSensortec/BME680_driver/blob/master/bme680.c
1
/*!
2
* @brief This internal API is used to calculate the temperature value.
Heiner schrieb:> Wie ihr vielleicht wisst, gibt der Sensor aus irgendeinem Grund nur> Rohdaten und eine Tabelle mit Kalibrierungsdaten raus und der arme µC> muss damit klar kommen.
Der Grund wird sein, dass der Sensor aus Kostengründen keinen passenden
Rechenkern enthält.
Lass den armen µC doch rechnen, oder was meinst du, wie das Verhältnis
von Sensorzeitkonstanten zu Rechenzeit ist.
Es kann durchaus sein, dass die Kalibrierdaten genau auf diese von Bosch
veröffentlichte Umrechnungsroutine angepasst sind. Bei Änderungen am
Algorithmus und Abweichungen in der Rechengenauigkeit solltest du also
genau gucken, wie empfindlich das Ergebnis darauf reagiert.
Vielleicht hatten aber auch die Betriebswirtschaftler bei der
Entwicklung des Algorithmus die Oberhand, i.e. Auswerteroutine
funktioniert, nicht mehr dran drehen, keine Zeit mehr reinstecken -
fertig und raus damit ;-)
Ne, glaube nicht. Es gibt aber float-Versionen. Ist dann auch nur 32
Bit, aber naja, ob das schneller geht oder weniger Flash braucht?
Was mich stutzig macht, ist das ständige Casten in Bitbreiten, die
offensichtlich schon da sind. Und dann wird einfach mal nach signed
gecastet. Und dann werden signed Variablen bitweise verschoben!?
Programmiert Bosch alles so? Bauen die auch Komponenten für
Flugzeuge.....?
Aber das nur am Rande.
Heiner schrieb:> ich würde die Routinen, die zum Auslesen des BME680 von Bosch nötig> sind, gerne etwas vereinfachen/optimieren
Dann mach das doch (möglichst natürlich unter Beibehaltung der
Genauigkeit).
Oder wolltest du schreiben: "Ich kann es nicht, und suche jemanden der
es für mich macht".
Da stellt sich die Frage: Wozu ? Kann dein C Compiler es nicht
übersetzen oder ist dein Restprogramm schon so umfangreich dass diese
Routine nicht mehr in den uC passt ? Warum dann nicht das Restprogramm
optimieren.
Max schrieb:> Warum bieten solche Sensoren ihre Messwerte nicht schon fix und fertig> an???Wolfgang schrieb:> Der Grund wird sein, dass der Sensor aus Kostengründen keinen passenden> Rechenkern enthält.
Wolfgang schrieb:> Max schrieb:> Warum bieten solche Sensoren ihre Messwerte nicht schon fix und fertig> an???>> Wolfgang schrieb:> Der Grund wird sein, dass der Sensor aus Kostengründen keinen passenden> Rechenkern enthält.
Wieviel Leute würden wohl einen geringen Mehrpreis bezahlen um sich
diesen aufwendigen Berechnungs-Hickhack zu sparen? Ich tippe mal das
tendiert gegen 100%...
Eigentlich ist das Ganze sowieso ein Witz. Der Sensor wird beworben mit
"Messung der Luftqualität", liefert aber dafür nur einen elektrischen
Luftwiderstandswert (neben Temperatur, Feuchte und Druck). Den
beworbenen IAQ-Wert (indoor air quality), der sich aus diesen ableitet,
kriegt man aber nicht, bzw. nur, wenn man die (closed source) Binaries
verwendet. Zumindest habe ich das so verstanden. Die Binaries für ATMega
(8 Bit) benötigen 25kB ROM und 1kB RAM...
Bert schrieb:> Wieviel Leute würden wohl einen geringen Mehrpreis bezahlen um sich> diesen aufwendigen Berechnungs-Hickhack zu sparen? Ich tippe mal das> tendiert gegen 100%..
Ich tippe eher mal gegen 0%.
Die paar Krümel die von Privatpersonen gekauft werden interessieren
keinen Hersteller. Für die zählen die Kunden die die Dinger
Millionenfach kaufen und für die geht es um jeden 1/10 Cent.
Irgend W. schrieb:> Für die zählen die Kunden die die Dinger> Millionenfach kaufen und für die geht es um jeden 1/10 Zent.
Nö. Wenn es um jeden 1/10 Cent geht wählt man eher eine andere Lösung.
Dafür sind die Teile zu teuer. Auch dafür, "millionenfach" verwendet zu
werden. Ich finde, die Anwrndungs- "Simplicity" wird von den Herstellern
chronisch unterbewertet!
Ich versuche, in den Unterlagen irgendwo eine vernünftige Beschreibung
zu finden, wie die Rohdaten in korrigierte Werte umgerechnet werden. Ein
echter Fall von Code-Obfuscation. Anscheinend ist ein Programmteil
namens "bsec_do_steps()" zuständig, den ich aber noch nicht gefunden
habe.
Von Bosch gibt es die ZIP-Datei "BSEC_1.4.7.4_Generic_Release.zip" für
mehrere Controller. ATMEGA2560 oder Arduino oder diverse andere, sind
das die richtigen Quelltexte?
https://ae-bst.resource.bosch.com/media/_tech/media/bsec/BSEC_1.4.7.4_Generic_Release.zip
Die Werte erhält man durch o.g. Berechnungen. Bosch bietet zusätzlich
(optional) die BSEC-Software an, welche noch etwas mehr Korrektur
anbietet. Rausrechnen von Wärmequellen usw. Beispielsweise kriegt man so
wohl Temperatur und Feuchte außerhalb des Gerätes und auch den ominösen
IAQ-Wert etc.
BSEC ist closed-source! Man kann nur die API runterladen und
verschiedene Binaries. Ich habe es nicht probiert, da es für mein
Projekt auch Overkill ist. Außerdem passt es wohl kaum in meinen
ATMega328. ;)
Ein chinesischer Chip würde die Werte wahrscheinlich direkt ausspucken,
wie jeder andere vernünftige Sensor, ohne aufwändige externe Rechnerei.
Wenn ich die Wahl hätte, würde ich das auch bevorzugen.
Hallo,
wenn ich lesen muss das Bosch möchte für die Arduino IDE den arduino
builder auszutauschen, dann weiß ich nicht was Bosch falsch gemacht hat.
Ich würde sagen probiere erstmal diese Lib
https://github.com/adafruit/Adafruit_BME680
Hallo,
ich habe mit dem BME680 jetzt mal etwas rumgespielt und auch mit der
BSEC-Software, allerdings auf einem ESP32.
Diese Version habe ich zumindest zu Laufen bekommen:
https://github.com/BoschSensortec/BSEC-Arduino-library
ArduionoIDE 1.8.10 und ESP32-Boardmanagerversion 1.04.
Allerdings hat es da ein anderes Problem gegeben: nach der Änderung der
plattform.txt compiliert nichts anderes mehr für den ESP32.......
Die Version ist auch für 8Bit AVR dabei, aber:
1
Platform Type Compiler ROM size of
2
API in bytes 7814
3
ROM(.text+.data) in bytes Normal/lite 43291 / 26085
4
RAM(.data+.bss) in bytes Normal/lite 1064 / 1048
5
File Size* In bytes Normal/lite 141k / 85k
Daten aus BSEC Binary Size Information.pdf.
Es kämen also nur Mega644/1284/2560 in Frage.
Mein Problem ist aber eher der Sensor selbst: das Ding misst die
relative Luftgüte. Er muß durchlaufen und liefert erst nach mehreren
Tagen sinnvolle Werte, auch nur dann, wenn es ausreichend gro0e
Änderungen der Luftgüte gab.
Wenn das Ding z.B. in einer Werkstatt hängt, wo Staub, Dämpfe o.ä.
auftreten, hat mach der Einlaufzeit einen Wert für "beste Luft" skaliert
auf 25 des IAQ und eine "schlechte Luft" skaliert auf 250.
Abweichungen nach untern bzw. nach oben geben dann an, daß sich die
Luftqualität am Ort verbessert oder verschlechtert hat.
Ob man ohne die BSEC-Lib ausgegebenen Wert des "Gas-Widerstandes"
überhaupt irgendwie nutzen kann, ist mir im Moment völlig unklar.
Ich habe also keine Ahnung, was ich mit dem Ding nun eigentlich mache,
aber zum Glück habe ich ihn ja nur aus reinem Spaß und Interesse
gakauft.
Gruß aus Berlin
Michael
Dazu kommt, dass der zurück gegebene Widerstand davon abhängt, wie oft
man misst. Wenn man seltener misst, ist der Wert kleiner. Ich nehme an,
dass sich die Substanzen aus der Luft im Sensor anlagern und man das
Messen gleichzeitig als "Freibrennen" betrachten kann. Wenn man öfter
freibrennt, sind eben weniger flüchtige Stoffe im Sensor...
Hallo,
Michael U. schrieb:> Diese Version habe ich zumindest zu Laufen bekommen:> https://github.com/BoschSensortec/BSEC-Arduino-library>> ArduionoIDE 1.8.10 und ESP32-Boardmanagerversion 1.04.> Allerdings hat es da ein anderes Problem gegeben: nach der Änderung der> plattform.txt compiliert nichts anderes mehr für den ESP32.......
ich zitiere mich mal selbst, man sollte nicht eine Ergänzung in der
platform.txt vergessen, dann klappt es alles ohne Probleme.
Ich werde das mal an einem Odroid Go dran lassen, die Ausgabe auf dem
Display noch einbauen und den Kram mal längere Zeit beobachten. Bekommt
dereine Odroid Go wenigstens mal eine Verwendung. ;)
Gruß aus Berlin
Michael
Eine eigene Frage?
Dieser Thread ist über 7 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.