سلام دوستان
من میخوام با ی بورد آردوینو، سنسور 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); }
دیدگاه