صفحه 1 از 3 123 آخرینآخرین
نمایش نتایج: از 1 به 10 از 29
Like Tree9 لایک

موضوع: ساخت تایمر با آردیونو+کنترل با میکروسوئیچ

  1. #1
    Junior Member
    تاریخ عضویت
    May 2016
    نوشته ها
    18

    ساخت تایمر با آردیونو+کنترل با میکروسوئیچ

    سلام
    من قصد دارم توسط یک بورد آردیونو (uno)یک تایمر بسازم ک هر یک ساعت یک موتور dc رو (در یک جهت)تا زمان رسیدن چهار چوب وسطی به نقطه Aحرکت بده و با فشردن سوئیچ حرکت تمام شه و همزمان دوباره تایمر شروع به شمردن بکنه و بعد یک ساعت دوباره موتور رو روشن کنه و چهار چوب رو به نقطه B و میکروسوئیچ نقطه B رو تحریک کنه تا حرکت موتور مجددا قطع شه و عمل شمارش مجددا شروع شه و این سیکل بینهایت بار تکرار بشه
    این هم شماتیک ک از بالا هست
    http://s6.picofile.com/file/8253171934/ax.JPG
    تو حلقه لوپ همزمان دما هم باید کنترل بشه واگه از delay بخوام استفاده کنم فکر کنم تاخیر و اختلال حتمی هست
    با این ک کل سایت آردیونو رو زیرو رو کردم(و بیشتر سردرگم شدم)چیز قابل توجهی به دست نیاوردم
    اصل قضیه اینه ک من میخوام با برخورد چهار چوب وسط به کلید اول (نقطه A)و فشرده شدن اون اول رله چپ گرد موتور قطع بعد تایمر یا شمارشگر(timer-counter)شروع به شمارش کنه تا یک ساعت مجددا رله راست گرد موتور فعال بشه تا چهار چوب وسطی به کلید دوم برخورد کنه(نقطه B)مجددا رله راست گرد قطع بشه تایمر یا شمارشگر شروع به شمارش کنه و مجددا بعد یک ساعت رله چپ گرد فعال بشه و چهارچوب مجددا حرکت کنه به سمت نقطه A
    حالت ایده آل هم اینه ک برای عملکرد بهتر و ثبت زمان به صورت دقیق از ی مازول ساعت مجهز به باطری استفاده بشه(ک متاسفانه بنده مبتدی هستمو ...)

    این کدهایی هست ک برای قسمت تایم نوشتم بعدا قسمت کنترل دما ک نوشته شده و به خوبی کار میکنه بهش اضافه میکنم.
    ممنون میشم راهنمایی بفرماید.




    const int button_A = 2; //pin for button A
    const int button_B = 3; //pin for button B
    const int relay_L = 4; //pin for Left turn motor
    const int relay_R = 5; //pin for Right turn motor

    void setup() {
    pinMode(button_A,INPUT);
    pinMode(button_B,INPUT);
    pinMode(relay_L,OUTPUT);
    pinMode(relay_R,OUTPUT);
    }

    void loop() {


    if(digitalRead(button_A)==HIGH)
    {
    digitalWrite(relay_L,LOW);
    delay(3600000); //after 3600sec and overF turn on Right lelay
    digitalWrite(relay_R,HIGH);
    }

    if(digitalRead(button_B)==HIGH)
    {
    digitalWrite(relay_R,LOW);
    delay(3600000);
    digitalWrite(relay_L,HIGH);
    }

    }

  2. #2
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    3,938
    سلام
    راه حل تون برای رهایی از دست delay استفاده از دستور millis هست
    https://www.arduino.cc/en/Reference/Millis
    لایک کردن

  3. #3
    Junior Member
    تاریخ عضویت
    May 2016
    نوشته ها
    18
    تشکر از جوابتون
    امکان داره تو برنامه ای ک نوشتم یک جا به کار ببرینش تا متوجه بشم؟

  4. #4
    Junior Member
    تاریخ عضویت
    May 2016
    نوشته ها
    18
    من تغییرات تو برنامه رو ایجاد کردم اگه امکان داره بازبینی بفرمایید و سناریو به این شکله ک

    1.اگر کلید A در حالت HIGH باشه و مقدار جاری زمان از زمان قبلی بیشتر از مقدار تایم(یک ساعت)بیشتر بشه رله چپ گرد رو روشن کنه و چهار چوب بره به سمت کلید B
    2.حالا تو if چهارم گفتیم به محض رسیدن چهارچوب به کلید B, رله چپ گرد خاموش شه
    3.اگر کلید َB در حالت HIGH باشه و مقدار جاری زمان از زمان قبلی بیشتر از مقدار تایم(یک ساعت)بیشتر بشه رله راست گرد رو روشن کنه و چهار چوب بره به سمت کلید A
    4.حالا تو if سوم گفتیم به محض رسیدن چهارچوب به کلید A, رله راست گرد خاموش شه

    کد:
    const int button_A = 2;  //pin for button A
    const int button_B = 3;  //pin for button B
    const int relay_L = 4;  //pin for Left turn motor
    const int relay_R = 5;  //pin for Right turn motor
    unsigned long previousMillis = 0;        // will store last time button was updated
    long OffTime = 3600000;          // milliseconds of off-time
    
     
    void setup() {
    pinMode(button_A,INPUT);
    pinMode(button_B,INPUT);
    pinMode(relay_L,OUTPUT);
    pinMode(relay_R,OUTPUT);
    }
    
    void loop() 
    {
    unsigned long currentMillis = millis();
    
          if((digitalRead(button_A)==HIGH) && (currentMillis - previousMillis >= OffTime))
    {
      previousMillis = currentMillis;  // Remember the time
      digitalWrite(relay_L,HIGH);  //if curr-perv>=3600sec(1h) start turn motor to Left
     }
    
          if((digitalRead(button_B)==HIGH) && (currentMillis - previousMillis >= OffTime))
    {
       previousMillis = currentMillis;  // Remember the time
       digitalWrite(relay_R,HIGH);  //if curr-perv>=3600sec(1h) start turn motor to Right
    }
    
    if(digitalRead(button_A)==HIGH)
      {
        digitalWrite(relay_R,LOW);  ////stop motor turn Right after push button_A
      }
      
    if(digitalRead(button_B)==HIGH)
    {
        digitalWrite(relay_L,LOW);  //stop motor turn Left after push button_B
    }
    
    }
    ویرایش توسط abbasjavanmardi : 05-31-2016 در ساعت 07:39 PM

  5. #5
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    3,938
    نقل قول نوشته اصلی توسط abbasjavanmardi نمایش پست ها
    من تغییرات تو برنامه رو ایجاد کردم اگه امکان داره بازبینی بفرمایید و سناریو به این شکله ک

    1.اگر کلید A در حالت HIGH باشه و مقدار جاری زمان از زمان قبلی بیشتر از مقدار تایم(یک ساعت)بیشتر بشه رله چپ گرد رو روشن کنه و چهار چوب بره به سمت کلید B
    2.حالا تو if چهارم گفتیم به محض رسیدن چهارچوب به کلید B, رله چپ گرد خاموش شه
    3.اگر کلید َB در حالت HIGH باشه و مقدار جاری زمان از زمان قبلی بیشتر از مقدار تایم(یک ساعت)بیشتر بشه رله راست گرد رو روشن کنه و چهار چوب بره به سمت کلید A
    4.حالا تو if سوم گفتیم به محض رسیدن چهارچوب به کلید A, رله راست گرد خاموش شه

    کد:
    
    
    با این کد جواب نمیگیری
    باید شرطهای بعدیت بشه else if
    نمونه کد من که تست کردم :
    کد:
    const int button_A = 2;  //pin for button A
    const int button_B = 3;  //pin for button B
    const int relay_L = 4;  //pin for Left turn motor
    const int relay_R = 5;  //pin for Right turn motor
    unsigned long previousMillis = 0;        // will store last time button was updated
    long OffTime = 10000;          // milliseconds of off-time
    
    
    
    
    void setup() {
      pinMode(button_A, INPUT);
      pinMode(button_B, INPUT);
      pinMode(relay_L, OUTPUT);
      pinMode(relay_R, OUTPUT);
      Serial.begin(9600);
    }
    
    
    void loop()
    {
      unsigned long currentMillis = millis();
      if (Serial.available() > 0) {
        char data = Serial.read();
        if ((data == 'a') && (currentMillis - previousMillis >= OffTime))
        {
          previousMillis = currentMillis;  // Remember the time
          Serial.println("C1");
        }
    
    
        else if ((data == 'b') && (currentMillis - previousMillis >= OffTime))
        {
          previousMillis = currentMillis;  // Remember the time
          Serial.println("C2");
        }
    
    
      else  if (data == 'a')
        {
          Serial.println("C3");
        }
    
    
       else  if (data == 'b')
        {
          Serial.println("C4");
        }
      }
    }
    لایک کردن

  6. #6
    Junior Member
    تاریخ عضویت
    May 2016
    نوشته ها
    18
    من 4تا شرط قرار دادم ک دوتای اولی با شرط زمان کار میکنه.اولی رو if قرار میدم بعدی else if مجددا بعدی ها باید از if استفاده بشه چون به شروط زمان مربوط نیست
    آیا درست گفتم؟

  7. #7
    Senior Member
    تاریخ عضویت
    Nov 2015
    نوشته ها
    229
    نقل قول نوشته اصلی توسط abbasjavanmardi نمایش پست ها
    من 4تا شرط قرار دادم ک دوتای اولی با شرط زمان کار میکنه.اولی رو if قرار میدم بعدی else if مجددا بعدی ها باید از if استفاده بشه چون به شروط زمان مربوط نیست
    آیا درست گفتم؟
    دوست گرامی ، برای اینکه برنامه تون درست در بیاد بهتره اول فلوچارت رسم کنین و بعد بر اساس اون کدتون رو بنویسین
    در مورد if و else if هم این مثال رو ببینید
    میخوایم اگه بارون اومد یه لامپ روشن بشه و همچنین اگه هوا گرم بود و بارون هم نمیومد کولر آبی روشن بشه
    حالا اگه شما دوتاش رو if بذارین میاد میبینه بارون میاد یا نه اگه میاد لامپ رو روشن میکنه بعد هم میره میبینه هوا گرمه یا نه ، اگه گرم بود فارع از اینکه بارون میاد یا نه کولر رو روشن میکنه
    حالا اگه اولی رو if و دومی رو else if بذارین میبینه بارون میاد یا نه اگه میاد لامپ رو روشن میکنه ، تو قسمت بعد که else if هست میگه "در غیراینصورت اگر:" در غیرکدوم صورت؟ همون صورت که بارون بیاد ، پس اگه بارون میاد این شرط اصلا چک نمیشه و اگه بارون نیاد میره میبینه هوا گرمه یا نه اگه گرم بود کولر رو روشن میکنه

  8. #8
    Junior Member
    تاریخ عضویت
    May 2016
    نوشته ها
    18
    نقل قول نوشته اصلی توسط siib نمایش پست ها
    دوست گرامی ، برای اینکه برنامه تون درست در بیاد بهتره اول فلوچارت رسم کنین و بعد بر اساس اون کدتون رو بنویسین
    در مورد if و else if هم این مثال رو ببینید
    میخوایم اگه بارون اومد یه لامپ روشن بشه و همچنین اگه هوا گرم بود و بارون هم نمیومد کولر آبی روشن بشه
    حالا اگه شما دوتاش رو if بذارین میاد میبینه بارون میاد یا نه اگه میاد لامپ رو روشن میکنه بعد هم میره میبینه هوا گرمه یا نه ، اگه گرم بود فارع از اینکه بارون میاد یا نه کولر رو روشن میکنه
    حالا اگه اولی رو if و دومی رو else if بذارین میبینه بارون میاد یا نه اگه میاد لامپ رو روشن میکنه ، تو قسمت بعد که else if هست میگه "در غیراینصورت اگر:" در غیرکدوم صورت؟ همون صورت که بارون بیاد ، پس اگه بارون میاد این شرط اصلا چک نمیشه و اگه بارون نیاد میره میبینه هوا گرمه یا نه اگه گرم بود کولر رو روشن میکنه

    سلام
    بنده با استفاده از کدی ک خودم نوشته بودم مدار رو روی برد بورد بستم و امتحان کردم تمامی شروط خیلی عالی کار میکنه و مشکلی با عدم وجود else ندارم .تنها مشکل باقی مونده اینه ک مدتی ک رله به واسطه حرکت کند موتور هنوز روشنه(4 دقیقه)تابع millis همچنان در حالت شمارشه در حالی ک من میخوام بعد از فشرده شدن کلید ها شمارش انجام بشه.آیا باز هم تابع millis جوابگو هست؟
    تو اینترنت زیاد گشتم چیزهایی ک به زهنم خطور میکنه:
    1. این ک از ی مازول ساعتds3231 استفاده کنم (اما نمیدونم چطوری بر اساس ساعت اون دستورات رو از میکرو دریافت کنم)
    2.استفاده از کریستال ساعت32.768 و دریافت ساعت دقیق(اینم مثل بالایی بلد نیستم)

    فلوچارت:http://s6.picofile.com/file/8255108634/000.JPG

  9. #9
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    3,938
    نقل قول نوشته اصلی توسط abbasjavanmardi نمایش پست ها
    سلام
    بنده با استفاده از کدی ک خودم نوشته بودم مدار رو روی برد بورد بستم و امتحان کردم تمامی شروط خیلی عالی کار میکنه و مشکلی با عدم وجود else ندارم .تنها مشکل باقی مونده اینه ک مدتی ک رله به واسطه حرکت کند موتور هنوز روشنه(4 دقیقه)تابع millis همچنان در حالت شمارشه در حالی ک من میخوام بعد از فشرده شدن کلید ها شمارش انجام بشه.آیا باز هم تابع millis جوابگو هست؟
    تو اینترنت زیاد گشتم چیزهایی ک به زهنم خطور میکنه:
    1. این ک از ی مازول ساعتds3231 استفاده کنم (اما نمیدونم چطوری بر اساس ساعت اون دستورات رو از میکرو دریافت کنم)
    2.استفاده از کریستال ساعت32.768 و دریافت ساعت دقیق(اینم مثل بالایی بلد نیستم)

    فلوچارت:http://s6.picofile.com/file/8255108634/000.JPG
    نه تابع MILLIS این حرفا سرش نمیشه
    از وقتی پاور میدی میشماره

    برای ماژول های ساعت ترجیحا از دقیقش استفاده کن
    البته من اخیرا این تایمر رو کشف کردم :
    Make an accurate Arduino clock using only one wire - NO external hardware needed! - All
    لایک کردن

  10. #10
    Senior Member
    تاریخ عضویت
    Nov 2015
    نوشته ها
    229
    نقل قول نوشته اصلی توسط magmagmary نمایش پست ها
    نه تابع millis این حرفا سرش نمیشه
    از وقتی پاور میدی میشماره

    برای ماژول های ساعت ترجیحا از دقیقش استفاده کن
    البته من اخیرا این تایمر رو کشف کردم :
    make an accurate arduino clock using only one wire - no external hardware needed! - all
    ممنون جالب بود ،
    چنتا سوال
    1- اینکه فرکانس pwm همیشه ثابته و با گرم شدن و در طول زمان تغییر نمیکنه؟
    2- به جای اینکه pwm رو روی 127 قرار بده ، اگه مثلا روی 50 یا هر عدد دیگه ای غیر از 0 و 255 قرار میداد نتیجه فرق میکرد؟
    3- الان تو این برد آردوینو چنتا نوسان ساز هست کلا و کدوم دقتش بیشتره؟

صفحه 1 از 3 123 آخرینآخرین

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

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

SEO by vBSEO