سلام دوستان
من میخوام با ی بورد آردوینو، سنسور ds18b20 ، کتابخانه pid و یک هیتر، دمای یک ظرف رو به شکل دقیق کنترل کنم.
مزایا و معایب روش on/off رو نسبت به روش pid خوندم.تو اینترنت گشتم اکثرا با ترموکوپل نوع k و ماژول مربوطش پروژه رو انجام دادن.دقیقا چیزی ک من میخواستم تو این سایت(https://gist.github.com/nobodyguy/ac...7a604f6a0f8af9) بودش ولی وقتی اجراش میکنم رله تا قبل رسیدن به دمای ست پوینت هی قطعو وصل میشه ولی بعد اینکه از اون دما رد میشه رله همش وصله و دما همینطوری بالا میره.کسی میتونه کمکم کنه؟
من میخوام با ی بورد آردوینو، سنسور ds18b20 ، کتابخانه pid و یک هیتر، دمای یک ظرف رو به شکل دقیق کنترل کنم.
مزایا و معایب روش on/off رو نسبت به روش pid خوندم.تو اینترنت گشتم اکثرا با ترموکوپل نوع k و ماژول مربوطش پروژه رو انجام دادن.دقیقا چیزی ک من میخواستم تو این سایت(https://gist.github.com/nobodyguy/ac...7a604f6a0f8af9) بودش ولی وقتی اجراش میکنم رله تا قبل رسیدن به دمای ست پوینت هی قطعو وصل میشه ولی بعد اینکه از اون دما رد میشه رله همش وصله و دما همینطوری بالا میره.کسی میتونه کمکم کنه؟
کد:
#include <PID_v1.h>
// Libraries for the DS18B20 sensor
#include <OneWire.h>
#include <DallasTemperature.h>
// DS18B20 on PIN 6 on the Arduino
#define ONE_WIRE_BUS 6
//Solid state relay on PIN 5 on the Arduino
#define RELAY_PIN 5
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
//Define Variables we'll be connecting to
double Setpoint, Input, Output;
//Specify the links and initial tuning parameters
double Kp=5, Ki=3, Kd=3;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
int WindowSize = 10000;
unsigned long windowStartTime;
void setup()
{
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
Serial.begin(115200);
Serial.println("Starting");
windowStartTime = millis();
//initialize the variables we're linked to
Setpoint = 68;
//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()
{
sensors.requestTemperatures();
Input = sensors.getTempCByIndex(0);
Serial.print("Temperature: ");
Serial.println(Input);
myPID.Compute();
/************************************************
* turn the output pin on/off based on pid output
************************************************/
if (millis() - windowStartTime > WindowSize)
{
//time to shift the Relay Window
windowStartTime += WindowSize;
}
if (Output < millis() - windowStartTime)
digitalWrite(RELAY_PIN, HIGH);
else
digitalWrite(RELAY_PIN, LOW);
}




دیدگاه