Regulation PID et Relais

Salut à tous,
J'ai quelques soucis avec la régulation PID pour chauffer un liquide.
Pour mes essais j'utilise une sonde DS18B20 immergée dans une bouilloire commandée par un relais.
Lorsque je lance le programme, la température monte mais ne s’arrête jamais sur la valeur de consigne et continue à monter.
Quelqu'un a une idée?
Le code :

#include <PID_v1.h>
#define RelayPin 9    //D6

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 8
float temp;

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress tempSensor;
double Setpoint, Input, Output;

double Kp = 0.5, Ki = 1, Kd = 2;

PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

int WindowSize = 5000;       

unsigned long windowStartTime;


void setup()
{
  Serial.begin(115200);
  pinMode(RelayPin, OUTPUT);
  windowStartTime = millis();
  sensors.begin();
  myPID.SetOutputLimits(0, WindowSize);
  myPID.SetMode(AUTOMATIC);
}

void loop()
{
    Input = sensors.getTempCByIndex(0);
    Serial.println(sensors.getTempCByIndex(0));
    Setpoint = 70;
  
    myPID.Compute();



  if (millis() - windowStartTime > WindowSize)
  {
    windowStartTime += WindowSize;
  }
  if (Output < millis() - windowStartTime)
  { 
    digitalWrite(RelayPin, HIGH); //ON
  }
  else if (Output > millis() - windowStartTime)
  { 
    digitalWrite(RelayPin, LOW);                                 //OFF
  }

}

Bonjour,

Je ne comprends pas bien ce que tu veux faire. Tu repars sur un nouveau cycle avant d'avoir appliqué la consigne.
Après le calcul, il faut appliquer la consigne, c'est à dire allumer pendant le temps calculé puis éteindre jusqu'à la fin de le fenêtre.

void loop()
{
    Input = sensors.getTempCByIndex(0);
    Serial.println(sensors.getTempCByIndex(0));
    Setpoint = 70;
  
    myPID.Compute();

    digitalWrite(RelayPin, HIGH); //ON
    delay(Output);
    digitalWrite(RelayPin, LOW);                                 //OFF
    delay(WindowSize-Output);
}

:slight_smile: http://www.rhaaa.fr/regulation-pid-comment-la-regler-12

kamill:
Bonjour,

Je ne comprends pas bien ce que tu veux faire. Tu repars sur un nouveau cycle avant d'avoir appliqué la consigne.
Après le calcul, il faut appliquer la consigne, c'est à dire allumer pendant le temps calculé puis éteindre jusqu'à la fin de le fenêtre.

void loop()

{
    Input = sensors.getTempCByIndex(0);
    Serial.println(sensors.getTempCByIndex(0));
    Setpoint = 70;
 
    myPID.Compute();

digitalWrite(RelayPin, HIGH); //ON
    delay(Output);
    digitalWrite(RelayPin, LOW);                                //OFF
    delay(WindowSize-Output);
}

Bonjour,
J'ai peut-être mal expliqué ma démarche, en gros je veux chauffer un liquide à une température constante,
j'ai une sonde qui relève la température et un élément chauffant connecté à un relais qui va s'allumer ou non.
Au début j'ai fait un commande avec une boucle if, mais comme la température continue à monter après l'extinction du relais je n'arrive pas à avoir une régulation "propre" du coup j'ai pensé que la librairie PID pouvait m'aider à anticiper la montée de temperature, mais j'avoue que pour le moment c'est un echec... :frowning:

je t'invite à consulter le lien que je t'ai posté au dessus :slight_smile:

dfgh:
je t'invite à consulter le lien que je t'ai posté au dessus :slight_smile:

Oui je l'avais déjà vu, mais je voulais me faciliter la vie avec la bibliothèque :wink:

Re,

s3basti3n:
Oui je l'avais déjà vu, mais je voulais me faciliter la vie avec la bibliothèque :wink:

Tout le secret d'un PID se trouve dans la détermination des 3 coefficients :angry: