#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define DHTPIN 2 // DHT22 adat pin csatlakoztatása a digitális 2-es pinhez
#define DHTTYPE DHT22 // DHT22 típusú érzékelő
#define ONE_WIRE_BUS 3 // DS18B20 adat pin csatlakoztatása a digitális 3-as pinhez
#define HEATER_PIN 4 // Fűtőszál vezérlő PWM pin
DHT dht(DHTPIN, DHTTYPE);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
const float targetTemp = 2.0; // Célhőmérséklet a párapont fölött
float currentTemp = 0.0;
float currentHumidity = 0.0;
float mirrorTemp = 0.0;
void setup() {
pinMode(HEATER_PIN, OUTPUT);
digitalWrite(HEATER_PIN, LOW);
dht.begin();
sensors.begin();
Serial.begin(9600);
}
void loop() {
// Páratartalom és hőmérséklet mérése
currentHumidity = dht.readHumidity();
currentTemp = dht.readTemperature();
sensors.requestTemperatures();
mirrorTemp = sensors.getTempCByIndex(0);
if (isnan(currentHumidity) || isnan(currentTemp)) {
Serial.println("Error: Failed to read from DHT sensor");
return;
}
if (mirrorTemp == DEVICE_DISCONNECTED_C) {
Serial.println("Error: Could not read temperature data from DS18B20");
return;
}
Serial.print("Current Temperature: ");
Serial.print(currentTemp);
Serial.println("°C");
Serial.print("Current Humidity: ");
Serial.print(currentHumidity);
Serial.println("%");
Serial.print("Mirror Temperature: ");
Serial.print(mirrorTemp);
Serial.println("°C");
// Párapont kiszámítása
float dewPoint = calculateDewPoint(currentTemp, currentHumidity);
Serial.print("Dew Point: ");
Serial.print(dewPoint);
Serial.println("°C");
// Fűtőszál vezérlése
int heaterPWM = calculatePWM(mirrorTemp, dewPoint + targetTemp);
analogWrite(HEATER_PIN, heaterPWM);
delay(2000); // 2 másodpercenként mérés
}
float calculateDewPoint(float temp, float humidity) {
// Magnus formula a párapont kiszámításához
const float A = 17.27;
const float B = 237.7;
float alpha = ((A * temp) / (B + temp)) + log(humidity / 100.0);
float dewPoint = (B * alpha) / (A - alpha);
return dewPoint;
}
int calculatePWM(float currentTemp, float targetTemp) {
float error = targetTemp - currentTemp;
int pwmValue = (int)(error * 25.5); // Egyszerű arányos vezérlés
pwmValue = constrain(pwmValue, 0, 255); // PWM érték 0 és 255 között
return pwmValue;
}