اطلاعیه

Collapse
No announcement yet.

فاصله سنج

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

    فاصله سنج

    سلام مهندس
    من برنامه زیر که برای فاصله سنج هست رو گرفتم. یه مدار دیگه میخوام با این برنامه طراحی کنم.مشکلم اینه که تو این حلقه وقتی(if (distance <= 30 به این فاصله میرسهled به طور دایم روشن میمونه.من میخوام تو این فاصله led برای5 ثانیه روشن بمونه. و بعد خاموش بشه.تو مدار من شاید این فاصله یه چند ساعتی ثابت باشه.ولی نمیخوام چراغم ثابت روشن بمونه.فقط 5 ثانیه روشن بمونه.کمکم کنید.نیاز دارم
    اینم کل برنامش.برای if اولش حل کنید.سه led دیگه هم حل میشه
    #define trigPin 7
    #define echoPin 6
    #define led 13
    #define led2 12
    #define led3 11
    #define buzzer 3
    int sound = 250;


    void setup() {
    Serial.begin (9600);
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);
    pinMode(led, OUTPUT);
    pinMode(led2, OUTPUT);
    pinMode(led3, OUTPUT);
    pinMode(buzzer, OUTPUT);
    }


    void loop() {
    long duration, distance;
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    distance = (duration/2) / 29.1;


    if (distance <= 30) {
    digitalWrite(led, HIGH);
    sound = 250;
    }
    else {
    digitalWrite(led,LOW);
    }
    if (distance < 25) {
    digitalWrite(led2, HIGH);
    sound = 260;
    }
    else {
    digitalWrite(led2, LOW);
    }
    if (distance < 20) {
    digitalWrite(led3, HIGH);
    sound = 270;
    }
    else {
    digitalWrite(led3, LOW);
    }
    if (distance > 30 || distance <= 0){
    Serial.println("Out of range");
    noTone(buzzer);
    }
    else {
    Serial.print(distance);
    Serial.println(" cm");
    tone(buzzer, sound);
    }
    delay(500);


    }

    #2
    پاسخ : فاصله سنج

    عزیزم شما که اومدید کد رو همین جوری کپی کردید سخته خوندنش بیایید ازتگ ++C در توی نوار ابزار انجمن استفاده کنید تا حداقل بشه خوندش. بعدش بفرمایید سنسورش چیه؟ گویا التراسونیکه
    گویند سنگ لعل شود در مقام صبر اری شود ولی به خون جگر شود
    همیشه آخر همه چیز خوبه، اگر هم هنوز خوب نشده پس هنوز آخرش نشده(چارلی چاپلین)

    دیدگاه


      #3
      پاسخ : فاصله سنج

      درود ، اولین قدم برنامه مشکل الگوریتمی داره که باید رفع بشه بعد در برنامه جدید بتونیم کار کنیم . فرض کنید فاصله ۱۰ هست ، تمام شرط ها بر قرار هستند . کوچکتر از ۳۰ هست ،کوچکتر از ۲۵ هست کوچکتر از ۲۰ هست !!!
      راه حل که به ذهنم میرسه به این شکل هست ، نوشتنش با شما

      اگر کمتر از ۳۰ بود فلگ = ۳۰
      اگر کمتر از ۲۵ بود فلگ = ۲۵
      اگر کمتر از ۲۰ رود فلگ = ۲۰

      تابع روشن شدن led
      اگر فلگ مخالف فلگ قبل بود
      روشن شدن led
      تایمر ( تابع milis)
      خاموش کردن led

      اگر فلگ برابر فلگ قبل بود
      خاموش led

      نکته اصلی اینه متوجه بشیم هنوز توی بازه قبل هست یا وارد بازه دیگه شده ، اگر همچنان در بازه قبل بود led همچنان خاموش میماند .منظور از فلگ یک متغیر نشانه گذاری هست . امیدوارم خوب توضیح داده باشم ، چون اولین مرحله درک درست الگوریتم هست. برنامه رو تا جای مقدور بنویسید اگر مشکلی بود رفع میکنیم

      دیدگاه


        #4
        پاسخ : فاصله سنج

        نوشته اصلی توسط mahdi72z نمایش پست ها
        برای if اولش حل کنید.سه led دیگه هم حل میشه
        سلام. لطفا به ترتیب if ها دقت کنید:

        if((distance > 30) || (distance <= 0)){
        Serial.println("Out of range");
        noTone(buzzer);
        } else if(distance < 20){
        digitalWrite(led3, HIGH);
        delay(5000);
        digitalWrite(led3, LOW);
        sound = 270;
        } else if (distance < 25) {
        digitalWrite(led2, HIGH);
        delay(5000);
        digitalWrite(led2, LOW);
        sound = 260;
        } else if (distance <= 30) {
        digitalWrite(led, HIGH);
        delay(5000);
        digitalWrite(led, LOW);
        sound = 250;
        }else {
        Serial.print(distance);
        Serial.println(" cm");
        tone(buzzer, sound);
        }


        نیازی به خاموش کردن led ها نیست. چون تایمر دارند.
        جدیدترین ویرایش توسط digi-rx; ۲۳:۴۴ ۱۳۹۷/۰۸/۲۸.
        تاپیک ویدیوهای آموزشی حواشی آردوینو و ESP

        دیدگاه


          #5
          پاسخ : فاصله سنج

          من طبق فرمایشات شما الگوریتمشو ویرایش کردم.الان طبق کدهای زیر.برنامه وقتی به اون فاصله خودش میرسه.همون چراغ برای همون فاصله روشن میشه و با تعقیر فاصله باز چراغ قبلی خاموش و چراغ فاصله جدید روشن میشه.
          ولی من میخوام که وقتی چراغ مربوط به هر فاصله روشن شد.فقط 5 ثانیه فعال بمونه نه دایم.تو کدا الان فعاله
          لطفا دوستان با کد برام درج کنید
          سنسورشم التراسونیکه.کاری که من میخوام انجام بدم تو یه فاصله شاید یه ساعتی ثابت بمونه.اما ایرادش اینه که چراغ اون فاصله ثابته.اگه بشه تو بازه 5 ثانیه قطع بشه. خیلی خوب میشه


          #define echoPin 6


          #define led 13


          #define led2 12


          #define led3 11


          #define buzzer 3




          int sound = 250;
          void setup() {


          Serial.begin (9600);


          pinMode(trigPin, OUTPUT);


          pinMode(echoPin, INPUT);


          pinMode(led, OUTPUT);


          pinMode(led2, OUTPUT);


          pinMode(led3, OUTPUT);


          pinMode(buzzer, OUTPUT);
          }
          void loop() {


          long duration, distance;


          digitalWrite(trigPin, LOW);


          delayMicroseconds(2);


          digitalWrite(trigPin, HIGH);


          delayMicroseconds(10);


          digitalWrite(trigPin, LOW);


          duration = pulseIn(echoPin, HIGH);


          distance = (duration/2) / 29.1;


          if((distance > 30) || (distance <= 0)){
          Serial.println("Out of range");
          noTone(buzzer);
          } else if(distance < 20){
          digitalWrite(led3, HIGH);
          delay(5000);
          digitalWrite(led3, LOW);
          sound = 270;
          } else if (distance < 25) {
          digitalWrite(led2, HIGH);
          delay(5000);
          digitalWrite(led2, LOW);
          sound = 260;
          } else if (distance <= 30) {
          digitalWrite(led, HIGH);
          delay(5000);
          digitalWrite(led,LOW);
          sound = 250;
          }else {
          Serial.print(distance);
          Serial.println(" cm");
          tone(buzzer, sound);
          }


          دلیل: ادغام دو پست برای جلوگیری از اسپم

          مهندس من ویرایش کردم و کدای زیر رو براتون فرستادم.مشکلو گفتم باز
          جدیدترین ویرایش توسط mahdi72z; ۱۳:۵۳ ۱۳۹۷/۰۸/۲۹.

          دیدگاه


            #6
            پاسخ : فاصله سنج

            درود بر شما
            دوست عزیز دلیلش واضحه... برنامه شما درست کار میکنه.مشکل اینجاست که اون led در یکبار اجرای برنامه 5 ثانیه روشن میمونه و در سیکل بعد دوباره وارد همون حلقه میشه و باز 5 ثانیه دیگه روشن هست و الی آخر. نتیجه اینکه شما led رو همیشه روشن میبینی.
            کاری که آقا مسعود گفتند رو انجام بدید... باید از بازگشت مجدد به یک حلقه تکراری بدون تغییر وضعیت ، جلوگیری کنید.

            دیدگاه


              #7
              پاسخ : فاصله سنج

              پیشنهاد :
              بازه های مسافت رو دو شرطی کنید:
              کمتر مساوی 30 و بزرگتر از 25
              کمتر مساوی 25 و بزرگتر از 20
              کمتر مساوی 20 ( یا : کمتر مساوی 20 و بزرگتر از 0)
              اینجوری تداخل بازه ها از بین میره...

              دیدگاه


                #8
                پاسخ : فاصله سنج

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

                #define trigPin 7


                #define echoPin 6


                #define led 13


                #define led2 12


                #define led3 11


                #define buzzer 3




                int sound = 250;
                void setup() {


                Serial.begin (9600);


                pinMode(trigPin, OUTPUT);


                pinMode(echoPin, INPUT);


                pinMode(led, OUTPUT);


                pinMode(led2, OUTPUT);


                pinMode(led3, OUTPUT);


                pinMode(buzzer, OUTPUT);
                }
                void loop() {


                long duration, distance;


                digitalWrite(trigPin, LOW);


                delayMicroseconds(2);


                digitalWrite(trigPin, HIGH);


                delayMicroseconds(10);


                digitalWrite(trigPin, LOW);


                duration = pulseIn(echoPin, HIGH);


                distance = (duration/2) / 29.1;


                if(distance<=30&&distance>25)
                {
                digitalWrite(led3, HIGH);
                delay(3000);
                digitalWrite(led3, LOW);




                sound = 270;
                } else if(distance<=25&&distance>20)
                {
                digitalWrite(led2, HIGH);
                delay(3000);
                digitalWrite(led2, LOW);


                sound = 250;
                } else if(distance<=20&&distance>0)
                {
                digitalWrite(led, HIGH);
                delay(3000);
                digitalWrite(led,LOW);


                sound = 250;
                }else {
                Serial.print(distance);
                Serial.println(" cm");
                tone(buzzer, sound);
                }
                }


                دلیل: ادغام دو پست برای جلوگیری از اسپم

                من دستورات فاصله رو فهمیدم که آقا مسعود گفتن.ولی باقیشو چجوری بنویسم تا دوباره وارده حلقه نشه و همون یه بار فقط۵ ثانیه فعال بمونه

                دیدگاه


                  #9
                  پاسخ : فاصله سنج

                  نوشته اصلی توسط mahdi72z نمایش پست ها
                  من دستورات فاصله رو فهمیدم که آقا مسعود گفتن.ولی باقیشو چجوری بنویسم تا دوباره وارده حلقه نشه و همون یه بار فقط۵ ثانیه فعال بمونه
                  برنامه بصورت زیر اصلاح شد. نیازی دو قسمتی کردن شرط ها نیست. همونطور که قبلا هم عرض کردم طوری مرتب شده که تموم بازه هایی که گفته بودید درونش رعایت شده و با اولین حالت صحیح مابقی شرط ها اجرا نمیشوند.

                  #define echoPin 6
                  #define led 13
                  #define led2 12
                  #define led3 11
                  #define buzzer 3
                  int sound = 250;
                  long lastDistance = 0;

                  void setup() {
                  Serial.begin (9600);
                  pinMode(trigPin, OUTPUT);
                  pinMode(echoPin, INPUT);
                  pinMode(led, OUTPUT);
                  pinMode(led2, OUTPUT);
                  pinMode(led3, OUTPUT);
                  pinMode(buzzer, OUTPUT);
                  }
                  void loop() {
                  long duration, distance;
                  digitalWrite(trigPin, LOW);
                  delayMicroseconds(2);
                  digitalWrite(trigPin, HIGH);
                  delayMicroseconds(10);
                  digitalWrite(trigPin, LOW);
                  duration = pulseIn(echoPin, HIGH);
                  distance = (duration/2) / 29.1;

                  if(distance == lastDistance){
                  lastDistance = distance;

                  if((distance > 30) || (distance <= 0)){
                  Serial.println("Out of range");
                  noTone(buzzer);
                  } else if(distance < 20){
                  digitalWrite(led3, HIGH);
                  delay(5000);
                  digitalWrite(led3, LOW);
                  sound = 270;
                  } else if (distance < 25) {
                  digitalWrite(led2, HIGH);
                  delay(5000);
                  digitalWrite(led2, LOW);
                  sound = 260;
                  } else if (distance <= 30) {
                  digitalWrite(led, HIGH);
                  delay(5000);
                  digitalWrite(led,LOW);
                  sound = 250;
                  }else {
                  Serial.print(distance);
                  Serial.println(" cm");
                  tone(buzzer, sound);
                  }
                  }
                  }



                  دلیل: ادغام دو پست برای جلوگیری از اسپم

                  این محیط ارسال کد چرا یک سری از خطوط جدید (enter) رو که برای زیبایی کد نوشتیم حذف میکنه؟!!
                  تاپیک ویدیوهای آموزشی حواشی آردوینو و ESP

                  دیدگاه


                    #10
                    پاسخ : فاصله سنج

                    نوشته اصلی توسط digi-rx نمایش پست ها
                    برنامه بصورت زیر اصلاح شد. نیازی دو قسمتی کردن شرط ها نیست. همونطور که قبلا هم عرض کردم طوری مرتب شده که تموم بازه هایی که گفته بودید درونش رعایت شده و با اولین حالت صحیح مابقی شرط ها اجرا نمیشوند.


                    دلیل: ادغام دو پست برای جلوگیری از اسپم

                    این محیط ارسال کد چرا یک سری از خطوط جدید (enter) رو که برای زیبایی کد نوشتیم حذف میکنه؟!!
                    این کد هم واضح هست که مشکل داره.
                    به ازاء هر تغییر جزئی در فاصله هرچند که در یک محدوده باشه باز led روشن میشه. مثلا یک بار برای فاصله 30 روشن میشه اگر فاصله شد 29 ( که بخاطر خطای سنسور و ... احتمالش هست ) باز led روشن میشه در صورتی که تا فاصله کمتر از 25 نشده نباید led دوباره روشن بشه.

                    دیدگاه


                      #11
                      پاسخ : فاصله سنج

                      مهندس برنامه رو ران کردم اجرا نشد.یعنی خطا نداشت.ولی اصلا جلوی سنسور میگرم جسمی رو اتفاقی نمیفته.انگار ایراد داره
                      انگار با بخش زیر مشکل داره.اینجا که قرار دادین

                      if(distance == lastDistance){
                      lastDistance = distance;
                      جدیدترین ویرایش توسط mahdi72z; ۲۳:۱۸ ۱۳۹۷/۰۸/۳۰.

                      دیدگاه


                        #12
                        پاسخ : فاصله سنج

                        نوشته اصلی توسط mahdi72z نمایش پست ها
                        مهندس برنامه رو ران کردم اجرا نشد.یعنی خطا نداشت.ولی اصلا جلوی سنسور میگرم جسمی رو اتفاقی نمیفته.انگار ایراد داره
                        اگه دقیقا کد قبل رو کپی پیست کردی احتمالا #define trigPin 7 رو نزدی...

                        دیدگاه


                          #13
                          پاسخ : فاصله سنج

                          نوشته اصلی توسط behnam18 نمایش پست ها
                          این کد هم واضح هست که مشکل داره.
                          به ازاء هر تغییر جزئی در فاصله هرچند که در یک محدوده باشه باز led روشن میشه. مثلا یک بار برای فاصله 30 روشن میشه اگر فاصله شد 29 ( که بخاطر خطای سنسور و ... احتمالش هست ) باز led روشن میشه در صورتی که تا فاصله کمتر از 25 نشده نباید led دوباره روشن بشه.
                          من طبق مواردی که استارتر تاپیک خواسته بودند و بالاتر ذکر کردند و گویا در پیاده سازی این الگوریتم به مشکل خورده بودند. برنامشون رو با همون الگوریتم اصلاح کردم. قطعا اگر مورد یا موارد دیگری هم می گفتند در برنامه لحاظ می شد.
                          دوستان بهتر بود بجای اعلام نظر روی کد دیگری ; نظراتشون رو توی کد می آوردند تا هم تاپیک تخصصی تر و هم به استارتری که خودشون گفتند توی پیاده سازی به مشکل خوردند کمک بهتری شود.
                          تاپیک ویدیوهای آموزشی حواشی آردوینو و ESP

                          دیدگاه


                            #14
                            پاسخ : فاصله سنج

                            نوشته اصلی توسط digi-rx نمایش پست ها
                            من طبق مواردی که استارتر تاپیک خواسته بودند و بالاتر ذکر کردند و گویا در پیاده سازی این الگوریتم به مشکل خورده بودند. برنامشون رو با همون الگوریتم اصلاح کردم. قطعا اگر مورد یا موارد دیگری هم می گفتند در برنامه لحاظ می شد.
                            دوستان بهتر بود بجای اعلام نظر روی کد دیگری ; نظراتشون رو توی کد می آوردند تا هم تاپیک تخصصی تر و هم به استارتری که خودشون گفتند توی پیاده سازی به مشکل خوردند کمک بهتری شود.
                            درود ، در برنامه ای که شما نوشتید ، در سیکل اول اجرا ، فاصله مثلاً ۱۹ هست و شرط کوچکتر از ۲۰ برقرار شده و led مربوطه روشن شده و با یک تاخیر ۵ ثانیه خاموش میشه . در سیکل بعد چه اتفاقی میوفته ؟ همچنان فاصله ۱۹ هست ، شرط نقض میشه ؟ led مجدد روشن نمیشه ؟
                            این برنامه فقط با فلگ گذاری حل میشه و بنده تا جای ممکن الگوریتم رو توضیح دادم ، کسی که مدار رو بسته ، باید عملی تست کنه نتیجه گیری کنه ، کجا فلگ گذاری بشه کجا مقدار دهی بشه ، صرف تغییر یک if به else if این برنامه رو حل نمیکنه ، کد نوشتن با کد عملی فرق می*کنه. به استارتر هم عرض کردم تا جای ممکن برنامه رو بنویسند ، مشکل خورد بررسی میکنیم حل میشه ، حالا اگر در گرفتاری روزمره زمانی پیدا شد مدار رو ببندم و تست کنم کد رو .

                            دیدگاه


                              #15
                              پاسخ : فاصله سنج

                              این کد رو هم تست بفرمایید:

                              #define trigPin 7
                              #define echoPin 6
                              #define led 13
                              #define led2 12
                              #define led3 11
                              #define buzzer 3
                              long duration, distance;
                              byte ref =0;
                              byte lastref=0;
                              int sound = 250;
                              void setup() {
                              Serial.begin (9600);
                              pinMode(trigPin, OUTPUT);
                              pinMode(echoPin, INPUT);
                              pinMode(led, OUTPUT);
                              pinMode(led2, OUTPUT);
                              pinMode(led3, OUTPUT);
                              pinMode(buzzer, OUTPUT);
                              }
                              void loop() {
                              digitalWrite(trigPin, LOW);
                              delayMicroseconds(2);
                              digitalWrite(trigPin, HIGH);
                              delayMicroseconds(10);
                              digitalWrite(trigPin, LOW);
                              duration = pulseIn(echoPin, HIGH);
                              distance= duration*0.034/2;
                              if((distance > 30) || (distance <= 0)){
                              ref=0;
                              } else if((distance <= 30) && (distance > 25)){
                              ref=1;
                              } else if ((distance <= 25) && (distance > 20)) {
                              ref=2;
                              } else if ((distance <= 20) && (distance > 0)) {
                              ref=3;
                              }
                              Serial.print(distance);
                              Serial.println(" cm");
                              if(lastref!=ref){
                              switch (ref) {
                              case 0:
                              Serial.println("Out of range");
                              noTone(buzzer);
                              lastref=ref;
                              break;
                              case 1:
                              digitalWrite(led, HIGH);
                              delay(5000);
                              digitalWrite(led,LOW);
                              sound = 250;
                              lastref=ref;
                              break;
                              case 2:
                              digitalWrite(led2, HIGH);
                              delay(5000);
                              digitalWrite(led2, LOW);
                              sound = 260;
                              lastref=ref;
                              break;
                              case 3:
                              digitalWrite(led3, HIGH);
                              delay(5000);
                              digitalWrite(led3, LOW);
                              sound = 270;
                              lastref=ref;
                              break;
                              }
                              }
                              tone(buzzer, sound);
                              }


                              دلیل: ادغام دو پست برای جلوگیری از اسپم

                              نوشته اصلی توسط digi-rx نمایش پست ها
                              من طبق مواردی که استارتر تاپیک خواسته بودند و بالاتر ذکر کردند و گویا در پیاده سازی این الگوریتم به مشکل خورده بودند. برنامشون رو با همون الگوریتم اصلاح کردم. قطعا اگر مورد یا موارد دیگری هم می گفتند در برنامه لحاظ می شد.
                              دوستان بهتر بود بجای اعلام نظر روی کد دیگری ; نظراتشون رو توی کد می آوردند تا هم تاپیک تخصصی تر و هم به استارتری که خودشون گفتند توی پیاده سازی به مشکل خوردند کمک بهتری شود.
                              دوست من بنده جسارت نکردم.طرف صحبتم هم شما نبودید.شما که کد زدید قطعا به توضیح بنده نیاز نداشتید.از اول تاپیک قصد بر این بود استارتر رو هم درگیر کدنویسی و درک ایراد کارشون کنیم و توضیح بنده روی کد شما هم به همین قصد بود.

                              دیدگاه

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