#include <math.h>
#include <DHT.h> // For temperature/humidity sensor
// ======================
// SENSOR CONFIGURATION
// ======================
#define OUTDOOR_DHT_PIN 16 // GPIO16 for outdoor sensor
#define INDOOR_DHT_PIN 17 // GPIO17 for indoor sensor
#define DHT_TYPE DHT22 // Sensor type (DHT11, DHT21, DHT22)
DHT outdoorSensor(OUTDOOR_DHT_PIN, DHT_TYPE);
DHT indoorSensor(INDOOR_DHT_PIN, DHT_TYPE);
// ======================
// HUMIDITY CALCULATION
// ======================
float calculateMinHumidity(float outdoorTemp, float outdoorRH, float indoorTemp) {
// Handle invalid temperatures
if (isnan(outdoorTemp) || isnan(indoorTemp) || outdoorTemp < -40 || indoorTemp < -40) {
return NAN;
}
// Magnus formula calculation
float termOut = outdoorTemp / (outdoorTemp + 243.5);
float termIn = indoorTemp / (indoorTemp + 243.5);
float exponent = 17.67 * (termOut - termIn);
float minRH = outdoorRH * exp(exponent);
// Constrain to physical limits
return constrain(minRH, 0.0, 100.0);
}
// ======================
// SETUP & MAIN LOOP
// ======================
void setup() {
Serial.begin(115200);
outdoorSensor.begin();
indoorSensor.begin();
Serial.println("\nESP32 Minimum Humidity Calculator");
Serial.println("=================================");
}
void loop() {
// Read sensor data
float outdoorTemp = outdoorSensor.readTemperature(); // °C
float outdoorHumidity = outdoorSensor.readHumidity(); // %
float indoorTemp = indoorSensor.readTemperature(); // °C
// Check sensor readings
if (isnan(outdoorTemp) || isnan(outdoorHumidity) || isnan(indoorTemp)) {
Serial.println("Error: Failed to read sensors!");
delay(2000);
return;
}
// Calculate minimum achievable humidity
float minHumidity = calculateMinHumidity(outdoorTemp, outdoorHumidity, indoorTemp);
// Display results
Serial.print("Outdoor: ");
Serial.print(outdoorTemp, 1);
Serial.print("°C, ");
Serial.print(outdoorHumidity, 1);
Serial.println("% RH");
Serial.print("Indoor Temp: ");
Serial.print(indoorTemp, 1);
Serial.println("°C");
Serial.print("Min Achievable RH: ");
if (isnan(minHumidity)) {
Serial.println("Calculation Error");
} else {
Serial.print(minHumidity, 1);
Serial.println("%");
}
Serial.println("----------------------------");
delay(5000); // Update every 5 seconds
}
OUTSIDE
INSIDE