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

موضوع: استفاده از تایمر

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

    استفاده از تایمر

    ببخشید من کد زیر رو نوشتم ایرادش چیه که تو زمان مشخص شده زیر برنامه
    result اجرا نمیشه


    [
    LEFT]#include <Event.h>
    #include <Timer.h>
    Timer t;

    void setup(){
    int tm;
    pinMode(13,OUTPUT);}

    void loop
    (){
    t.update();
    t.every(tm,result);
    }

    void result (){
    digitalWrite (13,HIGH);
    }

  2. #2
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    3,995
    اوکی

    کد نویسی ای که انجام دادید اشتباهه
    1. اینکه هیچ نیازی نبود که کتابخونه event رو صدا بزنید
    2.متد every باید توی تابع Setup نوشته بشه نه loop
    3. متد every توی آرگومان اولش باید زمانی رو بگیره که یه تابعی باید تکرار بشه بنابراین شما باید به متغیر tm مقدار بدید و اونو گلوبال هم تعریف کنید نه توی تابع setup
    کد مطلوب شما:
    کد:
    
    #include <Timer.h>
    Timer t;
    int tm = 1000;
    
    
    void setup() {
      pinMode(13, OUTPUT);
      t.every(tm, result);
    }
    
    
    void loop() {
      t.update();
    
    
    }
    
    
    void result () {
      digitalWrite (13, HIGH);
      delay(100);
       digitalWrite (13, LOW);
    
    
    }
    لایک کردن

  3. #3
    Member
    تاریخ عضویت
    May 2016
    نوشته ها
    86
    ولی برنامه من اینطوریکه تو ی ستاپ و لوپ برنامه ی دیگه ای نوشته میشه و توی یکی از زیر یرنامه ها تابع تایمر فراخوانی و اجرا میشه ینی من میخام از یه مرحله ای به بعد t.every اجرا بشه اما وقتی تو ستاپ بنویسم همون اول اجرا میشه که من نمیخام در ضمن tm هم در برنامه من متغییر هستش و تو ی یکی از زیر برنامه ها تعیین میشه
    ویرایش توسط ANOOSHEH : 07-09-2016 در ساعت 09:27 AM

  4. #4
    Member
    تاریخ عضویت
    May 2016
    نوشته ها
    86
    من همین مشکلو با اینتراپت هم دارم میخام شماره پین تو وسط برنامه تغییر کنه اما اینتراپت اجرا نمیشه کدمم اینه
    int key,a=0;

    void setup() {
    pinMode(16,INPUT);
    pinMode(22,INPUT);
    pinMode(23,INPUT);
    attachInterrupt(key,result,FALLING);
    Serial.begin(9600);
    Serial.print("choose one key");

    }


    void loop() {
    if ( digitalRead(16)==LOW){
    key=16;
    Serial.print("you choose 16");
    }
    if (digitalRead(22)==LOW){
    key=22;
    Serial.print("you choose 22");

    }
    if ( digitalRead(23)==LOW){
    key=23;
    Serial.print("you choose 23");

    }
    if (key!=0){
    Serial.print("hooora");

    timer();}

    }

    void timer(){
    Serial.print("timer");
    while(1){
    a=micros();
    };

    }
    void result () {
    Serial.println("time in micros: ");
    Serial.print(a);
    key=0;
    }

    البته به جای key = 16برای مثال
    #define key 16
    هم گذاشتم باز اینتراپت اچرا نمیشه
    ویرایش توسط ANOOSHEH : 07-09-2016 در ساعت 12:01 PM

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



    البته به جای key = 16برای مثال
    #define key 16
    هم گذاشتم باز اینتراپت اچرا نمیشه
    به کدتون دقت کنید:
    شما فقط توی تابع ستاپ زمانی که key صفره دارید attachInterrupt رو صدا می زنید.
    در صورتی که میخواید روی تمام پینهایی که صدا زدید اینتراپت داشته باشید باید تابع attachInterrupt رو هر بار که میرید تو if صدا بزنیدو بهش مقدار بدید.

    آیا هدفتون اینه که روی تمام پینها اینتراپت داشته باشید یا فقط پین 2

  6. #6
    Member
    تاریخ عضویت
    May 2016
    نوشته ها
    86
    ببینید من دو کار میخوام امجام بدم یکی توی یک مدت زمان متغییر (ینی خودمون مدت زمانشو مشخص کنیم ) یک کار انجام بشه (مثلن شمردن کلید فشار داده شده ) و وقتی اون مدت زمان تموم شد نتیجه (تعداد کلید فشرده شده ) رو نمایش بده ( در ضمن این کار ممکنه چن بار انجام بشه ینی باید تایمر متوقف و صفر و دوباره مقدار دهی بشه )این کارو میخامبا تایمر انجام بدم و همونطور که گفتم این برنامه یکی از زیر برنامه های من هست و من نمیتونم توی ستاپ یا لوپ تایمر رو راه اندازی کنم
    کار دوم یا زیر برنامه دیگه رو که با اینتراپته بعدن میپرسم
    ویرایش توسط ANOOSHEH : 07-12-2016 در ساعت 09:27 AM

  7. #7
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    3,995
    نقل قول نوشته اصلی توسط ANOOSHEH نمایش پست ها
    ببینید من دو کار میخوام امجام بدم یکی توی یک مدت زمان متغییر (ینی خودمون مدت زمانشو مشخص کنیم ) یک کار انجام بشه (مثلن شمردن کلید فشار داده شده ) و وقتی اون مدت زمان تموم شد نتیجه (تعداد کلید فشرده شده ) رو نمایش بده ( در ضمن این کار ممکنه چن بار انجام بشه ینی باید تایمر متوقف و صفر و دوباره مقدار دهی بشه )این کارو میخامبا تایمر انجام بدم و همونطور که گفتم این برنامه یکی از زیر برنامه های من هست و من نمیتونم توی ستاپ یا لوپ تایمر رو راه اندازی کنم
    کار دوم یا زیر برنامه دیگه رو که با اینتراپته بعدن میپرسم
    خب این چیزی که شما میخوای میشه اینتراپت

    کافیه شما توی loo تون تابعی داشته باشید که دائم وضعیت یه پن دیجیتال رو چک کنه و به ازای هر بار فشار داده شدن یه متغیر رو ++ کنه

    حالا هر بار که اینتراپت خورد بیاد مقدار این متغیر رو نشون بده

  8. #8
    Member
    تاریخ عضویت
    May 2016
    نوشته ها
    86
    خب من میخوام از امکانات اردوینو استفاده کنم و با تایمر این برنامه رو بنویسم ببنید من بذنامه ریر رو نوشتم ولی وقتی که tm =tm*1000*60 میکنم (1000 تبدیل ثانیه به میلی ،60 تبدیل دقیقه به ثانیه) برنامه به زیر برنامه
    resultTap
    نمیره ولی اگه همین اعداد بشه tm=tm*60*100دقیقا راس 6 ثانیه (اگه tm =1)میره زیر برنامه مشکل از کجاس


    #include <Bounce2.h>
    #include <Timer.h>




    int tm,i,z;
    int buttonPushCounter = 0; // counter for the number of button presses
    int buttonState = 0; // current state of the button
    int lastButtonState = 0;
    const int buttonPin= 16;// previous state of the button
    Timer t;
    Bounce debouncer = Bounce();

    void setup() {
    pinMode(22,INPUT);//define pinMode
    pinMode(23,INPUT);
    pinMode(16,INPUT);
    debouncer.attach(16);
    debouncer.interval(5);

    Serial.begin(9600);
    delay(2000);
    tm=0;

    }
    void loop(){
    while(1){

    Serial.print("press9 up,10 down");

    Serial.print(tm);
    delay (1000);
    if (digitalRead(22)==LOW){
    tm++;
    while(digitalRead(22)==HIGH);

    Serial.println(tm);

    }
    if (digitalRead(23)==LOW)
    { tm--;
    while(digitalRead(23)==HIGH);

    Serial.println(tm);

    }
    if(tm<0){tm=0;}
    if(digitalRead( 16)==LOW){

    Serial.print("you are ready...");
    delay(10);
    tm=tm*60*1000;
    for (i=3;i>0;i--){

    Seial.print(i);
    delay(1000);
    }

    while(1){

    t.update();
    t.after(tm, resultTap);
    debouncer.update();
    // read the pushbutton input pin:
    buttonState = debouncer.read();

    Serial.print("number of button pushes: ");

    if (buttonState != lastButtonState) {

    if (buttonState == LOW) {


    buttonPushCounter++;

    Serial.println(buttonPushCounter);
    }


    delay(50);
    }


    lastButtonState = buttonState;


    }


    }

    }
    }

    void resultTap(){
    t.stop(z);//timer stop

    Serial.print("number of result: ");//showing number of push
    Serial.println(buttonPushCounter);
    delay(5000);
    }

    البته من این برنامه رو روی ال سی دی کاراکتری نوشتم و الان اینجا یکم به مشکل برمیخوذید اما برام این مهمه که بعد مثلا یک دقیقه زیربرنامه اجرا که نمیشه البته همونطوذ که بالا گفتم وقتی عدد 1000 میشه 100 برنامه درس اجرا میشه
    ویرایش توسط ANOOSHEH : 07-13-2016 در ساعت 01:25 PM

  9. #9
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    3,995
    نقل قول نوشته اصلی توسط ANOOSHEH نمایش پست ها
    خب من میخوام از امکانات اردوینو استفاده کنم و با تایمر این برنامه رو بنویسم ببنید من بذنامه ریر رو نوشتم ولی وقتی که tm =tm*1000*60 میکنم (1000 تبدیل ثانیه به میلی ،60 تبدیل دقیقه به ثانیه) برنامه به زیر برنامه
    resultTap
    نمیره ولی اگه همین اعداد بشه tm=tm*60*100دقیقا راس 6 ثانیه (اگه tm =1)میره زیر برنامه مشکل از کجاس





    البته من این برنامه رو روی ال سی دی کاراکتری نوشتم و الان اینجا یکم به مشکل برمیخوذید اما برام این مهمه که بعد مثلا یک دقیقه زیربرنامه اجرا که نمیشه البته همونطوذ که بالا گفتم وقتی عدد 1000 میشه 100 برنامه درس اجرا میشه

    قبل از این که بخوام دستی ببرم تو کدت یه قانون وجود داره که نباید تو تابع اینتراپت به هیچ عنوان از Delay استفاده کرد

    delay(5000 رو بردار ببین مشکلت چقدر حل میشه

  10. #10
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    3,995
    کدی که باید تست کنی اینه :
    کد:
    #include <Bounce2.h>
    #include <Timer.h>
    
    
    int tm, i, z;
    int buttonPushCounter = 0; // counter for the number of button presses
    int buttonState = 0; // current state of the button
    int lastButtonState = 0;
    const int buttonPin = 16; // previous state of the button
    Timer t;
    Bounce debouncer = Bounce();
    
    
    void setup() {
      pinMode(22, INPUT); //define pinMode
      pinMode(23, INPUT);
      pinMode(16, INPUT);
      debouncer.attach(16);
      debouncer.interval(5);
    
    
      Serial.begin(9600);
      delay(2000);
      tm = 0;
    
    
    }
    void loop() {
    
    
      Serial.print("press9 up,10 down");
    
    
      Serial.print(tm);
      delay (1000);
      if (digitalRead(22) == LOW) {
        tm++;
        while (digitalRead(22) == HIGH);
    
    
        Serial.println(tm);
    
    
      }
      if (digitalRead(23) == LOW)
      { tm--;
        while (digitalRead(23) == HIGH);
    
    
        Serial.println(tm);
    
    
      }
      if (tm < 0) {
        tm = 0;
      }
      if (digitalRead( 16) == LOW) {
    
    
        Serial.print("you are ready...");
        delay(10);
        tm = tm * 60 * 1000;
        for (i = 3; i > 0; i--) {
    
    
          Seial.print(i);
          delay(1000);
        }
    
    
        while (1) {
    
    
          t.update();
          t.after(tm, resultTap);
          debouncer.update();
          // read the pushbutton input pin:
          buttonState = debouncer.read();
    
    
          Serial.print("number of button pushes: ");
    
    
          if (buttonState != lastButtonState) {
    
    
            if (buttonState == LOW) {
    
    
    
    
              buttonPushCounter++;
    
    
              Serial.println(buttonPushCounter);
            }
    
    
    
    
            delay(50);
          }
    
    
    
    
          lastButtonState = buttonState;
    
    
    
    
        }
    
    
    
    
      }
    
    
    
    
    }
    
    
    void resultTap() {
      t.stop(z);//timer stop
    
    
      Serial.print("number of result: ");//showing number of push
      Serial.println(buttonPushCounter);
      //delay(5000);
    }
    به یه چیز هم دقت کن
    خود تابع loop به صورت حلقه همیشگی تکرار میشه بنابراین while(1) اولیت اضافی بود

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

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

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

SEO by vBSEO