نمایش نتایج: از 1 به 6 از 6
Like Tree3 لایک
  • 1 Post By magmagmary
  • 1 Post By magmagmary
  • 1 Post By فرجاد

موضوع: ئرخواست کمک برای حل مشکل تایمر و وقفه!

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

    Question ئرخواست کمک برای حل مشکل تایمر و وقفه!

    سلام.

    یه برنامه کنترلی دارم که دستور رو از طریق پورت سریال به برد یونو میفرسته. هدف کنترل سه تا رله هست. دستور ارسالی شامل نام پین ( متصل به رله) و تایمر( زمان روشن بودن رله هست) .

    سوال اول: برنامه زیر برای دریافت زمان کار میکنه. حالا چنانچه دوستان راه حل بهتری دارن، ممنون میشم
    i
    nt RelayPin;
    int Time;
    void setup() {
    Serial.begin(9600);
    while (!Serial) {
    }
    }

    void loop() {

    while (Serial.available() < 4); //wait until there are 3 bytes in the buffer
    {
    }
    RelayPin = Serial.read();
    Time = Serial.read();
    Time += Serial.read();
    digitalWrite(RelayPin)=LOW;
    delay(Time);
    digitalWrite(RelayPin)=HIGH;

    }

    }

    سوال دوم و اصلی:
    چطور میتونم وقتی یکی از پین های راه انداز فعاله ، یکی دیگه رو هم کنترل کنم! چون از delay استفاده کردم، حلقه تا پایان زمانش استپ میشه و نمیتونم همزمان به دو تا پین دسترسی داشته باشم. گویا باید از وقفه استفاده کرد ام نمیدونم چطور!
    از هرگونه راهنماییتون ممنونم.
    در
    ویرایش توسط فرجاد : 06-19-2016 در ساعت 10:13 PM

  2. #2
    Junior Member
    تاریخ عضویت
    May 2016
    نوشته ها
    12
    کد:
    int RelayPin;
    int Time;
    void setup() {
      Serial.begin(9600);
      while (!Serial) {
      }
    }
    
    
    void loop() {
    
      while (Serial.available() < 4); //wait until there are 3 bytes in the buffer
      {
      }
      RelayPin = Serial.read();
      Time = Serial.read();
      Time += Serial.read();
      digitalWrite(RelayPin)=LOW;
      delay(Time);
        digitalWrite(RelayPin)=HIGH;
    
    }

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


    کدتون برای دریافت 3 بایت رو تا حالا اینجوری ندیده بودم
    جالب بود
    البته ورژن صحیح ترش برای 2 بایت این شکلیه :
    کد:
    while(Serial.available() < 2); //wait until there are two bytes in the bufferMAP = Serial.read() << 8 ;   //read MSB into MAPMAP += Serial.read();        //read LSB into MAP
    من همیشه با حلقه for می نویسم
    لایک کردن

  4. #4
    Junior Member
    تاریخ عضویت
    May 2016
    نوشته ها
    12
    ممنون بابت پاسخ.
    در کاربرد تابع millis ، نوشته شده خواندن زمان.

    Returns the number of milliseconds since the Arduino board began running the current program


    در صورتی که من میخام زمان روشن بودن پین رله رو اعمال کنم.


    و البته همونطور که گفتم زمان فعال بودن پین ها ممکنه همپوشانی داشته باشه.

    F1 F1 F1

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

    Returns the number of milliseconds since the Arduino board began running the current program


    در صورتی که من میخام زمان روشن بودن پین رله رو اعمال کنم.


    و البته همونطور که گفتم زمان فعال بودن پین ها ممکنه همپوشانی داشته باشه.

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

    میره کاراشو انجام میده وقتی زمانی که ما براش تعیین کردیم رسید شرط if رو اجرا می کنه :

    کد:
    
    
    
    const int ledPin =  13;      // the number of the LED pin
    
    
    int ledState = LOW;             // ledState used to set the LED
    
    
    
    
    unsigned long previousMillis = 0;        // will store last time LED was updated
    
    
    
    
    const long interval = 1000;           // interval at which to blink (milliseconds)
    
    
    void setup() {
    
    
      pinMode(ledPin, OUTPUT);
    }
    
    
    void loop() {
    
    
      unsigned long currentMillis = millis();
    
    
      if (currentMillis - previousMillis >= interval) {
    
    
        previousMillis = currentMillis;
    
    
    
    
        if (ledState == LOW) {
          ledState = HIGH;
        } else {
          ledState = LOW;
        }
    
    
    
    
        digitalWrite(ledPin, ledState);
      }
    }
    توی این کد داره میگه ه1 یک ثانیه یک بار ال ای دی شماره 13 روشن و خاموش بشه
    شما می تونید از این کد الهام بگیرید
    لایک کردن

  6. #6
    Junior Member
    تاریخ عضویت
    May 2016
    نوشته ها
    12
    نقل قول نوشته اصلی توسط magmagmary نمایش پست ها
    ببینید همون کاری رو که دیلی انجام میدید دقیقا میشه با میلیس انجام داد با این تفاوت که دیگه پروسسور توی خط دیلی توقف نمیکنه

    میره کاراشو انجام میده وقتی زمانی که ما براش تعیین کردیم رسید شرط if رو اجرا می کنه :

    کد:
    
    
    
    const int ledPin =  13;      // the number of the LED pin
    
    
    int ledState = LOW;             // ledState used to set the LED
    
    
    
    
    unsigned long previousMillis = 0;        // will store last time LED was updated
    
    
    
    
    const long interval = 1000;           // interval at which to blink (milliseconds)
    
    
    void setup() {
    
    
      pinMode(ledPin, OUTPUT);
    }
    
    
    void loop() {
    
    
      unsigned long currentMillis = millis();
    
    
      if (currentMillis - previousMillis >= interval) {
    
    
        previousMillis = currentMillis;
    
    
    
    
        if (ledState == LOW) {
          ledState = HIGH;
        } else {
          ledState = LOW;
        }
    
    
    
    
        digitalWrite(ledPin, ledState);
      }
    }
    توی این کد داره میگه ه1 یک ثانیه یک بار ال ای دی شماره 13 روشن و خاموش بشه
    شما می تونید از این کد الهام بگیرید
    اهان. حالا متوجه شدم. الگوریتم اصلی میشه بر مینای ذخیره زمان و مقایسه اون با تایمر . بسیار عالی. ممنون

    لایک کردن

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

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

SEO by vBSEO