// #include <Wire.h>
#include "bmp085.h"
#include "DHT.h"
// Globale Konstanten
constexpr byte DHTPIN {2};
//constexpr byte DHTTYPE {DHT11};   // DHT 11
constexpr byte DHTTYPE {DHT22};   // DHT 22  (AM2302), AM2321
//constexpr byte DHTTYPE {DHT21};   // DHT 21 (AM2301)
// Globale Variablen / Objekte
DHT dht(DHTPIN, DHTTYPE);
BMP085 bmp;
void setup() {
    Serial.begin(9600);
    Serial.println("Initializing BMP085 sensor...");
    bmp.begin();
    dht.begin();
    Serial.println("Sensor initialized.");
}
void loop() {
    // Get temperature
     // Messung der Temperatur und des Drucks mit dem BMP085
    float temperatureC = bmp.getTemperature();  // Temperatur in °C
    float pressurePa = bmp.getPressure();       // Druck in Pascal
    // Messungg der Luftfeucht und Temperatur mit dem DHT 22
    float luftfeuchte = dht.readHumidity(); // Lesen der Luftfeuchtigkeit und speichern in die Variable luftfeuchte
    float temperatur = dht.readTemperature(); // Lesen der Temperatur in °C und speichern in die Variable temperatur
    
    // Temperatur in Kelvin umrechnen
    float temperatureK = temperatureC + 273.15;
    // Berechnung des Sättigungsdampfdrucks (e_s in Pa)
    float e_s = 6.1078 * pow(10, (7.5 * temperatureC) / (temperatureC + 237.3)) * 100;
    // Berechnung des Partialdrucks von Wasserdampf (P_w in Pa)
    float P_w = (e_s * luftfeuchte) / 100.0;
    // Partialdruck der trockenen Luft (P_d in Pa)
    float P_d = pressurePa - P_w;
    // Gaskonstanten für trockene Luft und Wasserdampf
    const float R_d = 287.05; // J/(kg·K)
    const float R_w = 461.5;  // J/(kg·K)
    // Berechnung der Luftdichte (in kg/m^3)
    float airDensity = (P_d / (R_d * temperatureK)) + (P_w / (R_w * temperatureK));
    Serial.print("Temperature: ");
    Serial.print(temperatureC);
    Serial.println(" C");
    // Get pressure
    long pressure = bmp.getPressure();
    Serial.print("Pressure: ");
    Serial.print(pressure);
    Serial.println(" Pa");
    // Calculate altitude
    float altitude = bmp.calculateAltitude(pressure);
    Serial.print("Altitude: ");
    Serial.print(altitude);
    Serial.println(" m");
    // Calculate air densitiy
    Serial.print("Air Density: ");
    Serial.print(airDensity);
    Serial.println(" kg/m^3");
    // Wait before next reading
    delay(2000);
}