اطلاعیه

Collapse
No announcement yet.

اجرا چند لوپ در اردوینوuno

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

    اجرا چند لوپ در اردوینوuno

    دوستان من یک کد نوشتم که یک led رو بتونم از دو روش روشن کنم یکی توسط nfc با ماژول pn532 و یک روش هم با استفاده از پیامک توسط ماژول sim800l من زمانی که کدهاش رو به تنهایی اجرا میکنم مشکلی نیست اما وقتی که ادغامشون میکنم فقط کدی که داخل void loop اول نوشته شده درست عمل میکنه و کد بعدی عمل نمیکنه
    مثلا اگر کدnfc رو اول بنویسم اون عمل میکنه و اگر. کد gsm رو اول بنویسم اون عمل میکنه ممنون میشم راهنمایی کنین

    #2
    پاسخ : اجرا چند لوپ در اردوینوuno

    نوشته اصلی توسط Amirhoseinn نمایش پست ها
    دوستان من یک کد نوشتم که یک led رو بتونم از دو روش روشن کنم یکی توسط nfc با ماژول pn532 و یک روش هم با استفاده از پیامک توسط ماژول sim800l من زمانی که کدهاش رو به تنهایی اجرا میکنم مشکلی نیست اما وقتی که ادغامشون میکنم فقط کدی که داخل void loop اول نوشته شده درست عمل میکنه و کد بعدی عمل نمیکنه
    مثلا اگر کدnfc رو اول بنویسم اون عمل میکنه و اگر. کد gsm رو اول بنویسم اون عمل میکنه ممنون میشم راهنمایی کنین
    سلام
    میکروکنترلرها عموما تک هسته ای هستن، به خاطر همین در یک زمان تنها یک وظیفه رو میتونن انجام بدن. هسته uno هم میکروکنترلر AVR هستش پس از این قائده مستثنی نیست!
    برای انجام چند وظیفه، باید این کار به شکل نرم افزاری و به شکل تقسیم زمانی انجام بشه. برای این کار داخل همون یک حلقه بی نهایت که دارید، باید دستورات رو طوری بچینید که چند کار رو هندل کنه، یا اینکه از سیستم عامل های بلادرنگ استفاده کنید. آردوینوهایی با هسته ESP32 کلا برپایه سیستم عامل FreeRTOS کار میکنن که از این نظر خیلی خوبه و میتونید چندین تسک با اولویت های مختلف براش تعریف کنید که چند کار رو انجام بدن. اما برای uno فکر نکنم استفاده از چیزی مثل FreeRTOS ساده باشه! اگر انگلیسی سرچ کنید احتمالا چیزی که شبیه به RTOS عمل بکنه براش پیدا بشه. یادم میاد که قبلا همچین چیزی دیده بودم که با استفاده از تایمر یه اینجور چیزی رو انجام داده بود.

    دیدگاه


      #3
      پاسخ : اجرا چند لوپ در اردوینوuno

      نوشته اصلی توسط Amirhoseinn نمایش پست ها
      دوستان من یک کد نوشتم که یک led رو بتونم از دو روش روشن کنم یکی توسط nfc با ماژول pn532 و یک روش هم با استفاده از پیامک توسط ماژول sim800l من زمانی که کدهاش رو به تنهایی اجرا میکنم مشکلی نیست اما وقتی که ادغامشون میکنم فقط کدی که داخل void loop اول نوشته شده درست عمل میکنه و کد بعدی عمل نمیکنه
      مثلا اگر کدnfc رو اول بنویسم اون عمل میکنه و اگر. کد gsm رو اول بنویسم اون عمل میکنه ممنون میشم راهنمایی کنین
      سلام دوست عزیز.
      من در یه پروژه با Arduino UNO نیاز به چند کار همزمان داشتم که با سرچ تو اینترنت و استفاده از دستور millis() مشکلم حل شد. البته باید استفاده از دستور Delay() رو در داخل حلقه loop استفاده نکنی و با زمانگیری توسط تابع millis تاخیرها رو اجرا کنی. اجرای چند لوپ در اردوینویی مثل zero و DUO که هسته های ARM دارن امکان پذیره.
      یا حق

      دیدگاه


        #4
        پاسخ : اجرا چند لوپ در اردوینوuno

        خیلی ممنون از توجهتون من تازه کارم برای کار با اردوینو و اولین تجربه من هستش ممنون که کمک میکنید ی سوال داشتم اینکه من اگر برد اردوینوdue رو بخرم این کدی که الان هستش برای اون هم جواب میده یا باید کد تغییر کنه و برنامه نوشتنش فرق میکنه؟

        دیدگاه


          #5
          پاسخ : اجرا چند لوپ در اردوینوuno

          نوشته اصلی توسط Amirhoseinn نمایش پست ها
          خیلی ممنون از توجهتون من تازه کارم برای کار با اردوینو و اولین تجربه من هستش ممنون که کمک میکنید ی سوال داشتم اینکه من اگر برد اردوینوdue رو بخرم این کدی که الان هستش برای اون هم جواب میده یا باید کد تغییر کنه و برنامه نوشتنش فرق میکنه؟
          من اصلا با آردوینو کار نکردم ولی تا جایی که میدونم اکثر موارد برنامه نویسیشون شبیه به هم هستش. حداقل توی سطح فعلی شما فکر نمیکنم فرق زیادی داشته باشن
          جدیدترین ویرایش توسط hossein.m98; ۰۲:۴۶ ۱۳۹۹/۱۱/۱۷.

          دیدگاه


            #6
            پاسخ : اجرا چند لوپ در اردوینوuno

            نوشته اصلی توسط Amirhoseinn نمایش پست ها
            خیلی ممنون از توجهتون من تازه کارم برای کار با اردوینو و اولین تجربه من هستش ممنون که کمک میکنید ی سوال داشتم اینکه من اگر برد اردوینوdue رو بخرم این کدی که الان هستش برای اون هم جواب میده یا باید کد تغییر کنه و برنامه نوشتنش فرق میکنه؟
            اگه کدتون برای همون due هست که نه نیازی به تغییر نیست
            ولی اگه برای آردوینو های دیگه هست فقط شماره پین ها ممکنه نیاز به تغییر داشته باشن
            اگه کد هم یه آردوینو قوی تر رو مث due رو روی uno بریزید ممکنه اگه کد سنگین باشه، روی uno خوب عمل نکنه

            البته من خیلی تخصص ندارم اگه نکته ی دیگه ای هست که نگفتم، بقیه دوستان بگن
            ~~~~~~~~~~~~~~~~~~
            Failure Doesn't Mean

            GAME OVER
            It Means
            TRY AGAIN
            With More
            XP
            ~~~~~~~~~~~~~~~~~~

            دیدگاه


              #7
              پاسخ : اجرا چند لوپ در اردوینوuno

              نوشته اصلی توسط alirezap30 نمایش پست ها
              سلام دوست عزیز.
              من در یه پروژه با Arduino UNO نیاز به چند کار همزمان داشتم که با سرچ تو اینترنت و استفاده از دستور millis() مشکلم حل شد. البته باید استفاده از دستور Delay() رو در داخل حلقه loop استفاده نکنی و با زمانگیری توسط تابع millis تاخیرها رو اجرا کنی. اجرای چند لوپ در اردوینویی مثل zero و DUO که هسته های ARM دارن امکان پذیره.
              یا حق
              مطابق نظر دوستمون، من پیشنهاد میکنم که دو تا تابع بنویسید و با یک شرط بر مبنای فاصله از آخرین باری که فراخوانی شدند با استفاده از millis () ، دایم دو تا تابع در LOOP فراخوانی بشوند.
              البته میدونم که در کتابخانه ماژول SIM800 از دستور Delay استفاده شده است. عملا زمان فراخوانی توابع مربوط به این مازول کمی کند است.

              دیدگاه


                #8
                پاسخ : اجرا چند لوپ در اردوینوuno

                سلام به آینده سازان این مرز و بوم
                امیدوارم ایام به کامتون باشه
                عزیزان بنده یک مشکلی برام پیشامده که این مشکل فقط به دست شما عزیزان حل میشه
                به نظر شما چطور میشه با یک برد آردینو سه کد مختلف را اجرا کرد؟که توسط یک کلید هر یک ازون کد هارو به دلخواه در حالت اجرایی دستگاه قرار داد؟بنده میخوام وقتی کلید را فشار میدم مثلا آردینو برنامه اول را متوقف کنه و برنامه دوم را اجرا کنه یا بالعکس یا مثلا برنامه برنامه سوم را متوقف کنه و برنامه اول اجرا بشه ایا چنین کاری امکان مذیر هست.
                خاطر نشان کنم که نمیخواهم هر سه برنامه همزمان اجرا بشه.میخوام جدا جدا با انتخاب خودم اجرا بشن.

                دیدگاه


                  #9
                  پاسخ : اجرا چند لوپ در اردوینوuno

                  نوشته اصلی توسط ali98740 نمایش پست ها
                  سلام به آینده سازان این مرز و بوم
                  امیدوارم ایام به کامتون باشه
                  عزیزان بنده یک مشکلی برام پیشامده که این مشکل فقط به دست شما عزیزان حل میشه
                  به نظر شما چطور میشه با یک برد آردینو سه کد مختلف را اجرا کرد؟که توسط یک کلید هر یک ازون کد هارو به دلخواه در حالت اجرایی دستگاه قرار داد؟بنده میخوام وقتی کلید را فشار میدم مثلا آردینو برنامه اول را متوقف کنه و برنامه دوم را اجرا کنه یا بالعکس یا مثلا برنامه برنامه سوم را متوقف کنه و برنامه اول اجرا بشه ایا چنین کاری امکان مذیر هست.
                  خاطر نشان کنم که نمیخواهم هر سه برنامه همزمان اجرا بشه.میخوام جدا جدا با انتخاب خودم اجرا بشن.
                  یک وقفه خارجی و یک متغیر


                  if(i == 1)
                  task1()
                  else if(i == 2)
                  task2()
                  .
                  .
                  .

                  دیدگاه


                    #10
                    پاسخ : اجرا چند لوپ در اردوینوuno

                    نوشته اصلی توسط Matin_Mirzadeh نمایش پست ها
                    یک وقفه خارجی و یک متغیر


                    if(i == 1)
                    task1()
                    else if(i == 2)
                    task2()
                    .
                    .
                    .
                    خیلی هم عالی و متشکرم
                    قربان امکان داره یه کد کامل به بنده بدین که فقط کد های ۳ برنامه مورد نظرم رو داخلش قرار بدم و شماره پایه هارو بهش اضافه کنم؟به این دلیل میگم که بنده واقعا برنامه نویسی بلد نیستم شرمنده

                    دیدگاه


                      #11
                      پاسخ : اجرا چند لوپ در اردوینوuno

                      نوشته اصلی توسط ali98740 نمایش پست ها
                      خیلی هم عالی و متشکرم
                      قربان امکان داره یه کد کامل به بنده بدین که فقط کد های ۳ برنامه مورد نظرم رو داخلش قرار بدم و شماره پایه هارو بهش اضافه کنم؟به این دلیل میگم که بنده واقعا برنامه نویسی بلد نیستم شرمنده
                      من با آردویینو کار نمی کنم ولی امیدوارم بتونم کمک کنم

                      const byte ledPin = 13;
                      const byte interruptPin = 2;
                      volatile byte state = LOW;
                      int i = 0;

                      void setup() {
                      pinMode(ledPin, OUTPUT);
                      pinMode(interruptPin, INPUT_PULLUP);
                      attachInterrupt(digitalPinToInterrupt(interruptPin), task_change, CHANGE);
                      }

                      void loop() {
                      if(i == 0)
                      blink();

                      else
                      if(i == 1)
                      {
                      blink2();
                      }
                      }

                      void task_change() {
                      i++;
                      if(i > 1)
                      i = 0;
                      }

                      void blink()
                      {
                      digitalWrite(12, state);
                      state = ~state;
                      delay_ms(500);

                      }


                      void blink2()
                      {
                      digitalWrite(ledPin, state);
                      state = ~state;
                      delay_ms(500);

                      }

                      اینم یه نمونه

                      دیدگاه


                        #12
                        پاسخ : اجرا چند لوپ در اردوینوuno

                        نوشته اصلی توسط Matin_Mirzadeh نمایش پست ها
                        من با آردویینو کار نمی کنم ولی امیدوارم بتونم کمک کنم

                        const byte ledPin = 13;
                        const byte interruptPin = 2;
                        volatile byte state = LOW;
                        int i = 0;

                        void setup() {
                        pinMode(ledPin, OUTPUT);
                        pinMode(interruptPin, INPUT_PULLUP);
                        attachInterrupt(digitalPinToInterrupt(interruptPin), task_change, CHANGE);
                        }

                        void loop() {
                        if(i == 0)
                        blink();

                        else
                        if(i == 1)
                        {
                        blink2();
                        }
                        }

                        void task_change() {
                        i++;
                        if(i > 1)
                        i = 0;
                        }

                        void blink()
                        {
                        digitalWrite(12, state);
                        state = ~state;
                        delay_ms(500);

                        }


                        void blink2()
                        {
                        digitalWrite(ledPin, state);
                        state = ~state;
                        delay_ms(500);

                        }

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

                        دیدگاه


                          #13
                          پاسخ : اجرا چند لوپ در اردوینوuno

                          پیشنهاد میشه از وقفه استفاده کنید و با هر بار وقفه یک متغیر رو تغییر داده ودر کل برنامه اون متغیر دایم چک بشه

                          ولی اگر میخواهید از برد دیگری مانند due استفاده کنید:
                          این برد نسبت به بردهای دیگه آردوینو بسیار قدرتمندتره
                          قابلیت داشتن همزمان 3 تا loop داره.یعنی از برنامه های چند نخی پشتیبانی میکنه.
                          ولی نکته ای که هست اینه که این برد بر پایه تراشه arm هست
                          برخی از دستورات وکتابخانه های معمول آردوینو روی این برد جواب نمیده
                          دقت کنید که ولتاژ اصلی این برد 3.3 ولته وحتما نقشه اون رو در اینترنت ببینید چون پایه های که با 5ولت روی این برد کار میکنند محدود هستند ودر اون نقشه علامت دارند
                          منظور از پایه اینه که میتونید طبق توضیح دیتاشیتش ورودی گمانم تا 9 ولت بدید ولی از رگولاتور میگذره وخود برد با 3.3 کار میکنه ولی چند پایه داره که اونها نیز با توجه به رگولاتر 5ولت رو پشتیبانی میکنند وطبق همون دیتاشیت اگر مقدار جریان یا ولتاژ اشتباه از اون پایه ها بگذره برد آسیب میبینه

                          برد due دو ورودی micro usb داره که با هم تفاوت دارند ویکیشون native هست ویکشون برای پروگرام مستقیم
                          با توجه به توضیحات بالا در کل اگر بتونید باهاش کار کنید خیلی قدرتمنده واون 3 حلقه loop مجزاش گاهی وقتا که نیازه بسیار با ارزشه.بخصوص اگر مجبور باشید در یکی از حلقه ها از delay استفاده کنید بقیه حلقه ها مجزا کار میکنند

                          دیدگاه


                            #14
                            پاسخ : اجرا چند لوپ در اردوینوuno

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



                            int Motor1 = 5;
                            int Motor2 = 6;
                            int BUTTON1 = 7;
                            int BUTTON2 = 8;
                            int BUTTON3 = 12; // Button position in End of Limit
                            int BUTTON4 = 13; // Button position in Start of Limit
                            int BUTTON1state = 0;
                            int BUTTON2state = 0;
                            int BUTTON3state = 0;
                            int BUTTON4state = 0;
                            unsigned long Timer1 = 0;
                            unsigned long Delay1 = 1000;
                            int lastBUTTON1state = 0;
                            int lastBUTTON2state = 0;
                            int lastBUTTON3state = 0;
                            int lastBUTTON4state = 0;






                            void setup() {


                            pinMode(7, INPUT);
                            pinMode(8, INPUT);
                            pinMode(12, INPUT);
                            pinMode(13, INPUT);
                            pinMode(Motor1, OUTPUT);
                            pinMode(Motor2, OUTPUT);
                            }


                            void loop() {
                            Timer1 = millis();
                            BUTTON1state = digitalRead(BUTTON1);
                            BUTTON2state = digitalRead(BUTTON2);
                            BUTTON3state = digitalRead(BUTTON3);
                            BUTTON4state = digitalRead(BUTTON4);
                            lastBUTTON1state =! BUTTON1state;
                            lastBUTTON2state =! BUTTON2state;
                            lastBUTTON3state =! BUTTON3state;
                            lastBUTTON4state =! BUTTON4state;






                            if ((digitalRead(BUTTON1)) && (digitalRead(BUTTON3)) ) { // Button position in End of Limit
                            Stop_Ramp();
                            }


                            if ((digitalRead(BUTTON1)) && !(digitalRead(BUTTON3)) ) {
                            Open_Ramp();


                            }


                            if ((digitalRead(BUTTON2)) && (digitalRead(BUTTON4)) ) { // Button position in End of Limit
                            Stop_Ramp();
                            }


                            if ((digitalRead(BUTTON2)) && !(digitalRead(BUTTON4)) ) {
                            Close_Ramp();
                            }


                            }
































                            void Open_Ramp() {
                            while (!(digitalRead(BUTTON3)) && ((millis()-Timer1) >= Delay1))
                            {
                            digitalWrite(Motor1 , HIGH) ; // Open
                            analogWrite(Motor2 , 235 ) ;
                            }


                            }






                            void Close_Ramp() {
                            while (!(digitalRead(BUTTON4)) && ((millis()-Timer1) >= Delay1))
                            {
                            digitalWrite(Motor1 , LOW) ; // Close
                            analogWrite(Motor2 , 20 );
                            }
                            }








                            void Stop_Ramp() {
                            digitalWrite(Motor1 , HIGH) ; // Stop
                            analogWrite(Motor2 , 255 ) ;
                            }




                            void Blink() {


                            }






                            void Alarm() {


                            }




                            [COLOR=#353C41][FONT=Inter][/FONT][/COLOR]

                            دیدگاه


                              #15
                              پاسخ : اجرا چند لوپ در اردوینوuno

                              دوستان نظری ندارند؟

                              دیدگاه

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