Temperatur und Luftfeuchte im Raum per Sensirion SHT85:
Aktuelle Messwerte SHT85
Temperatur und Luftdruck im Raum per Boch BMP388:

Die Luftdruckwerte via Bosch BMP388 sind auch auf openSenseMap.org zu finden.

Aktuelle Messwerte BMP388
Aktuelle Werte:

Kurz zur Geschichte der Einheiten

1717 stellt der Deutsche Physiker und Messinstrumentenbauer Daniel Gabriel Fahrenheit erstmals ein Glasrohr mit gleichmäßigen Innendurchmesser her. Daraus stellte er ein genaues Thermometer mit 3 Punkt Skala her, wobei er es aus unbekannten Gründen so eichte das der Gefrierpunkt von Wasser bei 32°F und der Siedepunkt bei 212°F lag.
Als Nullpunkt seiner Skala verwendete er die tiefste Temperatur, die er mit einer Eis-Salz-Kältemischung erzeugen konnte: −17,8 °C.
Heutzutage wird diese Skala noch in den USA verwendet.

          °F – 32
°C =   ——–
           1,8000

1742 schlug der schwedische Astronom Anders Celsius eine Skala vor die einen Siedepunkt von 0°C und einen Gefrierpunkt von 100°C hat.
Wenig später wurde die Skala in das heutige Format von Carl von Linné gebracht in dem die Fixpunkte der Skala vertauscht wurden.
Erstmals spielte der herrschende Luftdruck bei der Festlegung der beiden Fixpunkte eine Rolle.

Nerd Tip für Wetterbericht in der Linux Shell

curl wttr.in/Gütersloh?lang=de

Temperatur & Quarze

Da die Umgebungsluft Temperatur großen Einfluss auf die Genauigkeit eines Quarzes hat werden ab nun die aktuelle Temperatur sowie der Luftdruck alle 2 Minuten geloggt und auf der Hauptseite als Grafig dargestellt.

Realisiert werden die Messungen mit einem Bosch BMP388 Sensor auf einem Adafruit Breakout Board, welches per I2C an einem Raspberry Pi Zero W angeschlossen ist.
Im Momment funkt der PI noch seine Daten per Wlan zu diesem Server, der dann aus der Logfile alle 30 Minuten eine Grafig plottet.
Geplant ist das er in Zukunft direkt per OTG/SSH seine Daten sendet so das auf das Wlan verzichtet werden kann. Seinen Strom bekommt
der kleine PI ohnehin über die USB-3 Buchse vom Server auf die OTG Buchse.


Bosch BMP388
Das Oversampling für den Lufdruck Wert ist im Register osr_p auf 100 gesetzt was einem x8 entspricht.
Die Auflösung liegt dadurch bei 19 Bit / 0,33Pa.
Das Oversampling für die Temperatur ist im Register osr_t auf 010 gesetzt was einem x4 enspricht.
Die Auflösung liegt hier bei 18 bit / 0.0012 °C.
Der IIR filter ist auf 4.


Sensirion SHT85 (RH/T)
Werkskalibrierung
+/- 0.1°C Genauigkeit Temperatur
+/- 1,5% Genauigkeit Luftfeuchte
Interne Heizung
0,01% Feuchte Auflösung
0,01°C Temperatur Auflösung
PTFE Membran (IP67)
0,08% Jitter Feuchte im Highres Modus bei 3 Messungen
0,04°C Jitter Temperatur im Highres Modus bei 3 Messungen
Mit den °C und RH% Werten aus dem SHT85 Sensor kann man den Taupunkt nach der Magnus Formel berechnen:
(Werte sind in diesem Beispiel für >= 0°C, bei unter 0°C 272,62/22.46 nehmen!)

Magnus Formel Taupunkt
Ein kleines C Programm dazu.
Wichtig bei kompilieren ist hierbei das dem gcc ein ‚-lm‘ angehängt wird da ansonsten durch die hier benutzte ln (log) Funktion zu einer Fehlermeldung kommt.
Beispiel: gcc -lm -o test main.c

// gcc -lm -o new main.c
// -lm = Logarithmus, (libm einbinden)

#include <stdio.h>       // print
#include <stdint.h>
#include <math.h>        // Logarithmus Naturalis, signbit, sqrt
//------------------------------------------------------------------------

uint8_t a = 100;         // Konstante.
float b = 243.12;        // Konstante, wenn Temperatur >= 0°C.
float c = 17.62;         // Konstante, wenn Temperatur >= 0°C.
float d = 272.62;        // Konstante, wenn Temperatur < 0°C.
float e = 22.46;         // Konstante, wenn Temperatur < 0°C.

float vb = 1.0;          // Variable Konstante, nach Grad.
float vc = 1.0;          // Variable Konstante, nach Grad.

float grad = 30.560;     // Vom SHT85 || BMP388 lesen.
float feuchte = 36.420;  // Vom SHT85 lesen.

float tp = 0.0;
//------------------------------------------------------------------------

int main(void) {
	if (grad >= 0) {
		vb = b;
		vc = c;
        printf("Temperatur über 0°C.\n");
		tp = b*(((vc*grad)/(vb+grad))+log(feuchte/a)) / (((vc*vb)/(vb+grad))-log(feuchte/a));
	} else if (grad < 0) {
		vb = d;
		vc = e;
        printf("Temperatur unter 0°C.\n");
		tp = b*(((vc*grad)/(vb+grad))+log(feuchte/a)) / (((vc*vb)/(vb+grad))-log(feuchte/a));
     } else {
    	printf("Temperatur Wert nicht gegeben.\n");
	    return 0;
	}
//--------------------------------------------------------------------

	printf("TP: %.3f°C, Grad: %.3f°C, RH %.3f% \n", \
			tp, grad, feuchte);

  return 0;
}