Funksensor mit Bosch sensortec BME680 / Luftgüte

Begonnen von juergs, 28 Oktober 2017, 18:05:43

Vorheriges Thema - Nächstes Thema

juergs


juergs

#436
Der Verlauf 2er Sensoren und der entsprechende GAS-Output.
Sehr plausible Werte. Ein Verdacht habe ich schon, woher der hohe Anteil in der Nacht kommen könnte.  ;)
Siehe vorher| nachher.
Leider sind die grafischen Auswerte-Möglichkeiten  in FHEM etwas beschränkt, aber ausreichend.

juergs

#437
Hallo Zusammen,

irgendwie kam ich auf die Idee, meine "herumliegenden" SaintSmart-TFT-LCD-Displays mit dem BME680-Sensor zu kombinieren.
Da hatte ich noch nicht geahnt, wie das zu einem "Adafruit"-Marathon ausarten würde.
Leichtfertiger Weise dachte ich, dass es mit dem MapleMini sehr einfach einzubinden wäre.
Einfach die Adafruit-Libs einbinden und fertig! => falsch gedacht!

Hier möchte ich jetzt meine Erfahrungen dazu teilen, da man sich in dieser Konstellation tagelang damit beschäftigen könnte.

Die Idee dazu kam von  diesen Webseiten: https://www.instructables.com/id/Arduino-sketch-for-a-retro-analogue-meter-graphic-/
ZitatUNO and 2.2" ILI9341 based 320 x 240 pixel TFT
und dieser Seite Oscillograf und https://www.instructables.com/id/Arduino-BMP180-temperature-and-pressure-sensor-rea/

Um es kurz zu machen: So einfach zu realisieren ist das in der Tat nicht.
Gründe:
Im Netz gibt es gefühlt tausend verschiedene Varianten + Versionen der Adafuit-Libs, alle mit spezifischen Änderungen für bestimmte
Prozessortypen, ohne dass die "Feinheiten" dokumentiert sind.

Ich hatte mir die TFT-Displays   "ST7735 128x160"  für 5$ von Hersteller Sainsmart erstanden.
Also Vorgehensweise:  Libraries von Adafruit herunterladen und versuchen für den ESP oder STM32
zum Laufen zu bekommen.
Ergebnis: die Libraries sind nicht mal nach dem Download mit den Sample zu ohne Fehler zu kompilieren....
Entweder fehlen weitere Header-Dateien oder die Versionen passen nicht zusammen...  :(

Die Libs hatte ich in <Arduino-Verz>/libraries gelegt. FALSCH (Denkfehler!):
Sie müssen für den Maple in dem ".../Documents\Arduino\hardware\Arduino_STM32\STM32F1\libraries" liegen.

Dort liegen schon die Versionen, die ich irgenwann mal dort installiert hatte:
Zitat02.12.2018  23:01    <DIR>          Adafruit_GFX_AS
02.12.2018  23:01    <DIR>          Adafruit_ILI9341
02.12.2018  23:01    <DIR>          Adafruit_ILI9341_STM

Die Original-Version der Lib ließ sich nicht kompilieren. Wilde CPP-Fehler.
Auch die Neueste von hier nicht: https://github.com/rogerclarkmelbourne/Arduino_STM32
Ach ja, es sind nicht native ST7735-Versionen, sondern ILI9341-Libs.  Die Soft-SPI-Lösung war noch Fehler-behafteter.
Ich fand nur diese: "Adafruit_ILI9341_STM". Alle Maple-Beispiele nutzten diese unauffindbare "Adafruit_ILI9341_STM_AS" ...
Letztendlich ging die Hardware-Variante mit SPI_1 des Maples.
Nach Ausprobieren von gefühlt tausend Varianten + Versionen und intensiver Suche im Netz habe ich endlich,
nach ca. anderthalb Tagen mit  dieser Variante  der STM32F1/libraries den Durchbruch erzielt. (...naja fast!) .
(Grafik- und SPI-Libs im STM32-Libs-Ordner (!) durch diese Versionen ersetzt.)

Ok, die Lib geht von einem Display der Größe 240x320 aus und meines hat 128x160, ist etwas kleiner!
Und die Grafik-Koordinaten (pdf) sind gespiegelt und müssen skaliert werden, aber das kriegt man noch hin ...  ;)

... und natürlich die Anbindung mit dem BME680...

Fazit: ein nicht ganz unerhebliches Unterfangen, für den STM32 etwas Passendes hinzubekommen!

juergs

#438
Jetzt ist auch noch die Lib für den ESP8266 hinzugekommen.
Der Code für den Maple wurde angepasst.
Das Spiegeln der Koordinaten ist noch etwas aufwändiger als gedacht
und das Display löschen will (noch) nicht so richtig vollständig ...



STM32-F1https://github.com/victorpv/Arduino_STM32

ESP8266(Wemos)https://github.com/Bodmer/TFT_eSPI

Hier lassen sich die Display-Typen über "user_setup"-Header-Dateien einstellen.

Die Anpassung der Koordinaten geht über ein Skalierungsfaktor (#define M_SIZE 0.667) und nicht über Lib-Settings.

Die Farbe des Schutzfolien-Tabs ist äußerst relevant:


// #define ST7735_INITB
// #define ST7735_GREENTAB
// #define ST7735_GREENTAB2
// #define ST7735_GREENTAB3
// #define ST7735_GREENTAB128    // For 128 x 128 display
// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset)
// #define ST7735_REDTAB
// #define ST7735_BLACKTAB
// #define ST7735_REDTAB160x80 // For 160 x 80 display (24 offset)

Ich habe die Black-Tab-Variante (hatte noch ein Exemplar mit Original-Folie...)

Zur Lösung gäbe es zwei Varianten:
1. die Einfache: auf ein 240x128 - Display ausweichen, dann passen die Libs ohne Änderungen.
2. die Aufwändige: für 128x160 die Lib erforschen und ändern, oder die Koordinaten immer in der Anwendung spiegeln ...

Oder doch nochmal Suchen? Fündig geworden: Flip-Problem bei setRotation!

LÖSUNG für ST7735 und ILI9341 für beide Libraries:

An verschieden Stellen wir das MADCTL-Register beschrieben. Irgendwie haben die Entwickler der LIB nicht
nicht alle Varianten berücksichtigt
Adafruit_ILI9341_STM.cpp (Maple/STM32):

void Adafruit_ILI9341_STM::setRotation(uint8_t m)
{
  // --- juergs, Varianten neu hinzugefügt!
  rotation = m % 6; // can't be higher than 3, now 5
  switch (rotation) {
    case 0:
      m = (MADCTL_MX | MADCTL_BGR );
      _width  = ILI9341_TFTWIDTH;
      _height = ILI9341_TFTHEIGHT;
      break;
    case 1:
      m = (MADCTL_MV | MADCTL_BGR);
      _width  = ILI9341_TFTHEIGHT;
      _height = ILI9341_TFTWIDTH;
      break;
    case 2:
      m = (MADCTL_MY | MADCTL_BGR );
      _width  = ILI9341_TFTWIDTH;
      _height = ILI9341_TFTHEIGHT;
      break;
    case 3:
      m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR);
      _width  = ILI9341_TFTHEIGHT;
      _height = ILI9341_TFTWIDTH;
      break;
case  4:
  m = 0xC8;
      _width  = ILI9341_TFTHEIGHT;
      _height = ILI9341_TFTWIDTH;
      break;  
case  5:
          // --- juergs, diese Variante neu hinzugefügt!
         // --- hier wird das Bit5 des Registers auf "1" = "Reversed" gesetzt, gab es vorher nicht!
         //--- Bit7 wird auf "1" gesetzt, BottomToTop und BGR Farben eingestellt
         // Doku mau ...  :o
  m = ( MADCTL_MV | MADCTL_MY| MADCTL_BGR );  // 0xa8
      _width  = ILI9341_TFTHEIGHT;
      _height = ILI9341_TFTWIDTH;
      break; 
  }


In der Library TFT_eISP:
Zitat#define ILI9341_DRIVER
#define ST7735_BLACKTAB
In user_setup.h ist zu setzen, damit das Display in den passenden Modus schaltet.
Man muss nur wissen,  welcher Fall in welchem Header zu wählen ist.
Bei den x-konfigurations-Möglichkeiten und vielen redundanten Defines ... Easy, oder?!  :( ::)

Für den ESP findet sich der relevante Code in der Header-Datei: ILI9341_Rotation.h
  case 7:
#ifdef M5STACK
      writedata(TFT_MAD_MX | TFT_MAD_BGR);
#else
      writedata(TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_BGR);
#endif
      _width  = _init_height;
      _height = _init_width;
      break;


Schwere Geburt, für so ein kleines Display....   ;)
Offensichtlich gibt es verschieden TFT-Controller-Varianten, die einmal auf "Normal" und einmal auf "Reversed" zu setzen sind,
daß sie sich mit den Zusatz-Grafik-Libs betreiben lassen.

Größe und Orientierung passt jetzt...
Dann muss nur noch der Maple Code bereinigt werden, bzw auf die ursprüngliche Version ohne Faktor zurückgegangen werden... 
Damit die Skalen-Schrift + Anzeige auch wieder erscheinen ...

Dann kann ich mich an die Umsetzung der BME680-Sensorwerte machen.

Datenblatt: Datenblatt ILI9341.pdf (nur?) Seite 95.
sainsmart-arduino-color-display/

juergs

#439
Bin gerade beim Implementieren und der seriellen BME680-Boards auf dem MapleMini.

Beim näheren Hinsehen ergeben sich nun auch einige Fallstricke bei der STM32 angepassten Library.


  • Es fehlt noch eine kleinere Schriftart.
  • Generell scheint die STM-Lib weit weniger Features zu enthalten, wie die des ESP8266.
  • Das Zeigerinstrument wird von einem gößeren Anzeigeformat herunterskaliert.
  • Das endet sehr mühselig in der Bestimmung der absoluten Koordinaten....
  • Es wird wohl besser sein, das virtuelle Instrument objektorientierter anzupacken, was aber auch etwas mehr  Aufwand bedeutet.


IAQ-Werte > 250 habe ich bisher selten gesehen .... deshalb macht es wohl kein Sinn, den Bereich auf IAQmax=500 skalieren,
sondern eine passende "adaptive" Dynamik einzubauen ...

So langsam wird es was....

Dennoch, hier die Todo-Liste:

  • Tag-/Nacht-Display
  • RFM69CW (LaCrossegateway) und/oder CC1101 (CUL)
  • mehrere Seiten-Darstellungen
  • Encoder oder Tasten zur Bedienung
  • ansprechendes 3D-Druck-Gehäuse
  • asynchrone Erfassung der seriellen BME680-Daten über Interrupt-Erfassung
  • asynchrones Display-Update
  • Timing aufteilen

Hilfreich dazu ist ein Sketch-Programm zu Ausprobieren der Grafik: sketchit  (C#-Interpreter)
Sorry an die *nixer, CSharp liegt mir "etwas" mehr ...  ;) :)

Beispiel zum selbst Live-Ausprobieren:
using System.Drawing;
float M_SIZE = 0.068F;
float _sx = 0.0F;
float _sy = 0.0F;
int _x0=0, _x1=0;
int _y0=0, _y1=0;
int tl = 15;
int _sxInt = 0;
int _syInt = 0;
int _idx = 0;

SetSize(160,128);
DrawBackground(GetColor(200,255,255));
DrawRectangle(5,3,Width-10, Height/2+10);
SketchIt.Api.Color slatBlue = GetColor(255,255,255);
Pen skyBluePen = new Pen(Brushes.DeepSkyBlue);

// indexe laufen von 0..20
for (int i=-50; i<51; i+=5)
{
_sx = Cos((i - 90) * 0.0174532925F);
    _sy = Sin((i - 90) * 0.0174532925F);
PrintLine("idx, i, sx, sy =\t", _idx,  i, _sx, _sy);

_idx++;

_sxInt = Convert.ToInt32(_sx * M_SIZE * 100 + tl);
_syInt = Convert.ToInt32(_sy * M_SIZE * 100 + tl);

_x0 = _sxInt + Convert.ToInt32(M_SIZE * 120);
_y0 = _syInt + Convert.ToInt32(M_SIZE * 150);

_x1 = Convert.ToInt32(_sx) +  M_SIZE * 120;
_y1 = Convert.ToInt32(_sy) +  M_SIZE * 150;

if (i<50) DrawLine(_x0,_y0,_x1,_y1);
PrintLine("idx, i, _sxInt, _syInt =\t", _idx,  i, _sxInt, _syInt);
PrintLine("idx, i, x0, y0 =\t", _idx,  i, _x0, _y0);
PrintLine("idx, i, x1, y1 =\t", _idx,  i, _x1, _y1);
}


Erste Code-Arbeitsversion für den Maple: https://github.com/juergs/BME680_TFT_Monitor/blob/master/BME680_Maple_TFT_Monitor.ino
Für Vorschläge und Pull-Requests gerne immer willkommen...  ;) :)

Für den ESP ist zusätzlich zum TFT noch folgendes geplant (JavaScript + Chart.js): esp8266-data-logging-with-real-time-graphs
Lauffähiges Beispiel habe ich beigefügt.

PeMue

Hallo Jürgen,

Deine breakouts für den BME680 waren von hier, oder? Ich überlege, ob ich eines für den Lacrosse GateWay mache, der dann seitlich auf der Platine (mit 90 ° Stiftleisten) festgelötet wird und aus dem Gehäuse rausschaut.

Gruß Peter
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

juergs

#441
Hallo Peter,
ja, die von OSH.

Allerdings betrachtet man das Preis/Leistungsverhältnis is das komplette QY-MCU680V1-Board, seriell ja ebenfalls für das LGW geeignet.
Da wäre ja noch eine oder mehere Serial-Bridges onboard. Der BME kostet bei Rei****t 9,90€ + Versand.
Die QY-MCU680V1-Board von Ali kosten 8,80/Stück, kein Porto. Bei Rutronik 8,90€ + MWst + Porto.
Solche Ali-Preise sind nur in Tausender Stückzahlen wertschöpfend (oder Fakes?). 

Die Platinen hatte ich noch herumliegen, aus der Zeit wo ich noch mit dem Gedanken spielte, die Dinger selbst SMD-verlöten zu können.
Na ja, ab bekomme ich sie schon mal.  ;)

Leider wirklich schade um Deine Mühe, die Dinger auf die Platine zu bekommen. Trotzdem vielen Dank dafür.
Würde trotzdem empfehlen, das Breakoutboard von der Platine entfernt am Gehäuse zu montieren.
Sensor-oberfläche ins Freie ...

PS: um die thermische Einstreuung in der nanoLGW zu verhindern würde ich den Sensor ebenfalls außen anbringen wollen
und im 3D-Gehäuse für genügend Durchluft bzw. sorgen ... 
Ich würde ein Halterung dafür vorsehen. Bei dem Meter-Projekt ist der BH1750 auch sinnvoll,
da Tag-/Nacht-Erkennung und Regelung der Displayhelligkeit Sinn macht.
Da sie ja den ESP beinhalten ist ein Netzteil unabdingbar und die Anschlußmöglichkeiten dazu auch ...
D.h. die Gehäuse (LGW+nanoLGW) sollten standfest und das Netzteilkabel mit Hohlstecker abkönnen.
Wenn die Gehäuse fertig konzipiert + gedruckt sind, lasse ich Dir gerne ein paar davon zukommen.  ;)
Dauert leider noch etwas ...

Grüße,
Jürgen

juergs

Zitatob ich eines für den Lacrosse GateWay mache, der dann seitlich auf der Platine (mit 90 ° Stiftleisten) festgelötet wird und aus dem Gehäuse rausschaut.
Ist wohl auch Gehäuse-abhängig. Prinzipiell aber die wohl bessere Variante.  :)
Mit STM32F103+BSEC und I2C-Bypass?  ;D ;) :D

PeMue

Zitat von: juergs am 14 Januar 2019, 19:51:57
Mit STM32F103+BSEC und I2C-Bypass?  ;D ;) :D
Nur, wenn Du dafür die Software schreibst  ;D ;D ;D

Gruß Peter
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

juergs

#444
Zitat von: PeMue am 14 Januar 2019, 21:00:53
Nur, wenn Du dafür die Software schreibst  ;D ;D ;D
Gruß Peter

... könnte man darüber nachdenken ...   ;) :) :D

Wobei ich gerade die Erfahrung mit der seriellen Variante mache, daß während des Entwickelns und Uploadens,
die Erfassung einfach weiterläuft und der Sensor muss nicht neu initialisiert werden. Hat was ...
Man bekommt gleich gültige Werte  :)

So, Berechnungs-Fehler in der unteren Hälfte beseitigt und die Werte schon mal gelabeld.
Werte zum Darstellen bereitgestellt. Muss nur noch deren Positionierung "iterativ" anpassen  ;)

Durch Anhauchen reagiert die Anzeige wie zu erwarten war... sehr sensibel.  :) ;) :D

Die Farbgebung der Skala ist erst mal etwas empirisch verteilt ...
Wobei ich gestern auch schon IAQ-Werte von über 160 gesehen habe, die in etwa realistisch
einzuschätzen  waren und zur Stoßlüftung angemahnt haben ...  ;D

Die Grafiken sind schon mal vorbereitet, benötige aber noch die Einbindung einer kleineren Schrift.
ZitatProgram BME680_Maple_TFT_Monitor size: 70.344 bytes (used 64% of a 110.592 byte maximum) (2,88 secs)

Hier mal ein Mitschnitt:
IAQ_m ist schon der skalierte Wert für den Anzeige-Bereich von -50..+50 ° in 0..100%.
EMA_S ist der leicht geglättete IAQ-Wert und IAQ der momentan gemessene Wert.

[2691.28]  - EMA_S, IAQ, IAQ_m:   43   43   8
[2694.52]  - EMA_S, IAQ, IAQ_m:   42   42   8
[2697.75]  - EMA_S, IAQ, IAQ_m:   44   46   8
[2700.98]  - EMA_S, IAQ, IAQ_m:   42   42   8
[2704.21]  - EMA_S, IAQ, IAQ_m:   41   41   8
[2707.44]  - EMA_S, IAQ, IAQ_m:   43   45   8
[2710.67]  - EMA_S, IAQ, IAQ_m:   41   40   8
[2713.91]  - EMA_S, IAQ, IAQ_m:   44   47   8
[2717.14]  - EMA_S, IAQ, IAQ_m:   44   44   8
[2720.37]  - EMA_S, IAQ, IAQ_m:   41   39   8
[2723.60]  - EMA_S, IAQ, IAQ_m:   43   45   8
[2726.83]  - EMA_S, IAQ, IAQ_m:   44   46   8
[2730.06]  - EMA_S, IAQ, IAQ_m:   42   42   8
[2733.29]  - EMA_S, IAQ, IAQ_m:   45   48   9
[2736.53]  - EMA_S, IAQ, IAQ_m:   46   47   9
[2739.76]  - EMA_S, IAQ, IAQ_m:   46   46   9
[2742.99]  - EMA_S, IAQ, IAQ_m:   48   50   9
[2746.22]  - EMA_S, IAQ, IAQ_m:   48   48   9
[2749.45]  - EMA_S, IAQ, IAQ_m:   50   52   10
[2752.68]  - EMA_S, IAQ, IAQ_m:   49   49   9
[2755.91]  - EMA_S, IAQ, IAQ_m:   46   44   9
[2759.15]  - EMA_S, IAQ, IAQ_m:   43   41   8
[2762.38]  - EMA_S, IAQ, IAQ_m:   42   42   8
[2765.61]  - EMA_S, IAQ, IAQ_m:   46   49   9
[2768.84]  - EMA_S, IAQ, IAQ_m:   44   43   8
[2772.07]  - EMA_S, IAQ, IAQ_m:   43   43   8
[2775.30]  - EMA_S, IAQ, IAQ_m:   41   41   8
[2778.53]  - EMA_S, IAQ, IAQ_m:   41   41   8
[2781.76]  - EMA_S, IAQ, IAQ_m:   41   42   8
[2785.00]  - EMA_S, IAQ, IAQ_m:   42   43   8
[2788.23]  - EMA_S, IAQ, IAQ_m:   43   45   8
[2791.46]  - EMA_S, IAQ, IAQ_m:   46   48   9
[2794.69]  - EMA_S, IAQ, IAQ_m:   46   46   9
[2797.92]  - EMA_S, IAQ, IAQ_m:   48   50   9
[2801.15]  - EMA_S, IAQ, IAQ_m:   49   51   9
[2804.39]  - EMA_S, IAQ, IAQ_m:   45   43   9
[2807.62]  - EMA_S, IAQ, IAQ_m:   45   45   9

juergs

#445
LowerPane zeigt schon mal Werte, muss aber noch feingetunt werden.

/edit: IAQ_m interessiert nicht, HUMIDITY dafür nachgezogen...  ;)

PeMue

Hallo Jürgen,

Zitat von: juergs am 13 Januar 2019, 21:43:15
ja, die von OSH.
ich habe mir diese breakouts mal angeschaut und habe den Verdacht, dass die Vias teilweise im Nirwana verschwinden. Und vierlagig ist diese Leiterplatte auf jeden Fall auch nicht. Daher mein Vorschlag: wenn sich mein Verdacht bestätigen sollte, mache ich ein Breakout mit BME680 und BH1750, das mittes 1,27 mm Pinleisten sowohl auf den LGW als auch auf den nanoLGW angelötet werden kann. Einverstanden?

Einziger Nachteil:
Zitat von: juergs am 13 Januar 2019, 21:43:15
Dauert leider noch etwas ...

Gruß Peter
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

juergs

#447
Zitat von: PeMue am 16 Januar 2019, 21:13:50
Hallo Jürgen,
ich habe mir diese breakouts mal angeschaut und habe den Verdacht, dass die Vias teilweise im Nirwana verschwinden. Und vierlagig ist diese Leiterplatte auf jeden Fall auch nicht. Daher mein Vorschlag: wenn sich mein Verdacht bestätigen sollte, mache ich ein Breakout mit BME680 und BH1750, das mittes 1,27 mm Pinleisten sowohl auf den LGW als auch auf den nanoLGW angelötet werden kann. Einverstanden?
Gruß Peter


Hallo Peter,
ja klar, das hört sich super gut an.   :)


PeMue

RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

juergs

#449
Hallo Peter,

im Prinzip ja, weil abgesetzt, aber wenn man sich vorstellt dass man das Board
an ein (3D-Druck-)Gehäuse montieren muss, wären zwei M2,5 Bohrungen (diagonal?) zusätzlich noch sehr praktisch    :D ;) ;D

Zwar nicht so riesig, wie unten im BME-280-Beispiel (warum auch immer der BME280 0%rH liefert), aber ähnlich.
Ich stelle mir eine Vertiefung im Deckel vor ... von der Rückseite würde das Board mit zwei Senkkopf-Schrauben befestigt...
Oder ich müsste mir ein Schiebe-/Klemm-Mechanismus einfallen lassen ...

Wenn man sich schon was wünschen darf...  ;D

/edit: ... der BME280 0%rH liefert => Der Unterschied zwischen BME - und BMP280 !

Grüße,
Jürgen