نمایش نتایج: از 1 به 6 از 6

موضوع: اجرای قسمتی از برنامه برای مدت زمان معینی و بعد از تمام شدن زمان، اجرا نشه

  1. #1
    Junior Member
    تاریخ عضویت
    Dec 2017
    محل سکونت
    ایران
    نوشته ها
    6

    Question اجرای قسمتی از برنامه برای مدت زمان معینی و بعد از تمام شدن زمان، اجرا نشه

    با سلام.
    من می خواستم سنسور مغناطیس خودم رو کالیبره کنم. برنامه من باید جوری باشه که شامل سه قسمت زیر هستش:
    1: void setup{}
    2: تو این قسمت می خوام دستورات خاصی رو که برای کالیبره دارم رو به مدت مثلا 1 دقیقه انجام بده و خروجی ها که همان آفست ها هستن رو بدست بیاره که بعد تو قسمت بعد ازشون استفاده کنم
    3: این قسمت بیام و از داده های قسمت قبلی که به دست اومدن استفاده کنم. و برنامه اجرا بشه

    هدف من اینه که قسمت دوم در مدت زمان معینی انجام بشه. احتمالا باید از دستور millis استفاده کنم ولی نمیشه. میشه من رو راهنمایی کنین؟
    برنامه مورد نظر رو هم برای شما attach کردم
    ممنون


    #include <Wire.h>
    #include <HMC5883L.h>

    HMC5883L compass;

    int minX = 0;
    int maxX = 0;
    int minY = 0;
    int maxY = 0;
    int offX = 0;
    int offY = 0;
    const unsigned long period = 1 * 60000L; // 1 minutes
    //unsigned long timelastchanged;

    void setup()
    {
    Serial.begin(9600);

    // Initialize Initialize HMC5883L
    while (!compass.begin())
    {
    delay(500);
    }

    // Set measurement range
    compass.setRange(HMC5883L_RANGE_1_3GA);

    // Set measurement mode
    compass.setMeasurementMode(HMC5883L_CONTINOUS);

    // Set data rate
    compass.setDataRate(HMC5883L_DATARATE_75HZ);

    // Set number of samples averaged
    compass.setSamples(HMC5883L_SAMPLES_8);
    }


    void calibrate(){
    bool changed=false;
    Vector mag = compass.readRaw();

    // // Determine Min / Max values
    if (mag.XAxis < minX) minX = mag.XAxis;
    changed = true;
    if (mag.XAxis > maxX) maxX = mag.XAxis;
    changed = true;
    if (mag.YAxis < minY) minY = mag.YAxis;
    changed = true;
    if (mag.YAxis > maxY) maxY = mag.YAxis;
    changed = true;



    if(changed)
    unsigned long timeLastChange = millis(); //Reset timeout counter

    if(millis() > 5000 && millis() - timeLastChange > period) //If the timeout has been reached, exit calibration
    exitCalMode();
    }

    void exitCalMode(){
    //Calculate offsets
    offX = (maxX + minX)/2;
    offY = (maxY + minY)/2;

    x_scale = 1.0/(maxX - minX);
    y_scale = 1.0/(maxY - minY);

    compass.setOffset(offX,offY)
    Serial.print("offX=");
    Serial.print(offX);
    Serial.print(" ");
    Serial.print("offy=");
    Serial.print(offY);
    Serial.println(" ");
    }


    دستورات بالا برای قسمت دوم برنامه هستش. ولی خطایی بصورت زیر نمایش داده میشه: همچنین نمی تونم نمایش کدهای serial.prion رو ببینم. می خوام تغییرات max , min ها رو تا لحظه ست شدن نهایی ببینم.
    timelastchanged was not decleare in this scope
    ویرایش توسط آزیتا : 01-16-2018 در ساعت 08:07 AM

  2. #2
    Senior Member
    تاریخ عضویت
    Feb 2017
    نوشته ها
    153
    برنامتون کامل نیست ، شما فانکشنهایی رو که ایجاد کردید صدا نکردید . لطفا کد رو بصورت کامل قرار بدید .
    در مورد فانکشن millis هم شما بصورت درست ازش استفاده نکردید . وقتی شما منبع تغذیه رو به میکرو متصل میکنید ، تابع millis شروع به شمارش میکنه . یعنی این عدد همیشه تو همه توابع یکسانه . یک بار رفرنس آردوینو رو ببینید .
    مثال چشمک زن با تابع millis رو هم مرور کنید تا با نوشتن کد با تابع millis آشنا بشید .

  3. #3
    Junior Member
    تاریخ عضویت
    Dec 2017
    محل سکونت
    ایران
    نوشته ها
    6
    lممنونم از لطفتون
    من تمام کد رو براتون attach کردم. من چندین مرتبه چشمک زن رو مطالعه کردم. فهمیدم ، ولی برای اجراش تو کد خودم به مشکل بر می خورم. نمی دونم دقیقا چیکارش کنم؟
    فایل های پیوست شده فایل های پیوست شده
    ویرایش توسط آزیتا : 01-16-2018 در ساعت 06:01 PM

  4. #4
    Senior Member
    تاریخ عضویت
    Feb 2017
    نوشته ها
    153
    نقل قول نوشته اصلی توسط آزیتا نمایش پست ها
    lممنونم از لطفتون
    من تمام کد رو براتون attach کردم. من چندین مرتبه چشمک زن رو مطالعه کردم. فهمیدم ، ولی برای اجراش تو کد خودم به مشکل بر می خورم. نمی دونم دقیقا چیکارش کنم؟
    کد زیر رو تست کنید

    کد:
    /*
      Calibrate HMC5883L. Output for HMC5883L_calibrate_processing.pde
      Read more: http://www.jarzebski.pl/arduino/czujniki-i-sensory/3-osiowy-magnetometr-hmc5883l.html
      GIT: https://github.com/jarzebski/Arduino-HMC5883L
      Web: http://www.jarzebski.pl
      (c) 2014 by Korneliusz Jarzebski
    */
    
    #include <Wire.h>
    #include <HMC5883L.h>
    
    HMC5883L compass;
    
    int minX = 0;
    int maxX = 0;
    int minY = 0;
    int maxY = 0;
    int offX = 0;
    int offY = 0;
    int x0;
    int y0;
    const unsigned long period = 1 * 60000L;       // 1 minutes
    unsigned long timeLastChange = 0;
    
    void setup()
    {
      Serial.begin(9600);
    
      // Initialize Initialize HMC5883L
      while (!compass.begin())
      {
       delay(500);
      }
    
      // Set measurement range
      compass.setRange(HMC5883L_RANGE_1_3GA);
    
      // Set measurement mode
      compass.setMeasurementMode(HMC5883L_CONTINOUS);
    
      // Set data rate
      compass.setDataRate(HMC5883L_DATARATE_75HZ);
    
      // Set number of samples averaged
      compass.setSamples(HMC5883L_SAMPLES_8);
    }
    
    
    void exitCalMode(){
      //Calculate offsets
       offX = (maxX + minX)/2;
    offY = (maxY + minY)/2;
    
    //int  x_scale = 1.0/(maxX - minX);
    //int y_scale = 1.0/(maxY - minY);
      
     compass.setOffset(offX,offY);
    
     
    }
    
    
    void calibrate(){
      bool changed=false;
      Vector mag = compass.readRaw();
    
      //  // Determine Min / Max values
     if (mag.XAxis < minX) minX = mag.XAxis;
     changed = true;
      if (mag.XAxis > maxX) maxX = mag.XAxis;
      changed = true;
     if (mag.YAxis < minY) minY = mag.YAxis;
     changed = true;
      if (mag.YAxis > maxY) maxY = mag.YAxis;
      changed = true;
    //x0 = (maxX + minX)/2;
    //y0 = (maxY + minY)/2;
    //  Serial.print(x0);
    //   Serial.print("    ");
    //    Serial.println(y0);
    //    
      unsigned long cuMillis = millis();
      if(changed)
        
        if(cuMillis > 5000 &&  cuMillis -  timeLastChange >   period) //If the timeout has been reached, exit calibration
        {
          timeLastChange = cuMillis;
          exitCalMode();
        }
       
    }
    
    void loop(){
      
      calibrate();
      
       Vector norm = compass.readNormalize();
       
    Serial.print(" offx = ");
     Serial.print(offX);
     Serial.print("  ");
     Serial.print(" offy = ");
     Serial.print(offY);
     Serial.print("  ");
        
     Serial.print(" Xnorm = ");
     Serial.print(norm.XAxis/10);
     Serial.print("  ");
     Serial.print(" Ynorm = ");
     Serial.print(norm.YAxis/10);
     Serial.print("  ");
     Serial.print(" ZNorm = ");
     Serial.println(norm.ZAxis/10);
        
      
      }

  5. #5
    Junior Member
    تاریخ عضویت
    Dec 2017
    محل سکونت
    ایران
    نوشته ها
    6
    ممنونم از کمکتون. این کد هم اجرا نشد. من نهایتا مثالی که فرمودین از blink رو خوندم و تونستم کد رو تغییر بدم و جواب گرفتم. ممنونم

  6. #6
    Member
    تاریخ عضویت
    May 2016
    نوشته ها
    45
    سلام خدمت شما دوست عزیزم من این کد رو الان براتون نوشتم تست کنید با این کد میتونید در هر دوره تناوب دلخواه سنسور هاتون رو چک کنید .
    کد:
    int dt=5000;
    unsigned long  lasttime=0;
    
    void setup() {
    Serial.begin(9600);
    }
    
    void loop() {
    int delta=millis()-lasttime;
    if(delta>=dt){
      lasttime=millis();
      Serial.println(delta);
    }
    
    }
    با این کد داریم هر 5 ثانیه یک بار دستورات داخل شرط if رو بررسی میکنیم دستنوراتی رو که میخواهین در یک بازه زمانی معین چک بشن رو داخل این شرط if قرار بدین اگر که نیاز دارین دوره تناوبتون زیاد یا کم بکنین کافیه که مقدار عددی dt رو کم یا زیاد کنید . برای اینکه بهتر متوجه بشین من مقدار delta رو توی سریال مانیتور چاپ کردن صفحه ی سریال مانیتور رو باز کنید و مشاهده کنید که عدد 5000 هر 5 ثانیه یک بار در سریال مانیتور چاپ میشه .
    امیدوارم که مشکلتون حل بشه با این کد .
    موفق و پیروز باشد.

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

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

SEO by vBSEO