/*
Messung der Temperatur und Feuchte mit einem DHT22-Sensor
Berechnung des Sättigungsdampfdruck SVP
Berechnung des VPD (Vapor Pressure Deficit)
Regelung der Temperatur und der Luftfeuchtigkeit anhand des VPD-Wertes
Regelung der Heizung, des Luftbefeuchters und der Entlüftung
*/
//******************************************************************************
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
//******************************************************************************
#define DHT_PIN 6 // Temperatur & Feuchte Sensor DHT22 an Pin 6
#define DHTTYPE DHT22
#define HEAT_PIN 7 // Heizmatte an Pin 7
#define MOIST_PIN 8 // Luftbefeuchter an Pin 8
#define FAN_PIN 9 // PWM-Signal für Lüfter an Pin 9
//#define TACHO_PIN 2 // Lüftergeschwindigkeit (2 Pulse pro Umdrehung )
#define Hmin 41 // min. Feuchtigkeit
#define Hmax 55 // max. Luftfeuchte
#define Tmin 22 // min. Temperatur
#define Tmax 28 // max. Temperatur
#define interval_dht 2000
#define intervalMoist 1000
#define delayMoist 10000
#define intervalSerialPrint 1000
//******************************************************************************
//dht DHT; // DHT22 Sensor initialisieren
DHT dht (DHT_PIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4); // LCD mit 4 Zielen à 20 Spalten
// *****************************************************************************
unsigned long startMillis_dht;
unsigned long startTimeIntervalMoist = 0;
unsigned long startTimeDelayMoist = 0;
//unsigned long previousMillisSerialPrint = 0;
//******************************************************************************
float dht_t; // Temperatur
float dht_h; // Feuchtigkeit
float VPD; // Vapor pressure deficiet
float SVP; // Sättigungsdampfdruck
boolean HEAT_I = true; // Heizung
boolean MOIST_I = true; // Luftbefeuchter
boolean MOIST_F = false;
unsigned int pwm_fan;
//******************************************************************
void setup() {
dht.begin(); // DHT22 Sensor starten
startMillis_dht = millis(); // Initial start time (DHT22)
//TCCR1B = TCCR1B & 0b11111000 | 0x01; // Setzt Timer1 (Pin 9 und 10) auf 31300Hz
TCCR1A = 0; // undo the configuration done by...
TCCR1B = 0; // ... the Arduino core library
TCNT1 = 0; // reset Timer
TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM11); // undo default timers
TCCR1B = _BV(WGM13) | _BV(CS10); // for Pins 9 & 10
ICR1 = 320; // PWM will be 0 to 320 instead of 0 to 255 -> 25kHz
pinMode(FAN_PIN, OUTPUT);
//pinMode(TACHO_PIN, INPUT);
//attachInterrupt(digitalPinToInterrupt(2), counter, RISING); // Tachosignal an D2 mit 10K 5V Pullup
//attachInterrupt(0, counter, FALLING);
pinMode(HEAT_PIN, OUTPUT); // Heizung
digitalWrite(HEAT_PIN, LOW); // Ausschalten
pinMode(MOIST_PIN, OUTPUT); // Luftbefeuchter
digitalWrite(MOIST_PIN, LOW); // Ausschalten
pinMode(LED_BUILTIN, OUTPUT); // Kontroll LED für Loop
lcd.init();
lcd.clear();
lcd.backlight();
/* Serial.begin(115200);
Serial.flush();
delay(500);
*/
}
//***************************************************************************
void loop() {
readSensor();
//tacho();
Luefterregelung();
Regelung();
printLCD();
//Plotter();
}
//**************************************************************************
void readSensor() {
//Zeile 4
lcd.setCursor(19,3);
lcd.print("1");
unsigned long currentMillis_dht = millis();
if (currentMillis_dht - startMillis_dht >= interval_dht) {
startMillis_dht = currentMillis_dht;
dht_t = dht.readTemperature(); // Temperatur auslesen
dht_h = dht.readHumidity(); // Luftfeuchte auslesen
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
}
//*****************************************************************************
void Regelung() {
//Zeile 4
lcd.setCursor(19,3);
lcd.print("2");
float a = 7.5;
float b = 237.3;
//float SVP; //Sättigungsdampfdruck in hPa
// Berechnung Sättigungsdampfdruck
SVP = (6.1078 * 100) * pow(10, (a * dht_t) / (b + dht_t)); // Sättigungsdampfdruck in hPa (saturation vapor pressure)
VPD = ((((100 - dht_h) / 100) * SVP)/1000); // VPD-Wert
if (dht_t < Tmin) // Sensor-Temperatur kleiner als Mindest-Temperatur
HEAT_I = true;
if (dht_t > Tmax)
HEAT_I = false;
if (dht_h < Hmin)
MOIST_I = true;
if (dht_h > Hmax)
MOIST_I = false;
if (HEAT_I) {
digitalWrite(HEAT_PIN, HIGH);
}
if (!HEAT_I) {
digitalWrite(HEAT_PIN, LOW);
}
if (MOIST_I && !MOIST_F) {
digitalWrite(MOIST_PIN, HIGH);
MOIST_F = true;
startTimeIntervalMoist = millis();
}
if (digitalRead(MOIST_PIN) && millis() - startTimeIntervalMoist > intervalMoist) {
digitalWrite(MOIST_PIN, LOW);
startTimeDelayMoist = millis();
}
if (!digitalRead(MOIST_PIN) && millis() - startTimeDelayMoist > delayMoist) {
MOIST_F = false;
}
}
//************************************************************************************
void Luefterregelung() {
//Zeile 4
lcd.setCursor(19,3);
lcd.print("3");
//* Lüftersteuerung
// Lüftergeschwindigkeit über den Temperaturbereich einstellen
// Tmin->0% PWM | Tmax->100% PWM
unsigned int pwm_temp;
unsigned int pwm_hum;
pwm_temp = map(constrain(dht_t, Tmin, Tmax), Tmin, Tmax, 0, 320);
pwm_hum = map(constrain(dht_h, Hmin, Hmax), Hmin, Hmax, 0, 320);
pwm_fan = max(pwm_temp, pwm_hum);
analogWrite(FAN_PIN, pwm_fan);
}
//***********************************************************************************
/* void tacho() {
//takt_vent = digitalRead(takt_ventPin);
currentMillis_vent = millis();
while((millis() - currentMillis_vent) < interval_vent) {
}
rpm_vent = takt_ventCounter * 3; // 60/2
takt_ventCounter = 0;
}
void counter(){
takt_ventCounter++;
} */
// ****** LCD ***************************************************************
void printLCD () {
//Zeile 4
lcd.setCursor(19,3);
lcd.print("4");
//Zeile 1
lcd.setCursor(0,0);
lcd.print("T:");lcd.print(dht_t,1);lcd.print(" \337C ");
//Zeile 2
lcd.setCursor(0,1);
lcd.print("F:");lcd.print(dht_h,1);lcd.print(" %rF");
//Zeile 1
lcd.setCursor(11,0);
lcd.print("Heat: ");
if (HEAT_I == true) {
lcd.print("ON ");
} else if (HEAT_I == false) {
lcd.print("OFF");
}
//Zeile 2
lcd.setCursor(11,1);
lcd.print("Moist:");
if (MOIST_I == true) {
lcd.print("ON ");
} else if (MOIST_I == false){
lcd.print("OFF");
}
//Zeile 3
lcd.setCursor(0,2);
lcd.print("VPD:");lcd.print(VPD,2);
lcd.setCursor(11,2);
lcd.print("FAN: ");lcd.print(map(pwm_fan, 0, 320, 0, 100));lcd.print("% ");
//Zeile 4
lcd.setCursor(0,3);
lcd.print("SVP: ");lcd.print(SVP,0);lcd.print(" hPa ");
}
/*
void Plotter () {
unsigned long currentMillisSerialPrint = millis();
if (currentMillisSerialPrint - previousMillisSerialPrint >= intervalSerialPrint){
previousMillisSerialPrint = currentMillisSerialPrint;
Serial.print(dht_t); Serial.print('\t');
Serial.print(dht_h); Serial.print('\t');
Serial.print(VPD); Serial.print('\t');
Serial.print(pwm_fan); Serial.print('\t');
Serial.println();
}
}
*/