#include <Wire.h>
#include <U8glib.h>
#include <DHT.h>
#include <Encoder.h>
// Pin Definitions
#define DHTPIN1 2 // Pin for the first DHT-22 sensor (Air Intake)
#define DHTPIN2 3 // Pin for the second DHT-22 sensor (Exhaust)
#define RELAY_FAN_PIN 4 // Pin for the fan relay
#define RELAY_DEHUM_PIN 5 // Pin for the dehumidifier relay
#define ENCODER_CLK_PIN 6 // Rotary Encoder CLK Pin
#define ENCODER_DT_PIN 7 // Rotary Encoder DT Pin
#define ENCODER_SW_PIN 8 // Rotary Encoder Switch Pin (optional)
// Create DHT objects
DHT dht1(DHTPIN1, DHT22); // DHT-22 sensor for Air Intake
DHT dht2(DHTPIN2, DHT22); // DHT-22 sensor for Exhaust
// Create U8glib OLED object
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // Initialize U8glib with SSD1306 128x64
// Create Encoder object
Encoder encoder(ENCODER_CLK_PIN, ENCODER_DT_PIN);
// Variables
float humidityIntake = 0.0;
float humidityExhaust = 0.0;
float temperatureIntake = 0.0;
float targetHumidity = 50.0; // Default target humidity
const float HUMIDITY_THRESHOLD = 2.0; // Threshold to trigger the fan and dehumidifier
long previousPosition = 0;
void setup() {
Serial.begin(9600);
// Initialize DHT sensors
dht1.begin();
dht2.begin();
// Initialize relays
pinMode(RELAY_FAN_PIN, OUTPUT);
pinMode(RELAY_DEHUM_PIN, OUTPUT);
digitalWrite(RELAY_FAN_PIN, LOW);
digitalWrite(RELAY_DEHUM_PIN, LOW);
// Initialize rotary encoder
pinMode(ENCODER_SW_PIN, INPUT_PULLUP); // If using the switch pin
// Initialize display with starting values
updateDisplay();
}
void loop() {
// Read humidity and temperature from the DHT sensors
humidityIntake = dht1.readHumidity();
temperatureIntake = dht1.readTemperature(); // Read temperature from the intake sensor
humidityExhaust = dht2.readHumidity();
if (isnan(humidityIntake) || isnan(humidityExhaust) || isnan(temperatureIntake)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Read rotary encoder for target humidity
long position = encoder.read();
if (position != previousPosition) {
targetHumidity += (position - previousPosition) * 0.1; // Adjust target humidity based on encoder
targetHumidity = constrain(targetHumidity, 30.0, 80.0); // Keep target humidity within 30% to 80%
previousPosition = position;
updateDisplay();
}
// Control fan and dehumidifier based on humidity levels
if (humidityExhaust > targetHumidity + HUMIDITY_THRESHOLD) {
digitalWrite(RELAY_FAN_PIN, HIGH);
} else {
digitalWrite(RELAY_FAN_PIN, LOW);
}
if (humidityIntake > targetHumidity + HUMIDITY_THRESHOLD) {
digitalWrite(RELAY_DEHUM_PIN, HIGH);
} else {
digitalWrite(RELAY_DEHUM_PIN, LOW);
}
delay(200); // Short delay for better responsiveness
}
void updateDisplay() {
u8g.firstPage();
do {
u8g.setFont(u8g_font_6x10); // Set font size
// Display title on top line
u8g.drawStr(0, 10, "Wetsuit Dryer Unit");
// Display intake temperature
u8g.drawStr(0, 25, "Intake Temp:");
u8g.setPrintPos(0, 35);
u8g.print(temperatureIntake);
u8g.print("C");
// Display humidity readings
u8g.drawStr(0, 45, "Air Intake Humidity:");
u8g.setPrintPos(0, 55);
u8g.print(humidityIntake);
u8g.print("%");
u8g.drawStr(0, 65, "Exhaust Humidity:");
u8g.setPrintPos(0, 75);
u8g.print(humidityExhaust);
u8g.print("%");
u8g.drawStr(0, 85, "Target Humidity:");
u8g.setPrintPos(0, 95);
u8g.print(targetHumidity);
u8g.print("%");
} while (u8g.nextPage());
}