Beim Durchstöbern meines Elektronikschuppens stieß ich auf einen Sensor zum Messen des Luftdrucks und der Temperatur. Schnell wanderten zwei davon (sollte einem der Tod ereilen) in meinem Einkaufskorb und anschließend auf meinem Basteltisch. Als Controller wählte ich einen NodeMCU, die Ich auf Vorrat bei mir zu Hause habe. Warum ich gerade dieses Teil verwende, könnt Ihr hier nachlesen.
Der Sensor war ein BMP 180, der schon einen Nachfolger mit größerer Präzision hat, aber für einen ersten Versuch ausreichend ist.
Hier ein paar technische Daten:
- Bei einer maximalen Auflösung von 0,02 hPa kann der Chip theoretisch einen Höhenunterschied von 17 cm erkennen.
- Aufgrund des Festspannungsreglers kann er sowohl mit 5 V als auch 3,3 V betreiben werden.
- Gemessen werden sowohl der Luftdruck als auch die Temperatur.
Für mich war ausschließlich der Luftdruck von Interesse, Temperaturfühler hatte ich in meiner Wetterstation und der Platz, an dem ich meinen Sensor aufstellen wollte, würde auf Grund der Lage und der Sonneneinstrahlung ziemlich warm werden
Die Verdrahtung ist simpel, wie aus der Abbildung zu sehen ist.

Nachfolgend der Code. Ich bin nicht der professionelle Programmierer und suche mir die Programmcodes aus dem Internet zusammen. Dank an dieser Stelle an Alle, die ihre Codes zur Verfügung stellen.
Sollte jemand Verbesserungsvorschläge haben, bitte einfach in die Kommentare schreiben.
/*
* BMP180 Interface with ESP8266 Code Example
* https://circuits4you.com
* March 2019
* adaptiert Sebastian Binder
* October 2020
*
Hardware connections:
NodeMCU BMP180
3.3V VIN
GND GND
D1 SCL
D2 SDA
(WARNING: do not connect + to 5V or the sensor will be damaged!)
*/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <SFE_BMP180.h>
#include <Wire.h>
const char* SSID = "xxxxxxxxx";
const char* PSK = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const char* MQTT_BROKER = "192.168.178.36";
// You will need to create an SFE_BMP180 object, here called "pressure":
SFE_BMP180 pressure;
#define ALTITUDE 294.0 // Seehöhe des eigenen Orts
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
char* druck2;
double druck1 = 0;
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(MQTT_BROKER, 1883);
Serial.begin(115200);
Serial.println("REBOOT");
// Initialize the sensor (it is important to get calibration values stored on the device).
if (pressure.begin())
Serial.println("BMP180 init success");
else
{
Serial.println("BMP180 init fail\n\n");
while(1); // Pause forever.
}
}
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(SSID);
WiFi.hostname("luftdruck");
WiFi.begin(SSID, PSK);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Reconnecting...");
if (!client.connect("ESP8266Client")) {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" retrying in 5 seconds");
delay(10000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
snprintf (msg, 50, "Alive since %ld milliseconds", millis());
Serial.print("Publish message: ");
Serial.println(msg);
char status;
double T,P,p0,a;
Serial.println();
Serial.print("Seehöhe: ");
Serial.print(ALTITUDE,0);
Serial.print(" Meter, ");
Serial.print(ALTITUDE*3.28084,0);
Serial.println(" Feet");
status = pressure.startTemperature();
if (status != 0)
{
// Wait for the measurement to complete:
delay(status);
status = pressure.getTemperature(T);
if (status != 0)
{
// Print out the measurement:
Serial.print("Temperatur: ");
Serial.print(T,1);
Serial.print(" deg C, ");
Serial.print((9.0/5.0)*T+32.0,2);
Serial.println(" deg F");
status = pressure.startPressure(3);
if (status != 0)
{
// Wait for the measurement to complete:
delay(status);
status = pressure.getPressure(P,T);
if (status != 0)
{
// Print out the measurement:
Serial.print("absolute pressure: ");
Serial.print(P,2);
Serial.print(" mb, ");
Serial.print(P*0.0295333727,2);
Serial.println(" inHg");
p0 = pressure.sealevel(P,ALTITUDE); // we're at 1655 meters (Boulder, CO)
Serial.print("relative (sea-level) pressure: ");
Serial.print(p0,2);
druck2="";
dtostrf (p0,7, 1, druck2);
client.publish("meinTopic/luftdruck", druck2);
Serial.print(" mb, ");
Serial.print(p0*0.0295333727,2);
Serial.println(" inHg");
a = pressure.altitude(P,p0);
Serial.print("computed altitude: ");
Serial.print(a,0);
Serial.print(" meters, ");
Serial.print(a*3.28084,0);
Serial.println(" feet");
}
else Serial.println("error retrieving pressure measurement\n");
}
else Serial.println("error starting pressure measurement\n");
}
else Serial.println("error retrieving temperature measurement\n");
}
else Serial.println("error starting temperature measurement\n");
delay(60000); // Pause for 1 Minute
}
In der Zeile 158 ist der Intervall auf 1 Minute eingestellt. In der Praxis ist aber ein größerer zeitlicher Abstand sinnvoller, da der Luftdruck sich nicht sehr schnell ändert.
Wie aus dem Code in der Zeile 24 ersichtlich ist, habe ich auf meinem Raspi, auf dem auch Openhab läuft, unter der IP 192.168.178.26 und dem Port 1883 den MQTT-Broker eingerichtet.
In den Items, in einem eigenem File namens mqtt.items (zum leichteren Auffinden) ein Item eingefügt
Number Luftdruck "Luftdruck" {channel="mqtt:topic:055155c8:luftdruck"}
und dann noch in der site die Zeile
Text item=Luftdruck label="Luftdruck"
So sieht mein fertiger Aufbau aus. Ist vielleicht nicht der schönste, aber für mich ausreichend.
Für Anregungen einfach in die Kommentare schreiben.