Kleines Update. Ich bin über das Breadboard hinaus... Hier einige Bilder:

Und hier der letzt Stand des Codes:
#include <DHT.h> // DHT library
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display
#define DHTPIN_IN 13 // Pin to which the sensor is connected
#define DHTPIN_OUT 12 // Pin to which the sensor is connected
#define DHTTYPE DHT22 // Sensor pins = 1:5V, 2:Data, 3:Not connected, 4:GND + 10kOhm from 1 -> 2
DHT dht_IN(DHTPIN_IN, DHTTYPE);
DHT dht_OUT(DHTPIN_OUT, DHTTYPE);
int relais_IN = 7; //Luft IN den Keller ziehen
int relais_OUT = 8; //Luft AUS dem Keller ziehen
const double UG = 8314.3; // J/(kmol*K) (universelle Gaskonstante)
const double mw = 18.016; // kg/kmol (Molekulargewicht des Wasserdampfes)
const double K = 273.15; // °K (Entspricht 0°K)
const double tp = 6.1078; // hPa Triplettpunkt von Wasser bei 0,01°C
unsigned long temp_timestore; // Variable for system time
unsigned long max_Fan_time; // Variable for system time
void setup() {
pinMode(relais_IN, OUTPUT);
pinMode(relais_OUT, OUTPUT);
digitalWrite(relais_IN, LOW);
digitalWrite(relais_OUT, LOW);
Serial.begin(9600);
dht_IN.begin(); //Sensoren initialisieren
dht_OUT.begin();
lcd.init(); //Initialize the lcd
lcd.backlight(); //Backlight on
lcd.setCursor(7, 0);
lcd.print("IN");
lcd.setCursor(13, 0);
lcd.print("OUT");
lcd.setCursor(0, 1);
lcd.print("TEMP :");
lcd.setCursor(19, 1);
lcd.print("C");
lcd.setCursor(0, 2);
lcd.print("relHU:");
lcd.setCursor(19, 2);
lcd.print("%");
lcd.setCursor(0, 3);
lcd.print("absHU:");
lcd.setCursor(19, 3);
lcd.print("g");
}
void loop() {
//READ SENSOR
if (millis() - temp_timestore > 2000 ) { //Interval for readout
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float relHum_IN = dht_IN.readHumidity();
double aktTemp_IN = dht_IN.readTemperature(); // Read temperature as Celsius (the default)
float relHum_OUT = dht_OUT.readHumidity();
double aktTemp_OUT = dht_OUT.readTemperature(); // Read temperature as Celsius (the default)
//CALCULATIONS
double calcDewPoint_IN(double aktTemp_IN, float relHum_IN);
double calcDewPoint_OUT(double aktTemp_OUT, float relHum_OUT);
{
double a, b;
if (aktTemp_OUT >= 0)
{
a = 7.5;
b = 237.3;
}
else
{
a = 7.6;
b = 240.7;
}
// Berechnung des Sättigungsdampfdrucks in hPa
double SDD_IN = tp * pow(10, ((a * aktTemp_IN) / (b + aktTemp_IN)));
double SDD_OUT = tp * pow(10, ((a * aktTemp_OUT) / (b + aktTemp_OUT)));
// Berechnung des Dampfdrucks in hPa
double DD_IN = relHum_IN / 100 * SDD_IN;
double DD_OUT = relHum_OUT / 100 * SDD_OUT;
// Berechnung der Taupunkttemperatur in °C
double v_IN = log(DD_IN / tp) / log(10);
double v_OUT = log(DD_OUT / tp) / log(10);
double dewPoint_IN = b * v_IN / (a - v_IN);
double dewPoint_OUT = b * v_OUT / (a - v_OUT);
//Calculate absolute Humidity (in g/m³)
double absHum_IN = 100000 * mw / UG * relHum_IN / 100 * tp * pow(10, ((a * aktTemp_IN) / (b + aktTemp_IN))) / (aktTemp_IN + 273.15);
double absHum_OUT = 100000 * mw / UG * relHum_OUT / 100 * tp * pow(10, ((a * aktTemp_OUT) / (b + aktTemp_OUT))) / (aktTemp_OUT + 273.15);
//ACT FANS LOGIC
if (aktTemp_IN <= 18) //Indoor Temp <18°C => OFF
{
digitalWrite(relais_IN, LOW);
digitalWrite(relais_OUT, LOW);
}
else
{
if (relHum_IN >= 65 && absHum_IN < absHum_OUT)
{
digitalWrite(relais_OUT, LOW);
digitalWrite(relais_IN, HIGH);
}
else
{
if (relHum_IN >= 65 && absHum_IN > absHum_OUT)
{
digitalWrite(relais_OUT, HIGH);
digitalWrite(relais_IN, LOW);
}
else
{
if (relHum_IN <= 55 || millis() - max_Fan_time > 900000) //If IndoorHum < 55%rel or Fan act for > 15min => OFF
{
digitalWrite(relais_IN, LOW);
digitalWrite(relais_OUT, LOW);
}
}
}
}
//PRINT TO DISPLAY
lcd.setCursor(7, 1);
lcd.print(aktTemp_IN);
lcd.setCursor(13, 1);
lcd.print(aktTemp_OUT);
lcd.setCursor(7, 2);
lcd.print(relHum_IN);
lcd.setCursor(13, 2);
lcd.print(relHum_OUT);
lcd.setCursor(7, 3);
lcd.print(absHum_IN);
lcd.setCursor(13, 3);
lcd.print(absHum_OUT);
//PRINT TO SERIAL MONITOR
Serial.print("IN: ");
Serial.print("relHum: ");
Serial.print(relHum_IN);
Serial.print("%\t");
Serial.print("Temp: ");
Serial.print(aktTemp_IN);
Serial.print(" *C");
Serial.print(" \t");
Serial.print("DewPoint: ");
Serial.print(dewPoint_IN);
Serial.print(" *C");
Serial.print(" \t");
Serial.print("absHum: ");
Serial.print(absHum_IN);
Serial.println(" g/m3 ");
Serial.print("OUT: ");
Serial.print("relHum: ");
Serial.print(relHum_OUT);
Serial.print("%\t");
Serial.print("Temp: ");
Serial.print(aktTemp_OUT);
Serial.print(" *C");
Serial.print(" \t");
Serial.print("DewPoint: ");
Serial.print(dewPoint_OUT);
Serial.print(" *C");
Serial.print(" \t");
Serial.print("absHum: ");
Serial.print(absHum_OUT);
Serial.println(" g/m3 ");
}
temp_timestore = millis(); //Save System time for next interval
max_Fan_time = millis(); //Save System time for next interval
}
}
Was nun noch fehlt ist, eine "Klappensteuerung" die die Lüfter verschließt, wenn sie nicht laufen. Außerdem hätte ich gerne, dass wenn die Lüfter 15min gelaufen sind, eine Pause von 5min folgt, damit sich die Messwerte stabilisieren können. Was das angeht, stehe ich aber gerade auf dem Schlauch...