نمایش نتایج: از 1 به 7 از 7

موضوع: در خواست راهنمایی برای کنترل هوشمند کولر آبی با آردینو

  1. #1
    Junior Member
    تاریخ عضویت
    Jul 2015
    نوشته ها
    6

    در خواست راهنمایی برای کنترل هوشمند کولر آبی با آردینو

    درود
    قصد دارم بعنوان سرگرمی یک کنترل هوشمند برای کولر آبی درست کنم
    تجهیزاتی که استفاده کردم
    1- آردینو مگا
    2- شیلد lcd که دارای 5 دکمه جدا از ریست است DFrobot
    3-برد رله 2 کاناله
    4- سنسور دماو رطوبت دیجیتال DHT22
    5-ماژول بلوتوث HC-05

    هدفم اینه که بجز دما مقدار رطوبت را هم در کنترل و محاسبه دمای احساس شده در نظر بگیرم تا احساس آسایش بیشتری ایجاد بشه

    متاسفانه اطلاعات من درباره برنامه نویسی به حدود 20 سال پیش برمیگردد
    کدی که تا حالا توانستم اماده کنم از یک پروژه گلخانه برداشتم و با کمی تغییر . قسمتی از کار را جواب میده و به شکل زیر است





    //Arduino Greenhouse project. Coded by Aaron Maybury A.K.A GlassCurtain
    //Used sample code for the DHT11 By Ladyada

    #include <LiquidCrystal.h>
    #include <DFR_Key.h>
    #include <DHT.h>

    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

    DFR_Key keypad;

    // Uncomment whatever type you're using!
    //#define DHTTYPE DHT11 // DHT 11
    #define DHTTYPE DHT22 // DHT 22 (AM2302)
    //#define DHTTYPE DHT21 // DHT 21 (AM2301)

    // Connect pin 1 (on the left) of the sensor to +5V
    // Connect pin 2 of the sensor to whatever your DHTPIN is
    // Connect pin 4 (on the right) of the sensor to GROUND
    // Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

    int sensePin = 21; //Arduino Pin number the sensor plugged into. The schematics that come with the LCD shield are incorrect.
    //Pin 2 on the arduino is actually pin 5 on the LCD shield. The headers that plug into the arduino's Digital pins 0 - 7, on the LCD Shield the exact middle pin is pin 2 on the arduino.
    //Use your multimeter to test continuity to find the pin you want.
    int currentButton = 0; //Current button pressed
    int displayTemp = 1; //Keeps track of what screen is currently being displayed. If displatTemp is 1 temp is showing. If 0 Humidity is showing.
    int displayHumid = 0;
    int setTemp = 25; //Default to set the desired temp
    int setHumid = 50; //Defualt to set the desired humidity
    int outputPin = 28; //Output pin to the relay to trip the fans

    DHT dht(sensePin, DHTTYPE);

    void setup()
    {
    pinMode(outputPin, OUTPUT);

    lcd.begin(16, 2);
    lcd.clear();
    lcd.setCursor(0, 0);

    //Serial.begin(9600);

    dht.begin();
    }

    void loop() {

    currentButton = keypad.getKey(); //Read button press

    // Reading temperature or humidity takes about 250 milliseconds!
    // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
    float h = dht.readHumidity();
    float t = dht.readTemperature();
    if (isnan(h) || isnan(t) {
    Serial.println("Failed to read from DHT sensor!");
    return;
    }
    float temp = t-3 ; //Convert *C to *F.

    if (displayTemp == 1) //Shows temp screen upon first boot
    {
    //lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("TEMP ");
    lcd.print(temp);
    lcd.print(" ");
    lcd.print((char)223); // degree symbol
    lcd.print("C");
    lcd.setCursor(0,1);
    lcd.print("SET TEMP ");
    lcd.print(setTemp);
    lcd.print(" ");
    lcd.print((char)223);
    lcd.print("C");
    displayHumid = 0;

    }
    else{
    //lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("HUMIDITY ");
    lcd.print(int(h));
    lcd.print(" %");
    lcd.setCursor(0,1);
    lcd.print("SET HUMID ");
    lcd.print(setHumid);
    lcd.print(" %");
    displayHumid = 1;
    }

    // Reads which buttons are pressed.
    // No button = 0
    // Select button = 1
    // Left button = 2
    // Up Button = 3
    // Down Button = 4
    // Right Button = 5

    if (currentButton == 5 && displayTemp == 1)
    {
    displayTemp = 0; //Turns display temp off so it will show humidity after pressing right button
    }

    // The following code toggles the screen when the corresponding button is pressed.
    // Also sets the screens to wrap around the display.
    // So if you hit right button once it will show humidity and if you hit right button again it will show temp.

    if (currentButton == 5 && displayHumid == 1)
    {
    displayTemp = 1;
    }

    if (currentButton == 2 && displayTemp == 1)
    {
    displayTemp = 0;
    }

    if (currentButton == 2 && displayHumid == 1)
    {

    displayTemp = 1;
    }

    if (currentButton == 3 && displayTemp == 1) //When up button is pressed and the temp screen is showing, increment the set temp
    {
    ++setTemp;
    }

    if (currentButton == 4 && displayTemp == 1) //When down button is pressed with the temp screen showing, decrement set temp
    {
    --setTemp;
    }

    if (currentButton == 3 && displayTemp == 0) //When up button is pressed and the humidity screen is showing, inc the set humidity
    {
    ++setHumid;
    }

    if (currentButton == 4 && displayTemp == 0) //When down button is pressed and humidity screen is showing, dec the set humidity
    {
    --setHumid;
    }


    if(temp >= setTemp) //Trip relay if temp is exceeded
    {
    //Serial.print(temp);
    digitalWrite(outputPin, HIGH);
    }
    else
    {
    digitalWrite(outputPin, LOW);
    }



    //if (h >= setHumid && digitalRead(outputPin) == LOW) //If humidity is exceeded and fan is not on due to temp exceeded, turn fan on.
    //{
    // digitalWrite(outputPin, HIGH);
    //}


    }

    مشکلی که دارم در قسمت خواندن مقادیر از سنسور است
    چون گاه گاهی سنسور برای چند ثانیه خروجی ندارد صحیح ندارد و lcd مقدار nan را نمایش میدهد که چند ثانیه بعد دوباره مقدار صحیح را نمایش میدهد
    اتفاق بدی که پیش میاد اینه که در این حالت رله با هر بار نوشته شدن nan تغییر وضعیت میدهد
    احتیج به یک چیزی شبیه به Watchdog دارم که وقتی برنامه مقادیر nan را از سنسور گرفت قبل از اینکه به کنترل رله ها برسد دوباره مقدار صحیح را از سنسور بخواند

    با توجه به هم ریخته شدن کد ها فایل کدها را ضمیمه میکنم
    ممنون میشم اگر دوستان راهنمایی کنند
    فایل های پیوست شده فایل های پیوست شده

  2. #2
    Junior Member
    تاریخ عضویت
    Jul 2015
    نوشته ها
    6
    آخرین کد اینه ولی هنوز همون مشکلات رادارد
    فایل های پیوست شده فایل های پیوست شده

  3. #3
    Junior Member
    تاریخ عضویت
    Jul 2015
    نوشته ها
    1
    یه راه حل ساده اینه که مقدار تاخییر برای کنترل را بیشتر کنید و برای کنترل کولر آبی تاخییر تا 5 ثانیه مشکلی نداره ومزیتی که داره اینه که اگه سنسور دچار شک دمایی شد کنترلر فرمان روشن خاموش صادر نکند.
    راه حل دوم اینه که برای دمای سنسور یه محدوده قابل قبول در نظر بگیرید و آن را در برنامه اعمال کنید سپس در برنامه تعرییف کنید اگر دمای جدید در محدوده ی مورد نظر بود قابل قبول باشد و تغییر در مقدار دمای سنسور اعمال شودو اگر نبود تغییرات اعمال نشود و همچنین نباید مقدار دمای سنسور لحظه ای باشد

  4. #4
    Junior Member
    تاریخ عضویت
    Jul 2015
    نوشته ها
    6
    فکر کنم استفاده از delay کار جالبی نباشه . چون باعث میشه دکمه های کنترل کارکرد روانی نداشته باشند

  5. #5
    Junior Member
    تاریخ عضویت
    Jul 2015
    نوشته ها
    6
    فکر کنم احتیاج به دوتا تایمر دارم که به نوبت از شروع کار مثلا برای 10 دقیقه زمان را بشمارد بعد متوقف شده و تایمر دوم زمان را برای ده دقیقه بشمارد اینطوری بدون استفاده از تاخیر و توقف برنامه میتوان بطور روان برنامه را انجام و از وقفه های زمانی برای اتفاقات نه توقف کل برنامه استفاده کرد .
    فقط سوال اینه که چطوری میتونم از دوتا تایمر داخلی آردوینو استفاده کنم و نحوه نوشتن کدش به چه شکای است ؟؟؟

  6. #6
    Member
    تاریخ عضویت
    May 2015
    نوشته ها
    64
    موتور های کولر برای دو حالت کند و تند طراحی شده اند و برای این منظور طراحی نشده اند.
    اصلا بگذارید کمی مفصل تر پیش بریم.
    موتور کولر منزل شما دارای سه سری سیم پیچ می باشد
    1 استارتر
    2 دور کند
    3 دور تند
    و البته یک بخش مهم به نام کلید گریز ازمرکز به همراه صفحه تقسیم برق
    وقتی شما کلید روشن موتور را میزنید ابتدا کلید گریز از مرکز در حالت عادی خودقرار دارد و صفحه تقسیم برق انرژی را به سیم پیچ استارتر منتقل می نماید.
    در نتیجه استارت موتور زده میشود - وقتی موتو شتاب کافی گرفت کلید گریز از مرکز بر اثر شتاب بوجود امده حرکت کرده و برق استارت قطع شده و به سیم پیچ اصلی منتقل می گردد که بسته به انتخاب شما کند یا تند می باشد(فرقی ندارد)
    صدای غرش اولیه موتور نیز به همین سبب می باشد.
    خب به همین دلیل وقتی شما بخواهید این موتور را با pwm کنترل کنید(دور موتور را به دلخواه تغییر دهید) موتور دارای لرزش و صدای نا متعارف و آزار دهنده ای می شود و البته پس از مدتی میسوزد.
    به همین دلیل پیشنهاد می گردد یا از رله استفاده کنید/یا یک موتور جایگرین نمایید / یا ضمن تحمل نویز ایجاد شده هر ماه برای سیم پیچی مجدد بودجه ای در نظر بگیرید.
    پیشنهاد بنده:
    جایگزینی موتور


    در مورد سنسور نیز بهترین راه ایجاد محدوده امن می باشد.
    فرض کنیم می خواهیم دما را در 25 درجه کنترل کنیم
    مثلا در دمای 28 درجه استارت و در دمای 22 درجه توقف(ایجاد یک محدوده)

    البته در صورت جایگزینی موتور شما مشکلی ندارید و می توانید بر اساس دما لحظه ای دور را کم یا زیاد کنید
    مثال:
    دمای مورد نظر 25 درجه
    دمای فعلی 30 درجه
    موتور روشن می گردد و با تمام توان کار می کند
    وقتی به دمای مطلوب رسید 50 درصد دور موتور کم می گردد.
    در صورت افت دما 5 درصد 5 درصد کم شود و در صورت افزایش دما ده در صد ده در صد سرعت اضافه شود.
    ضمن اینکه میتوان درصد سرعت قبلی و فعلی را گرفت و بر این اساس این اختلاف یک ضریب هوشمند کنترلی تعریف نمود.
    در صورت علاقه شما عزیزان مطلب ادامه می یابد.

  7. #7
    Junior Member
    تاریخ عضویت
    Jul 2015
    نوشته ها
    6
    دوست عزیز درحال حاضر برنامه ای برای استفاده از موتورهای دورمتغییر نداریم و کنترل فقط روی روشن و خاموش کردن پمپ آب و موتور کولر با دورهای کم و زیاد است .
    مشکل الان استفاده از تایمر برای محافظت از موتور های درخصوص نوسان و اشتباه خواندن سنسور دما میباشد اگر اطلاعات کد نویسی با آردوینو دارید از همراهی شما استقبال میکنیم .

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  

SEO by vBSEO