Ich habe diesen Code geschrieben wollt fragen ob das so geht oder ob da ein Logik Fehler drin ist?
Will mit dem Code ein Lüfter PWM steuern. Der Lüfter soll nach Luftfeuchte und Temperatur Regeln. Allerdings habe ich jz erstmal nur Luftfeucht gemacht.
Ich weiß nicht ob das jz so richtig ist.
Außerdem will ich ja auch noch nach Temperatur regeln und weiß nicht wie ich das umsetzen soll.
// Sensoren
#include <Wire.h>
#include <Adafruit_AHTX0.h>
Adafruit_AHTX0 aht1, aht2;
double maxHumidity, maxTemperature;
// Lüfter
#include <PID_v1_bc.h>
// Pin für PWM-Steuerung des Lüfters
const int fanPin = D4;
// Variablen für die Soll-Luftfeuchtigkeit, gemessene Luftfeuchtigkeit und Temperatur
double setpointHumidity = 50.0; // Soll-Luftfeuchtigkeit in Prozent
double setpointTemperature = 22.5; // Soll-Temperatur in Celsius
double fanSpeed;
// PID-Reglerparameter
double KpH = 40.0; // Proportional-Gain
double KiH = 2.0; // Integral-Gain
double KdH = 10.0; // Derivative-Gain
PID pidHumidity(&maxHumidity, &fanSpeed, &setpointHumidity, KpH, KiH, KdH, DIRECT);
// PID-Reglerparameter für Temperatur
double KpT = 10.0; // Proportional-Gain
double KiT = 0.5; // Integral-Gain
double KdT = 5.0; // Derivative-Gain
PID pidTemperature(&maxTemperature, &fanSpeed, &setpointTemperature, KpT, KiT, KdT, DIRECT);
//Zeit
unsigned long previousMillis = 0;
const long interval = 2000; // Intervall in Millisekunden (2 Sekunden)
void setup() {
Serial.begin(115200);
// Sensor
Wire.begin(); // Initialisiere die Wire-Bibliothek vor der Sensorinitialisierung
aht1.begin(&Wire, 0, 0x38); //Büro Ecke
aht2.begin(&Wire, 1, 0x39); // Bett Ecke
// Lüfter
// PWM-Steuerung für Lüfter initialisieren
pinMode(fanPin, OUTPUT);
// PID-Regler für Luftfeuchtigkeit konfigurieren
pidHumidity.SetMode(AUTOMATIC);
// PID-Regler für Temperatur konfigurieren
pidTemperature.SetMode(AUTOMATIC);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
Datenerfassung();
}
PID();
}
void Datenerfassung() {
sensors_event_t humidity1, temp1, humidity2, temp2;
aht1.getEvent(&humidity1, &temp1); //Büro Ecke
aht2.getEvent(&humidity2, &temp2); //Bett Ecke
maxTemperature = max(temp1.temperature, temp2.temperature);
maxHumidity = max(humidity1.relative_humidity, humidity2.relative_humidity);
Serial.print("Temperature Büro Ecke: ");
Serial.print(temp1.temperature);
Serial.print(" Temperature Bett Ecke: ");
Serial.print(temp2.temperature);
Serial.print(" || Humidity Büro Ecke: ");
Serial.print(humidity1.relative_humidity);
Serial.print("%");
Serial.print(" Humidity Bett Ecke: ");
Serial.print(humidity2.relative_humidity);
Serial.println("%");
Serial.println(fanSpeed);
}
void PID() {
// PID-Regler für Luftfeuchtigkeit aktualisieren
pidHumidity.Compute();
// PID-Regler für Temperatur aktualisieren
pidTemperature.Compute();
// Lüfterdrehzahl basierend auf dem PID-Ausgang einstellen (0-255 für PWM)
fanSpeed = map(maxHumidity, 0, 100, 0, 255);
fanSpeed = constrain(fanSpeed, 0, 255); // Sicherstellen, dass der Wert im gültigen Bereich liegt
analogWrite(fanPin, fanSpeed);
}