اطلاعیه

Collapse
No announcement yet.

کنترل دما با ds18b20 به صورت pid با آردوینو

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    کنترل دما با ds18b20 به صورت pid با آردوینو

    سلام دوستان
    من میخوام با ی بورد آردوینو، سنسور 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);
    
    
    }
    جدیدترین ویرایش توسط abbasjavanmardi; ۲۱:۵۷ ۱۴۰۰/۰۴/۱۹.

    #2
    پاسخ : کنترل دما با ds18b20 به صورت pid با آردوینو

    نوشته اصلی توسط abbasjavanmardi نمایش پست ها
    سلام دوستان
    من میخوام با ی بورد آردوینو، سنسور ds18b20 ، کتابخانه pid و یک هیتر، دمای یک ظرف رو به شکل دقیق کنترل کنم.
    مزایا و معایب روش on/off رو نسبت به روش pid خوندم.تو اینترنت گشتم اکثرا با ترموکوپل نوع k و ماژول مربوطش پروژه رو انجام دادن.دقیقا چیزی ک من میخواستم تو این سایت(https://gist.github.com/nobodyguy/ac...7a604f6a0f8af9) بودش ولی وقتی اجراش میکنم رله تا قبل رسیدن به دمای ست پوینت هی قطعو وصل میشه ولی بعد اینکه از اون دما رد میشه رله همش وصله و دما همینطوری بالا میره.کسی میتونه کمکم کنه؟
    با درود
    اطلاعات دقیقی راجب این پیای دی ندارم
    ولی باید چند تا پارامتر رو از محیط بدست بیاری و اون ها رو به برنامه ت اضافه کنی
    حتی این کار نکنی باید بهتر از اینی که شما میگید عمل کنه و اورشوت کمتری داشته باشه
    برنامه مشکل داره
    توی انجمن هم تاپیک در مورد پی ای دی هست سرچ کنید

    دیدگاه


      #3
      پاسخ : کنترل دما با ds18b20 به صورت pid با آردوینو

      تو انجمن گشتم ولی این ترکیبی ک من نیازش دارم نیست حتی مشابهش هم وجود نداره،من زیاد وارد نیستم واسه همین تو انجمن مطرحش کردم

      دیدگاه


        #4
        پاسخ : کنترل دما با ds18b20 به صورت pid با آردوینو

        نوشته اصلی توسط abbasjavanmardi نمایش پست ها
        تو انجمن گشتم ولی این ترکیبی ک من نیازش دارم نیست حتی مشابهش هم وجود نداره،من زیاد وارد نیستم واسه همین تو انجمن مطرحش کردم
        با سلام و احترام
        داخل برنامه نمونه سایت که شما هم استفاده میکنید ست پوینت روی ۶۸ فیکس شده. آیا ست پوینت مد نظر شما هم همین است؟
        این نکته را هم مد نظر قرار دهید که با وجود استفاده از PID ولی باز خروجی کنترلر شما بصورت On-Off میباشد. اگر بخواهید به معنای واقعی کنترل بصورت PID باشد باید خروجی PID بصورت درصدی اعمال شود نه قطع و وصل. این بدین معنی است که مثلا شما در خروجی بتوانید بر اساس Output کنترلر دمای هیتر را کم و زیاد کنید یعنی اگر هیتر با برق DC کار میکند توسط PWM ولتاژ آنرا تغییر دهید و یا اگر با برق AC کار میکند با استفاده از ترایاک مقدار ولتاژ هیتر را تنظیم نمایید. و نکته آخر که قبلا هم در جواب یکی از دوستان گفتم توجه به این نکته است که تغییرات دما ذاتا کند میباشد و سرعت اندازه گیری تغییرات دما علاوه بر مداری که انتخاب میکنید بسته به نوع سیالی که دماش رو اندازه گیری میکنید، محلی که سنسور رو نصب میکنید، محل المنت، پروفایل دما در محدوده سنسور و .... میباشد و نباید انتظار داشته باشید که دقیقا همان دمای ست پوینت را در عمل داشته باشید.
        جدیدترین ویرایش توسط evergreen; ۱۱:۵۹ ۱۴۰۰/۰۴/۲۰.

        دیدگاه


          #5
          پاسخ : کنترل دما با ds18b20 به صورت pid با آردوینو

          ست پوینت ۶۸ هست و من همین دما رو مد نظر قرار دادم و سنسور رو مستقیم به هیتر وصل کردم و وقتی به ۶۸ میرسه دائم روشن میمونه.
          جدیدترین ویرایش توسط abbasjavanmardi; ۱۳:۱۰ ۱۴۰۰/۰۴/۲۰.

          دیدگاه


            #6
            پاسخ : کنترل دما با ds18b20 به صورت pid با آردوینو

            نوشته اصلی توسط evergreen نمایش پست ها
            با سلام و احترام
            داخل برنامه نمونه سایت که شما هم استفاده میکنید ست پوینت روی ۶۸ فیکس شده. آیا ست پوینت مد نظر شما هم همین است؟
            این نکته را هم مد نظر قرار دهید که با وجود استفاده از PID ولی باز خروجی کنترلر شما بصورت On-Off میباشد. اگر بخواهید به معنای واقعی کنترل بصورت PID باشد باید خروجی PID بصورت درصدی اعمال شود نه قطع و وصل. این بدین معنی است که مثلا شما در خروجی بتوانید بر اساس Output کنترلر دمای هیتر را کم و زیاد کنید یعنی اگر هیتر با برق DC کار میکند توسط PWM ولتاژ آنرا تغییر دهید و یا اگر با برق AC کار میکند با استفاده از ترایاک مقدار ولتاژ هیتر را تنظیم نمایید. و نکته آخر که قبلا هم در جواب یکی از دوستان گفتم توجه به این نکته است که تغییرات دما ذاتا کند میباشد و سرعت اندازه گیری تغییرات دما علاوه بر مداری که انتخاب میکنید بسته به نوع سیالی که دماش رو اندازه گیری میکنید، محلی که سنسور رو نصب میکنید، محل المنت، پروفایل دما در محدوده سنسور و .... میباشد و نباید انتظار داشته باشید که دقیقا همان دمای ست پوینت را در عمل داشته باشید.
            ست پوینت هر عددی باشه همین رفتار رو داره.من هم قصد دارم سنسور بچسبه به المنت و فقط دمای المنت رو کنترل کنم.من جواب خیلی از سوالای بعدیم رو تو فرمایش شما پیدا کردم مخصوصا بخش کنترل قدرت المنت توسط ترایاک .ممکنه ی پروژه ک برای آردوینو و با سنسور دما اجرا شده باشه ,و خروجی رو توسط ترایاک یا ماسفت کنترل کنه رو کدشو قرار بدین من خودم بقیشو با توجه به امکانات بعدی اضافه میکنم بهش.ممنون
            جدیدترین ویرایش توسط abbasjavanmardi; ۱۳:۱۳ ۱۴۰۰/۰۴/۲۰.

            دیدگاه


              #7
              پاسخ : کنترل دما با ds18b20 به صورت pid با آردوینو

              نوشته اصلی توسط abbasjavanmardi نمایش پست ها
              ست پوینت هر عددی باشه همین رفتار رو داره.من هم قصد دارم سنسور بچسبه به المنت و فقط دمای المنت رو کنترل کنم.من جواب خیلی از سوالای بعدیم رو تو فرمایش شما پیدا کردم مخصوصا بخش کنترل قدرت المنت توسط ترایاک .ممکنه ی پروژه ک برای آردوینو و با سنسور دما اجرا شده باشه ,و خروجی رو توسط ترایاک یا ماسفت کنترل کنه رو کدشو قرار بدین من خودم بقیشو با توجه به امکانات بعدی اضافه میکنم بهش.ممنون
              با سلام مجدد

              موفق باشید

              دیدگاه


                #8
                پاسخ : کنترل دما با ds18b20 به صورت pid با آردوینو

                نوشته اصلی توسط evergreen نمایش پست ها
                اینو دیدم و پروژه بعدیم همینه ک برای خودم درستش کنم ولی تا اونجایی ک من فهمیدم این از سنسور دما استفاده نکرده من میخوام input برنامه pid داده ای باشه ک سنسور ds18b20 میده چون به صورت تجربی و خود خوان برنامه نویسی آردوینو رو یاد گرفتم نمیتونم بفهمم چطوری با آپ آمپ مقادیر رو به pid میده و در ثانی نمیخوام واسه این دستگاه اینقدر هزینه کنم.کل برنامه من تنظیم دمای هیتر به مقدار 60 درجه سلسیوس و قابلیت تنظیم دما توسط روتاری اینکودر و یک ماژول سون سگمنته ک با ی بورد آردیونو مینی کنترل میشن

                دیدگاه


                  #9
                  پاسخ : کنترل دما با ds18b20 به صورت pid با آردوینو

                  نوشته اصلی توسط abbasjavanmardi نمایش پست ها
                  اینو دیدم و پروژه بعدیم همینه ک برای خودم درستش کنم ولی تا اونجایی ک من فهمیدم این از سنسور دما استفاده نکرده من میخوام input برنامه pid داده ای باشه ک سنسور ds18b20 میده چون به صورت تجربی و خود خوان برنامه نویسی آردوینو رو یاد گرفتم نمیتونم بفهمم چطوری با آپ آمپ مقادیر رو به pid میده و در ثانی نمیخوام واسه این دستگاه اینقدر هزینه کنم.کل برنامه من تنظیم دمای هیتر به مقدار 60 درجه سلسیوس و قابلیت تنظیم دما توسط روتاری اینکودر و یک ماژول سون سگمنته ک با ی بورد آردیونو مینی کنترل میشن
                  با سلام مجدد
                  هویه ایی که در اون پروژه استفاده شده یک ترمیستور داخلش داره که دمای المنت رو میفرسته به خاطر همین اومده و با یک OPAmp به شماره LM358 تبدیلش کرده به ولتاژ و فرستاده برای ADC آردوینو و اونجا با دستور map ولتاژ رو به دما تبدیل کرده. شما سنسورتون دیجیتاله کافیه در برنامه بجای استفاده از ADC از روشی که سنسورتون دما را میفرسته دما را بخوانید و ازش استفاده کنید. بقیه ماجرا دیگه ربطی به نوع سنسور دما نداره.
                  موفق باشید.

                  دیدگاه


                    #10
                    پاسخ : کنترل دما با ds18b20 به صورت pid با آردوینو

                    امیدوارم دست متوجه شده باشم.اول برنامه اون پروژه رو برمیدارم و خروجی سنسور 18b20 رو ک دیجیتال هست رو به عنوان دمای ورودی معرفیش میکنم با پتانسیومتر هم دمای مد نظر رو روش پیاده میکنم.خیلی ممنون از راهنماییتون. سعیمو میکنم

                    دیدگاه


                      #11
                      پاسخ : کنترل دما با ds18b20 به صورت pid با آردوینو

                      نوشته اصلی توسط abbasjavanmardi نمایش پست ها
                      امیدوارم دست متوجه شده باشم.اول برنامه اون پروژه رو برمیدارم و خروجی سنسور 18b20 رو ک دیجیتال هست رو به عنوان دمای ورودی معرفیش میکنم با پتانسیومتر هم دمای مد نظر رو روش پیاده میکنم.خیلی ممنون از راهنماییتون. سعیمو میکنم
                      در اون پروژه پتانسیومتر گذاشته چون میخواسته دمای هویه قابل تنظیم باشه. شما اگه ست پوینتتون ثابته میتونید اون بخش پتانسیومتر رو هم حذف کنید و تو برنامه ست پوینت ثابت بدید. حتما موفق میشید. اگه باز هم موردی بود خوشحال میشم اگه بتونم کمکی کنم.
                      موفق باشید.

                      دیدگاه


                        #12
                        پاسخ : کنترل دما با ds18b20 به صورت pid با آردوینو

                        نوشته اصلی توسط evergreen نمایش پست ها
                        در اون پروژه پتانسیومتر گذاشته چون میخواسته دمای هویه قابل تنظیم باشه. شما اگه ست پوینتتون ثابته میتونید اون بخش پتانسیومتر رو هم حذف کنید و تو برنامه ست پوینت ثابت بدید. حتما موفق میشید. اگه باز هم موردی بود خوشحال میشم اگه بتونم کمکی کنم.
                        موفق باشید.
                        سلام
                        من اون پروژه رو اجرا کردم و خروجی این شد ک دما تو بازه کمی نوسان داره ولی ی موضوعی توجه منو به خودش جمع کرد. این پروژه به صورتی عمل میکنه ک دمای هیتر به محض رسیدن به نقطه مبنا خاموش میشه و این قابلیت رو داره ک تو یک ثانیه هزاران بار ماسفت رو خاموش و روشن کنه ک فکر میکنم تو تعریف کنترل دما به شکل on/off قرار میگیره و در واقع ی کنترل pid نیست ک بیاد خطای تناسبی مشتق و انتگرالی حساب کنه و پایه pwm رو بر اساس اون خطاها خروجی بهش بده.درست میگم؟
                        کدی ک آپلود کردم
                        کد:
                        #include <LiquidCrystal.h>
                        #include <OneWire.h>
                        #include <DallasTemperature.h>
                        #define ONE_WIRE_BUS 11
                        OneWire oneWire(ONE_WIRE_BUS);
                        DallasTemperature sensors(&oneWire);
                        #define knob A1
                        #define iron 3    // pwm
                        #define LED 12
                        
                        
                        LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
                        
                        
                        int
                        minTemp = 27,       //Minimum aquired iron tip temp during testing (°C)
                        maxTemp = 525,      //Maximum aquired iron tip temp during testing (°C)
                        minADC  = 234,      //Minimum aquired ADC value during minTemp testing
                        maxADC  = 733,      //Maximum aquired ADC value during minTemp testing
                        
                        
                        maxPWM    = 255,    //Maximum PWM Power
                        avgCounts = 10,     //Number of avg samples
                        lcdInterval = 80,   //LCD refresh rate (miliseconds) 
                        
                        
                        pwm = 0,            //System Variable
                        tempRAW = 0,        //System Variable
                        knobRAW = 0,        //System Variable
                        counter = 0,        //System Variable
                        setTemp = 0,        //System Variable
                        setTempAVG = 0,     //System Variable
                        currentTempAVG = 0, //System Variable
                        previousMillis = 0; //System Variable
                        
                        
                        float 
                        currentTemp = 0.0,  //System Variable
                        store = 0.0,        //System Variable
                        knobStore = 0.0;    //System Variable
                        
                        
                        void setup(){
                          pinMode(tempSensor,INPUT); //Set Temp Sensor pin as INPUT
                          pinMode(knob,INPUT);       //Set Potentiometer Knob as INPUT
                          pinMode(iron,OUTPUT);      //Set MOSFET PWM pin as OUTPUT
                          pinMode(LED,OUTPUT);       //Set LED Status pin as OUTPUT
                          pinMode(A6,INPUT);       //Passthru Pin 
                          Serial.begin (9600);
                          sensors.begin();
                          lcd.begin(16, 2);
                          lcd.clear();
                          lcd.setCursor(0,1);lcd.print("PRESET T: ");  
                          lcd.setCursor(0,0);lcd.print("ACTUAL T:"); 
                        }
                        
                        
                        void loop(){
                          //--------Gather Sensor Data--------//
                          knobRAW = analogRead(knob); //Get analog value of Potentiometer
                          setTemp = map(knobRAW,0,1023,minTemp,maxTemp);  //Scale pot analog value into temp unit
                          sensors.requestTemperatures(); // Send the command to get temperatures
                          tempRAW = sensors.getTempCByIndex(0);
                          Serial.println(tempRAW);  //Get analog value of temp sensor
                          currentTemp = tempRAW ; //Sacle raw analog temp values as actual temp units
                          
                          //--------Get Average of Temp Sensor and Knob--------//
                          if(counter<avgCounts){  //Sum up temp and knob data samples
                            store = store+currentTemp;
                            knobStore = knobStore+setTemp;
                            counter++;
                          }
                          else{
                            currentTempAVG = (store/avgCounts);  //Get temp mean (average)
                            setTempAVG = (knobStore/avgCounts);  //Get knob - set temp mean (average)
                            knobStore=0;  //Reset storage variable
                            store=0;      //Reset storage variable
                            counter=0;    //Reset storage variable
                          }
                          
                          //--------PWM Soldering Iron Power Control--------//
                          if(analogRead(knob)==0){  //Turn off iron when knob as at its lowest (iron shutdown)
                            digitalWrite(LED,LOW);
                            pwm=0;
                          }
                          else if(currentTemp<=setTemp){  //Turn on iron when iron temp is lower than preset temp
                            digitalWrite(LED,HIGH);
                            pwm=maxPWM;
                          }
                          else{  //Turn off iron when iron temp is higher than preset temp
                            digitalWrite(LED,LOW);
                            pwm=0;
                          }
                          analogWrite(iron,pwm);  //Apply the aquired PWM value from the three cases above
                        
                        
                          //--------Display Data--------//
                          unsigned long currentMillis = millis(); //Use and aquire millis function instead of using delay
                          if (currentMillis - previousMillis >= lcdInterval){ //LCD will only display new data ever n milisec intervals
                            previousMillis = currentMillis;
                         
                            if(analogRead(knob)==0){
                              lcd.setCursor(10,1);lcd.print("OFF  ");
                            }
                            else{
                              lcd.setCursor(10,1);lcd.print(setTempAVG,1);lcd.print((char)223);lcd.print("C ");
                            }
                            
                            if(currentTemp<minTemp){
                              lcd.setCursor(10,0);lcd.print("COOL ");
                            }
                            else{
                              lcd.setCursor(10,0);lcd.print(currentTempAVG,1);lcd.print((char)223);lcd.print("C ");
                            }   
                          } 
                        }
                        جدیدترین ویرایش توسط abbasjavanmardi; ۱۶:۴۲ ۱۴۰۰/۰۴/۲۰.

                        دیدگاه


                          #13
                          پاسخ : کنترل دما با ds18b20 به صورت pid با آردوینو

                          نوشته اصلی توسط abbasjavanmardi نمایش پست ها
                          سلام
                          من اون پروژه رو اجرا کردم و خروجی این شد ک دما تو بازه کمی نوسان داره ولی ی موضوعی توجه منو به خودش جمع کرد. این پروژه به صورتی عمل میکنه ک دمای هیتر به محض رسیدن به نقطه مبنا خاموش میشه و این قابلیت رو داره ک تو یک ثانیه هزاران بار ماسفت رو خاموش و روشن کنه ک فکر میکنم تو تعریف کنترل دما به شکل on/off قرار میگیره و در واقع ی کنترل pid نیست ک بیاد خطای تناسبی مشتق و انتگرالی حساب کنه و پایه pwm رو بر اساس اون خطاها خروجی بهش بده.درست میگم؟
                          با سلام مجدد
                          بله حق با شماست اون در کد فقط 0 و MaxPWM رو ارسال میکنه. نمونه کد قبلی رو اگه عملی تست کردید لطفا چک کنید دما نسبت به ست پوینت چقدر نوسان داره؟ سایت زیر رو چک کردم اون از PID با PWM متغیر استفاده میکنه. اگه این را هم تست کردید ببینید نوسان نسبت به ست پوینت تو این یکی چطوره و اگه توانستید نتیجه مقایسه بین دو روش را اینجا هم بگذارید.

                          The mighty soldering iron. If you need one, want one, or just love to build stuff, then this project is for you.

                          دیدگاه


                            #14
                            پاسخ : کنترل دما با ds18b20 به صورت pid با آردوینو

                            نوشته اصلی توسط evergreen نمایش پست ها
                            با سلام مجدد
                            بله حق با شماست اون در کد فقط 0 و MaxPWM رو ارسال میکنه. نمونه کد قبلی رو اگه عملی تست کردید لطفا چک کنید دما نسبت به ست پوینت چقدر نوسان داره؟ سایت زیر رو چک کردم اون از PID با PWM متغیر استفاده میکنه. اگه این را هم تست کردید ببینید نوسان نسبت به ست پوینت تو این یکی چطوره و اگه توانستید نتیجه مقایسه بین دو روش را اینجا هم بگذارید.

                            https://www.allaboutcircuits.com/pro...ith-an-atmega8
                            کد برنامه نزاشته تو سایتش
                            ولی تو این سایت(https://electronoobs.com/eng_arduino_tut24_code3.php) ی پروژه دیدم ک اومده با آردوینو و ی ترموکوپل نوع K و ماسفت هیتر 12ولت DC رو کنترل کرده، کار من اینه فقط ورودی ک از ترموکوپل و اون ماژولش رو با مقدار خوانده شده توسط سنسور دیجیتال DS18B20 جایگزین کنم.فقط نمیدونم برای برق AC از ترایاک باید استفاده کنم یا ماسفت؟
                            جدیدترین ویرایش توسط abbasjavanmardi; ۱۸:۴۷ ۱۴۰۰/۰۴/۲۰.

                            دیدگاه


                              #15
                              پاسخ : کنترل دما با ds18b20 به صورت pid با آردوینو

                              نوشته اصلی توسط abbasjavanmardi نمایش پست ها
                              کد برنامه نزاشته تو سایتش
                              ولی تو این سایت(https://electronoobs.com/eng_arduino_tut24_code3.php) ی پروژه دیدم ک اومده با آردوینو و ی ترموکوپل نوع K و ماسفت هیتر 12ولت DC رو کنترل کرده، کار من اینه فقط ورودی ک از ترموکوپل و اون ماژولش رو با مقدار خوانده شده توسط سنسور دیجیتال DS18B20 جایگزین کنم.فقط نمیدونم برای برق AC از ترایاک باید استفاده کنم یا ماسفت؟
                              کد برنامه
                              کد:
                              //Soldering station Software using PID
                              //Thank you Alex from https://geektimes.ru/ for help with led array function
                              //AllAboutCircuits.com
                              //epilepsynerd.wordpress.com
                              
                              
                              #include <PID_v1.h>
                              
                              
                              //This array contains what segments need to be turned on to display numbers 0-9
                              byte const digits[] = {
                                B00111111, B00000110, B01011011, B01001111, B01100110, B01101101, B01111101, B00000111, B01111111, B01101111
                              };
                              
                              
                              int digit_common_pins[] = {A3, A4, A5}; //Common pins for the triple 7-Segment LED display
                              int max_digits = 3;
                              int current_digit = max_digits - 1;
                              
                              
                              unsigned long updaterate = 500; //Change how fast the display updates. No lower than 500
                              unsigned long lastupdate;
                              
                              
                              int temperature = 0;
                              
                              
                              //Define Variables we'll be connecting to
                              double Setpoint, Input, Output;
                              
                              
                              //Define the aggressive and conservative Tuning Parameters
                              double aggKp = 4, aggKi = 0.2, aggKd = 1;
                              double consKp = 1, consKi = 0.05, consKd = 0.25;
                              
                              
                              //Specify the links and initial tuning parameters
                              PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);
                              
                              
                              void setup()
                              {
                                DDRD = B11111111;  // sets Arduino pins 0 to 7 as outputs
                                for (int y = 0; y < max_digits; y++)
                                {
                                  pinMode(digit_common_pins[y], OUTPUT);
                                }
                                //We do not want to drive the soldering iron at 100% because it may burn, so we set it to about 85% (220/255)
                                myPID.SetOutputLimits(0, 220);
                                myPID.SetMode(AUTOMATIC);
                                lastupdate = millis();
                                Setpoint = 0;
                              }
                              
                              
                              
                              
                              void loop() {
                                //Read temperature
                                Input = analogRead(0);
                                //Transform the 10bit reading into degrees celsius
                                Input = map(Input, 0, 450, 25, 350);
                                //Display temperature
                                if (millis() - lastupdate > updaterate) {
                                  lastupdate = millis();
                                  temperature = Input;
                                }
                                //Read setpoint and transform it into degrees celsius(minimum 150, maximum 350)
                                double newSetpoint = analogRead(1);
                                newSetpoint = map(newSetpoint, 0, 1023, 150, 350);
                                //Display setpoint
                                if (abs(newSetpoint - Setpoint) > 3) {
                                  Setpoint = newSetpoint;
                                  temperature = newSetpoint;
                                  lastupdate = millis();
                                }
                              
                              
                                double gap = abs(Setpoint - Input); //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 aggressive tuning parameters
                                  myPID.SetTunings(aggKp, aggKi, aggKd);
                                }
                              
                              
                                myPID.Compute();
                                //Drive the output
                                analogWrite(11, Output);
                                //Display the temperature
                                show(temperature);
                              }
                              
                              
                              void show(int value) {
                                int digits_array[] = {};
                                boolean empty_most_significant = true;
                                for (int z = max_digits - 1; z >= 0; z--) //Cycle through each digit
                                {
                                  digits_array[z] = value / pow(10, z); //We now take each digit from the number
                                  if (digits_array[z] != 0 ) empty_most_significant = false; //Do not display leading zeros
                                  value = value - digits_array[z] * pow(10, z);
                                  if (z == current_digit)
                                  {
                                    if (!empty_most_significant || z == 0) { //Check to see that we do not have leading zeros and display the current digit
                                      PORTD = ~digits[digits_array[z]]; //Remove ~ for common cathode
                                    }
                                    else
                                    {
                                      PORTD = B11111111;
                                    }
                                    digitalWrite(digit_common_pins[z], HIGH);//Change to LOW for common cathode
                                  } else {
                                    digitalWrite(digit_common_pins[z], LOW);//Change to HIGH for common cathode
                                  }
                              
                              
                                }
                                current_digit--;
                                if (current_digit < 0)
                                {
                                  current_digit = max_digits; //Start over
                                }
                              }
                              برای AC باید از ترایاک استفاده کنید ولی استفاده از اون به راحتی ماسفت نیست. زمانهای تریگر کردن ترایاک باید بر اساس زمانهای عبور سیگنال سینوسی ولتاژ از صفر ولت تنظیم بشه. بهتره یک برنامه دیمر که با آردوینو ساخته شده رو بررسی کنید تا با روش کار آشنا بشید و اگر با برق 220 ولت کار میکنید هیچوقت رعایت اصول ایمنی رو فراموش نکنید.
                              جدیدترین ویرایش توسط evergreen; ۲۰:۰۱ ۱۴۰۰/۰۴/۲۰.

                              دیدگاه

                              لطفا صبر کنید...
                              X