PID Reglung mit PWM Lüfter

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);
}


Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Welchen Controller verwendest Du? Bei den 8 Bit Arduino ist double wie float.

Gruß Tommy

Ein Regler hat 1 soll, 1 ist, 1 stellgröße.

Wenn du 2 Sachen regeln willst, ist die Frage, wie die zusammenhängen:

  • gar nicht, dann hast du zwei unabhängige Regler
  • der eine steuert den andern (stellgröße des äusseren ist der sollwert des unterlagerten)
  • sonst hast du ein Problem.

ich verwende ein esp8266 D1 mini

hmm aber der vorhanden Regler im code ist in ordnug ?

Du kannst nicht zwei Regler denselben Ausgang (fanspeed) setzen lassen.

1 Like

ja ok das muss ich anders machen

Hallo,
Ich denke mal Du benötigst erst mal eine Analyse deine Regelstrecke. Welche Abhängigkeiten haben Temperatur und Luffeuchte auf das was Du regeln willst. Was willst Du letztlich erreichen mit dem Lüfter. Macht er es wärmer oder kälter. Steigt die Luftfeuchte mit dem Lüfter oder fällt sie.

Stell Dir vor Du hast eine Heizung und du willst die Temperatur regeln. Dazu gibt einen Lüfter und ein Heizregister das die Luft erwärmt. Die erwärmte Luft darf aber eine bestimmte Temperatur nicht überschreiten. Mit der Luft soll dann letztlich eine Eisenplatte erwärmt werden, und auf diese Temperatur der Eisenplatte soll letztlich geregelt werden.

Das heißt eigentlich hast Du zwei Regelkreise , einen für die Luft und einen für die Eisenplatte. Die Temperatur der Eisenplatte ist abhängig von der Lufttemperatur. Das Heizregister erwärmt die Luft und die Luft die Eisenplatte. Die Temperatur der Eisenplatte ist abhängig von der Lufttemperatur. Dazu könnte man den Regelkreis für die Luft unterlagern und mit einer Begrenzerstufe versehen. Damit hast Du dann die Stellgrösse des äußeren Reglers auf den Sollwert des inneren Reglers geschaltet.

Für andere Regelstrecken könnte es z.B sinnvoll sein die beiden Stellgrößen der Regler als Summe / Differenz weiter zu verarbeiten.

Die Aufgabenstellung ein Raumklima mit einem Lüfter zu regeln , um z.B Schimmel zu vermeiden, wurde hier schon mehrfach behandelt.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.