Witam,
zrobiłem tak jak chciałeś. Ustawiłem stałą prędkość na pinie 6 PWM.
#include <PID_v1.h>
#define Relay 12
#define Krec 7
#define PWM 6
////Define Variables we'll be connecting to
double Setpoint, Input, Output;
//Define the aggressive and conservative Tuning Parameters
double aggKp = 3, aggKi = 0.2, aggKd = 0.3;
double consKp = 1, consKi = 0.05, consKd = 0.25;
//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint, 2, 5, 1, DIRECT);
int WindowSize = 5000;
unsigned long windowStartTime;
void setup() {
Serial.begin(9600);
pinMode(Relay, OUTPUT);
pinMode(Krec, OUTPUT);
digitalWrite(Krec, HIGH);
pinMode(8, OUTPUT);
digitalWrite(8, LOW);
analogWrite(PWM, 240); // stala predkosc wiatraczka
windowStartTime = millis();
//initialize the variables we're linked to
Input = analogRead(0);
Setpoint = 120;
//tell the PID to range between 0 and the full window size
myPID.SetOutputLimits(0, WindowSize);
//turn the PID on
myPID.SetMode(AUTOMATIC);
}
void loop() {
float resistance;
Input = analogRead(0);
Serial.println(analogRead(0));
delay(200);
resistance = map(analogRead(0), 0, 342, 0, 130);
double gap = abs(Setpoint - resistance); // distance away from setpoint
if (gap < 10)
{ // we're close to setpoint, use conservative tuning parameters
myPID. SetTunings(consKp, consKi, consKd);
} else {
//we're far from setpoint, use aggresive tuning parameters
myPID.SetTunings(aggKp, aggKi, aggKd);
}
myPID.Compute();
unsigned long now = millis();
if (now - windowStartTime > WindowSize)
{ // time to shift the Relay Window
windowStartTime += WindowSize;
}
if (Output > now - windowStartTime)
{
digitalWrite(Relay, HIGH);
}
else {
digitalWrite(Relay, LOW); }
// analogWrite(PWM, Output);
// if (Setpoint == 80) {
// digitalWrite(Relay, LOW);
// }
// else {
// digitalWrite(Relay, HIGH);
}
Wrzuciłem przebieg z Kreślarki
Nie jestem w stanie wrzucić całego przebiegu, więc wrzuciłem początek oraz koniec przebiegu. Zauważyłem, że praca przekaźnika ulegała zmianie, mianowicie wraz z dłuższą pracą układu wydłużał się czas załączenia przekaźnika a skracał czas jego wyłączenia, w wyniku czego przez cały czas rosła temperatura na termistorze. Przy końcu przebiegu przekaźnik "nie miał czasu na odpoczynek", gdy się wyłączał natychmiast się załączał do momentu aż przekaźnik był załączony cały czas. Dziwne ...
Zmieniłem Windowsize na 3000 zostawiając PWM na 240, sprawdzałem również na kreślarce przebieg przy setpoint = 80 oraz 180. Przebiegi są krótkie, ponieważ tutaj interesował mnie spadek wartości. Wyszło mi tak:
dla Setpoint = 80,
dla Setpoint = 180,
Zauważyłem, że w przypadku np. Setpoint =50, 80 lub 180, termistor osiągnię ostatecznie tą samą temperaturę (oczywiście w przypadku niższych będzie to przebiegać wolniej), a to chyba nie oto chodzi.
Kiedy ustawię PWM pinu 6 jak wcześniej, przekaźnik zachowuje się tak jak wcześniej wspomniałem.
Pozdrawiam