اطلاعیه

Collapse
No announcement yet.

کمک!!!!!!!!!برنامه نویسی در آردوینو برای خواندن سنسور آنالوگ

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

    کمک!!!!!!!!!برنامه نویسی در آردوینو برای خواندن سنسور آنالوگ

    سلام در آردوینو من کد زیر رو نوشتم:
    کد:
    [FONT=Yekan]#include <LiquidCrystal.h>[/FONT]
    
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    
    
    void setup() {
      lcd.begin(16, 2);
      Serial.begin(9600);
    }
    
    
      void loop() {
    
    
        int sens = analogRead(A0)/68.2;
        int vib = analogRead(A1);
      lcd.setCursor(0, 0);
      lcd.print("SENS");
      lcd.setCursor(0, 1);
      lcd.print(sens);
      if ( sens < 10 ) {
      lcd.print("   ");
    } else if ( sens < 100 ) {
      lcd.print("  ");
    } else if ( sens < 1000 ) {
      lcd.print(" ");
    }
      lcd.setCursor(7, 0);
      lcd.print("VIB");
      lcd.setCursor(7, 1);
      lcd.print(vib);
      if ( vib < 10 ) {
      lcd.print("   ");
    } else if ( vib < 100 ) {
      lcd.print("  ");
    } else if ( vib < 1000 ) {
      lcd.print(" ");
    }
    
    
    }
    به پایه a0 یک پتانسیومتر وصل کردم و به پایه a1 یک سنسور پیزو وصل کردم.
    عدد a0 رو با کلمه sens به نمایش در آوردم و با چرخوندن پتانسیومتر از 1 تا ده را برام نمایش میده.
    عدد a1 را با کلمه vib روی ال سی دی نمایش دادم و با اشاره به روی سنسور پیزو عددش تغییر میکنه
    حالا ما یه کار میخوایم انجام بدیم که من بلد نیستم کدش رو بنویسم::
    میخوایم اختلاف مقدار سنسور پیزو(a1) رو با یه لحظه قبلش توی یک تابع تعریف کنیم که تابع مقدارش فقط عدد های صحیح و مثبت باشه که من این رو نوشتم(اگه هرجایی اشتباه کردم بهم بگید):
    کد:
    int x1 = analogRead(A0);
    delay(5);
    int x2 = analogRead(A0);
     
    int x = x2 - x1;
    int z = abs(x)
    که در نهایت z میشه عدد مقدار اختلاف سنسور با یه لحظه قبلش به صورت صحیح مثبت.


    کل این کد ها بخوبی عمل کردند و اما اون چیزی که من بلد نبودم(سرتون هم درد آوردم):
    میخوام اعداد متغیر Z توی یک بازه 10 ثانیه ای خونده بشن و میانگینشون گرفته بشه
    عدد میانگین رو توی یک متغیر بنویسیم مثلا h بشه میانگین سنسور ما توی 10 ثانیه
    کد این کار رو میخوام ممنون

    #2
    پاسخ : کمک!!!!!!!!!برنامه نویسی در آردوینو برای خواندن سنسور آنالوگ

    نوشته اصلی توسط Mohammadturbo نمایش پست ها
    میخوام اعداد متغیر Z توی یک بازه 10 ثانیه ای خونده بشن و میانگینشون گرفته بشه
    یعنی 10 بار خونده بشه؟؟
    ! Life doesn't get easier , you just get stronger

    دیدگاه


      #3
      پاسخ : کمک!!!!!!!!!برنامه نویسی در آردوینو برای خواندن سنسور آنالوگ

      نه تو ده ثانیه: هر ثانیه 30 -40 بار خونده بشه

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

      نوشته اصلی توسط Amirlopez نمایش پست ها
      یعنی 10 بار خونده بشه؟؟
      یعنی در کل 300 تا عدد خونده شده باشه.اعداد با هم جمع تقسیم بر تعدادشون بشه
      حتی اگه امکان داشته باشه از اعداد صفر صرف نظر بشه

      دیدگاه


        #4
        پاسخ : کمک!!!!!!!!!برنامه نویسی در آردوینو برای خواندن سنسور آنالوگ

        دوستان کد زیر را پیدا کردم این همین کاری که من میخوام را انجام میده آیا:
        کد:
        /*
          Smoothing
        
        
          Reads repeatedly from an analog input, calculating a running average and
          printing it to the computer. Keeps ten readings in an array and continually
          averages them.
        
        
          The circuit:
          - analog sensor (potentiometer will do) attached to analog input 0
        
        
          created 22 Apr 2007
          by David A. Mellis  <dam@mellis.org>
          modified 9 Apr 2012
          by Tom Igoe
        
        
          This example code is in the public domain.
        
        
          http://www.arduino.cc/en/Tutorial/Smoothing
        */
        
        
        // Define the number of samples to keep track of. The higher the number, the
        // more the readings will be smoothed, but the slower the output will respond to
        // the input. Using a constant rather than a normal variable lets us use this
        // value to determine the size of the readings array.
        const int numReadings = 200;
        
        
        int readings[numReadings];      // the readings from the analog input
        int readIndex = 0;              // the index of the current reading
        int total = 0;                  // the running total
        int average = 0;                // the average
        
        
        int inputPin = A1;
        
        
        void setup() {
          // initialize serial communication with computer:
          Serial.begin(9600);
          // initialize all the readings to 0:
          for (int thisReading = 0; thisReading < numReadings; thisReading++) {
            readings[thisReading] = 0;
          }
        }
        
        
        void loop() {
          // subtract the last reading:
          total = total - readings[readIndex];
          // read from the sensor:
          readings[readIndex] = analogRead(inputPin);
          // add the reading to the total:
          total = total + readings[readIndex];
          // advance to the next position in the array:
          readIndex = readIndex + 1;
        
        
          // if we're at the end of the array...
          if (readIndex >= numReadings) {
            // ...wrap around to the beginning:
            readIndex = 0;
          }
        
        
          // calculate the average:
          average = total / numReadings;
          // send it to the computer as ASCII digits
          Serial.println(average);
          delay(1);        // delay in between reads for stability
        }

        دیدگاه


          #5
          پاسخ : کمک!!!!!!!!!برنامه نویسی در آردوینو برای خواندن سنسور آنالوگ

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

          int CounterA;
          int CounterB;
          int CounterC=0;

          void setup() {

          Serial.begin(9600);

          }

          void loop() {

          int V=digitalRead(12);


          if(V==HIGH){
          CounterC++;
          }
          switch(CounterC){
          case 1:Counters(CounterA,CounterB);break;
          }



          }
          void Counters(int X,int_t Y){
          X++;
          Y--;
          }

          دیدگاه


            #6
            پاسخ : کمک!!!!!!!!!برنامه نویسی در آردوینو برای خواندن سنسور آنالوگ

            هدفتون رو بفرمایید چی هست ، معلوم نیست دارید چکار میکنید ، برای قرار دادن کد هم در فروم تگ کد بذارید خوانا باشه ،

            بعد از خواندن وضعیت پوش باتون حتما باید delay بذارید ، وگرنه در لحظه ای که کلید رو فشار دادید ، لوپ بارها بار اجرا میشه ،

            دیدگاه


              #7
              پاسخ : کمک!!!!!!!!!برنامه نویسی در آردوینو برای خواندن سنسور آنالوگ

              نوشته اصلی توسط mahdypawe نمایش پست ها
              دوستان سلام
              لطفا کمک کنید.
              من برنامه ی زیر رو نوشتم با یک مثال کوچیک میخوام که یک void بنویسم که متغییر های داخلشو بنا به موقعیت استفادش عوض کنم.
              این کدی که در زیر اپلود میکنم فقط یک مثال کوچیکه از کاری میخوام بکنم،چون برنامه شلوغ میشه میخوام ازین روش استفاده کنم ممنون میشم راهنماییم کنید و بگید مشکل کارم کجاست و اگر راه حل جایگزینی هستش ممنون میشم راهنمایی کنید
              سلام.
              اگر برداشت من از خواستتون درست باشه ، فقط نیاز به یک swtch تو تابعتون دارید:

              int Counter (into x, int y, into cmd) {
              int K;
              switch (cmd) {
              case 1:
              ++x;
              K=x;
              break;
              case 2:
              --x;
              K=x;
              break;
              case 3:
              K=x-y;
              break;
              }
              return K;
              }

              میبخشید اگر اشتباه تایپی داشته باشه، با موبایل تایپ شده.

              دیدگاه


                #8
                پاسخ : کمک!!!!!!!!!برنامه نویسی در آردوینو برای خواندن سنسور آنالوگ

                نوشته اصلی توسط Masood Ashoori نمایش پست ها
                هدفتون رو بفرمایید چی هست ، معلوم نیست دارید چکار میکنید ، برای قرار دادن کد هم در فروم تگ کد بذارید خوانا باشه ،

                بعد از خواندن وضعیت پوش باتون حتما باید delay بذارید ، وگرنه در لحظه ای که کلید رو فشار دادید ، لوپ بارها بار اجرا میشه ،

                سلام دوستان ممنون از جواب هایی که دادین.
                این برنامه ای که در زیر نوشتم فقط برای اینکه بتونم منظورمو برسونم هستش،برنامه ی اصلی حدود700 خط هستش،من میخوام در باز نویسی این برنامه یکم از حجم برنامه نویسی کم کنم چون خیی شلوغ هستش.

                من از دستوراتی که داخل void Counters نوشتم خیلی استفاده میکنم در این برنامه برای همین می خوام داخل یک void باشه و فقط اسم متغییر هایی که داخلش هست مثل X و Y رو عوض کنم و جایگزینشون کنم.
                دقیقا مثل این برنامه ای که در زیر نوشتم ولی نمی دونم چرا عمل نمی کنه.
                هدف از برنامه زیر این هستش که وقتی C مقدارش یک شدش A جایگزین متغییر X بشه و B جایگزین متغییر Y بشه،که متاسفانه نمیدونم چرا انجام نمیشه و مقدار A و B تغییر پیدا نمیکنه.
                می خوام بدونم اشکال کار کجاست؟
                ببخشید اگه طولانی شد ویا بد توضیح دادم.

                int A=0;
                int B=0;
                int C=0;


                void setup() {


                Serial.begin(9600);
                pinMode(12,INPUT);
                }


                void loop() {


                int V=digitalRead(12);
                delay(50);


                if(V==HIGH){
                C++;
                }
                switch(C){
                case 1: Counters(A,B);break;
                }




                Serial.print("Val A =");
                Serial.println(A);


                Serial.print("Val B =");
                Serial.println(B);


                }
                void Counters(int X,int Y){
                X++;
                Y--;
                }


                دیدگاه


                  #9
                  پاسخ : کمک!!!!!!!!!برنامه نویسی در آردوینو برای خواندن سنسور آنالوگ

                  نوشته اصلی توسط mahdypawe نمایش پست ها
                  متاسفانه نمیدونم چرا انجام نمیشه و مقدار A و B تغییر پیدا نمیکنه.[/FONT]
                  می خوام بدونم اشکال کار کجاست؟
                  در همه زبانهای برنامه نویسی (ازجمله c و c++) دو جور از متغیرها میشه استفاده کرد. در حالت دیفالت ازمتغیر یه کپی گرفته میشه و تغییرات در تابع بر روی کپی متغیر انجام میگیره نه روی متغیر اصلی.
                  حالتی که شما هم به اون احتیاج دارید حالت دوم هست بنام by reference که درواقع آدرس متغیر به تابع فرستاده شده و تغییرات روی متغییر اصلی انجام میشود.البته تو توابع آردوینو آرایه ها بصورت دیفالت به همین صورت رفرنسی تعریف میشوند. کد زیر کمکتون میکنه:

                  void increment(int &variable) { // Reference to an integer
                  variable++;
                  }
                  void setup() {
                  Serial.begin(115200);
                  int a = 1;
                  Serial.println(a); // 1
                  increment(a);
                  Serial.println(a); // 2
                  }
                  void loop() {}

                  دیدگاه


                    #10
                    پاسخ : کمک!!!!!!!!!برنامه نویسی در آردوینو برای خواندن سنسور آنالوگ

                    نوشته اصلی توسط reza. h نمایش پست ها
                    در همه زبانهای برنامه نویسی (ازجمله c و c++) دو جور از متغیرها میشه استفاده کرد. در حالت دیفالت ازمتغیر یه کپی گرفته میشه و تغییرات در تابع بر روی کپی متغیر انجام میگیره نه روی متغیر اصلی.
                    حالتی که شما هم به اون احتیاج دارید حالت دوم هست بنام by reference که درواقع آدرس متغیر به تابع فرستاده شده و تغییرات روی متغییر اصلی انجام میشود.البته تو توابع آردوینو آرایه ها بصورت دیفالت به همین صورت رفرنسی تعریف میشوند. کد زیر کمکتون میکنه:

                    void increment(int &variable) { // Reference to an integer
                    variable++;
                    }
                    void setup() {
                    Serial.begin(115200);
                    int a = 1;
                    Serial.println(a); // 1
                    increment(a);
                    Serial.println(a); // 2
                    }
                    void loop() {}
                    اقا واقعا ممنونم خیلی زحمت کشیدین،کارم راه افتاد خداروشکر با این روشی که فرمودید.
                    یک سوال دیگه هم داشتم میخواستم بدونم کسی از دوستان می تونه کمک کنه.
                    من ماژول جوی استیک دارم میخوام بغیر از این که جوی استیک رو در محور X ها و Y ها مقدارشو میخونم،میخوام بصورت چرخیش(ساعتگرد و پاد ساعتگرد) ازش استفاده کنم،یک جورایی مثل ولوم ضبط های ماشین،یعنی هم چپ و راست و بالا و پایین رو باهاش مقدارشو بخونم هم اگر در جهت عقربه های ساعت چرخید یک جورایی متوجهش بشم که بتونم ازش استفاده کنم.
                    ببخشید اگه یکم بد توضیح دادم.
                    ممنون

                    دیدگاه


                      #11
                      پاسخ : کمک!!!!!!!!!برنامه نویسی در آردوینو برای خواندن سنسور آنالوگ

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

                      Serial.print("x: "+analogRead(JoyX));
                      Serial.println("y: "+analogRead (joyY ));

                      سپس جویستیک رو تا انتها بسمت چپ کشیده و بعد حرکت دورانی رو شروع کنید. و در تمام این مدت به روند تغییر x و y دقت کنید.
                      بعد از متوجه شدن چگونگی تغییرات آنها میشود با یسری شرط و شروط حالت دورانی رو مشخص کرد.

                      دیدگاه


                        #12
                        پاسخ : کمک!!!!!!!!!برنامه نویسی در آردوینو برای خواندن سنسور آنالوگ

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

                        Serial.print("x: "+analogRead(JoyX));
                        Serial.println("y: "+analogRead (joyY ));

                        سپس جویستیک رو تا انتها بسمت چپ کشیده و بعد حرکت دورانی رو شروع کنید. و در تمام این مدت به روند تغییر x و y دقت کنید.
                        بعد از متوجه شدن چگونگی تغییرات آنها میشود با یسری شرط و شروط حالت دورانی رو مشخص کرد.
                        ممنون برای توجهتون،من این کار رو انجام داده بودم و مقدار هاشون رو دارم و چندین طرح اومد توی ذهنم که جواب نمیداد،چندتا طرح اومده توی ذهنم اجرا کردم و نشد،اما ی طرح اومده توی ذهنم ولی نمیدونم با چه دستوری میتونم این کارو بکنم،برای اینکار من نیاز دارم که چند تا شرط اگه به ترتیب برقرار بودن به نتیجه دلخواهم میرسم.
                        به عنوان مثال برای تشخیص چرخش در جهت عقربه های ساعت باید به این صورت باشه که:
                        اگر Y=1023
                        سپس X=1023
                        سپس Y=0
                        و در اخر اگر X=0 شد میتونیم تشخیص بدیم که جوی استیک در جهت عقربه های ساعت چرخیده شده،حالا درخواست من این هستش که با چه دستوری میتونم این مقدار هارو به ترتیب اگر درست بودن تشخیص بدم؟
                        و اگر بشه این دستور رو هر 2 الی 3 ثانیه ریست کرد تا اگر به طور اتفاقی این مقدار ها به ترتیب درست بودن اشتباهی پیش نیاد تو برنامه که زیاد توی اولویتم نیستش ولی اگه بشه برنامه رو دقیق تر میکنه.
                        باتشکر از دوستان

                        دیدگاه


                          #13
                          پاسخ : کمک!!!!!!!!!برنامه نویسی در آردوینو برای خواندن سنسور آنالوگ

                          نوشته اصلی توسط mahdypawe نمایش پست ها
                          با چه دستوری میتونم این مقدار هارو به ترتیب اگر درست بودن تشخیص بدم؟
                          و اگر بشه این دستور رو هر 2 الی 3 ثانیه ریست کرد
                          این الگوریتمی که شما مورد نظرتونه بصورت زیر میشه. هرچند بنظرم زیاد جالب نمیاد. همچنین اینکه شما فقط max و min رو درنظر گرفتید که باعث میشه فقط بتونید چرخش کامل رو تشخیص بدید. من نظرم بیشتر این بود که در حین زمان چرخش روند کم و زیاد شدن x و y رو بصورت جزئی و در گذر زمان زیر نظر بگیرید:

                          boolean function (int x, int y ) {
                          long a,b,c,d,t,k;
                          t=milis();
                          k =2000;
                          boolean r;
                          if ((x =0)||(y =0)||(x =1023)||(y =1023)){
                          if ((t-a <k) && (t-b <k)&&(t-c <k)&&(t-d <k)){
                          if ((a<b)&&(b<c)&&(c<d)){
                          r =true;}}}
                          if (y ==1023) a = t;
                          if (x ==1023) b = t;
                          if (y ==0) c = t;
                          if (x ==0) d = t;
                          return r;
                          }

                          دیدگاه


                            #14
                            پاسخ : کمک!!!!!!!!!برنامه نویسی در آردوینو برای خواندن سنسور آنالوگ

                            نوشته اصلی توسط reza. h نمایش پست ها
                            این الگوریتمی که شما مورد نظرتونه بصورت زیر میشه. هرچند بنظرم زیاد جالب نمیاد. همچنین اینکه شما فقط max و min رو درنظر گرفتید که باعث میشه فقط بتونید چرخش کامل رو تشخیص بدید. من نظرم بیشتر این بود که در حین زمان چرخش روند کم و زیاد شدن x و y رو بصورت جزئی و در گذر زمان زیر نظر بگیرید:

                            boolean function (int x, int y ) {
                            long a,b,c,d,t,k;
                            t=milis();
                            k =2000;
                            boolean r;
                            if ((x =0)||(y =0)||(x =1023)||(y =1023)){
                            if ((t-a <k) && (t-b <k)&&(t-c <k)&&(t-d <k)){
                            if ((a<b)&&(b<c)&&(c<d)){
                            r =true;}}}
                            if (y ==1023) a = t;
                            if (x ==1023) b = t;
                            if (y ==0) c = t;
                            if (x ==0) d = t;
                            return r;
                            }
                            سلام با عرض احترام و تشکر از زحماتتون.
                            عذر خواهی بنده رو بخاطر کمبود اطلاعاتم در مورد برنامه نویسی بپذیرید.
                            من به طور کامل سر در نیاوردم از این برنامه ای که نوشتید، اگر امکانش هستش ی توضیح مختصری بدید ممنون میشم،یا اگر منبعی برای مطالعه.
                            خصوصا در اون قسمتی که t رو از a,b,c,d کسر کردید و با k مقایسه کردید.
                            چون برای a,b,c,d مقداری تعریف نشده یعنی t که همان مقدار زمان شروع به کار میکرو هستش رو از چه مقداری کسر کردید و با 2 ثانیه مقایسه کردید؟
                            بازم ممنون از وقتی که گذاشتید.
                            و در مورد چرخش کامل هم درسته حق با شماست،من فقط نمیخوام برنامه زیاد پیچیده بشه و چیزی که به ذهنم رسید این بودش که مبنای تشخیص رو نیم دور در نظر بگیرم.
                            جدیدترین ویرایش توسط mahdypawe; ۱۵:۳۳ ۱۳۹۶/۱۲/۱۵.

                            دیدگاه


                              #15
                              پاسخ : کمک!!!!!!!!!برنامه نویسی در آردوینو برای خواندن سنسور آنالوگ

                              سلام عزیز
                              (من همان کاربر با نام reza.h هستم. اون نام کاربری برای موبایلمه که وقتی به کامپیوتر دسترسی ندارم استفاده میکنم)

                              خواهش میکنم بزرگوار. ما همگی برای یادگیری و درکنارش ادای دین اینجامیایم.
                              در مورد کد، زیاد توی فکر بهینه سازی براش نرفتم اما همینم بخاطر استفاده از شرط های تو درتو بد نیست. چون به محض اینکه اولین شرط false بشه از تابع درمیاد. درنتیجه سرعت اجرای تابع و برنامه خیلی بیشتر میشه.
                              نوشته اصلی توسط mahdypawe نمایش پست ها
                              اگر امکانش هستش ی توضیح مختصری بدید ممنون میشم،یا اگر منبعی برای مطالعه.
                              خصوصا در اون قسمتی که t رو از a,b,c,d کسر کردید و با k مقایسه کردید.
                              چون برای a,b,c,d مقداری تعریف نشده یعنی t که همان مقدار زمان شروع به کار میکرو هستش رو از چه مقداری کسر کردید و با 2 ثانیه مقایسه کردید؟

                              تو این تابع یه جور حالت تایمر شبیه سازی شده که چند تا حسن داره. یکیش اینکه هرچند تا بخوای و با هر مقدار ، میتونی متغیر زمانی داشته باشی. دوم اینکه نه در برنامه شما اما خیلی جاها از این روش بجای استفاده از تابع delay استفاده میشه.* *حسن بزرگش ** به اینه که برنامه دیگه در اینجا مثل delay ایست نمیکنه و به کارو وظابف دیگش میتونه ادامه بده.
                              روش اینطوریه که هر موقع یه اتفاق مثل حالت x=0 افتاد ، ما میایم زمان این اتفاق رو در یه متغیر مثل a ذخیره میکنیم (اون 4 شرط انتهایی تابع فوق) و زمانیکه اتفاق بعدی مثل y=1023 افتاد، میایم زمان بین این دو اتفاق رو محاسبه و با اون 2 ثانیه ماکزیمم مقایسه میکنیم. اگر کمتر بود پس برای ما اون اتفاق قابل قبوله.
                              امیدوارم تونسته باشم مفهوم توضیح بدم. بازم سوالی بود در حد توانم درخدمتم.
                              تاپیک ویدیوهای آموزشی حواشی آردوینو و ESP

                              دیدگاه

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