سوال در مورد کتابخانه ElapsedMillis() آردوینو

2 سال قبل
669 بازدید

0

من روی یک پروژه ای کار می کنم که در آن از کتابخانه ElapsedMillis (لینک: https://github.com/pfeerick/elapsedMillis) استفاده کرده ام.

کد من شامل سه مرحله یا state هست. من در مرحله سوم (case 3) گیر کرده ام! به هر پین 2 ال ای دی وصل کرده ام (یعنی مجموعا 12 ال ای دی). من میخواهم در مرحله سوم (case 3) ال ای دی ها با این سناریو روشن و خاموش شوند:

  • دو LED اول 90ms روشن باشد و 1ms خاموش باشد
  • سپس دو LED دوم 90ms روش و 1ms خاموش باشد
  • سپس دو LED سوم ...

کد زیر را نوشته ام اما case 3 مطابق انتظار توضیحی که دادم کار نمی کند. کسی می تواند راهنمایی کند؟

#include "elapsedMillis.h"

const int pin0 = 12;
const int pin1 = 11;
const int pin2 = 10;
const int pin3 = 9;
const int pin4 = 8;
const int pin5 = 7;

unsigned long t1 = 500;
unsigned long waiting = 1000;
unsigned long t2 = 100;
unsigned long t3 = 50;
unsigned long t4 = 1;
unsigned long t5 = 90;
unsigned long startTime = 0;

int ledArray[] = {pin0, pin1, pin2, pin3, pin4, pin5};
int j, k, a, c = 0;
int state = 3;

elapsedMillis elapsedTime;
elapsedMillis timer1;
elapsedMillis timer2;
elapsedMillis timer3;
elapsedMillis timer4;
elapsedMillis timer5;

void setup() {
  pinMode(pin0, OUTPUT);
  pinMode(pin1, OUTPUT);
  pinMode(pin2, OUTPUT);
  pinMode(pin3, OUTPUT);
  pinMode(pin4, OUTPUT);
  pinMode(pin5, OUTPUT);
  Serial.begin(9600);

}

void loop() {

  switch (state) {

    case 0:
      // led accesi in modo scalare allo stato 0
      while (k <= 5)
      {

        if (timer1 >= t1)
        {
          if (j <= 5)
          {
            digitalWrite(ledArray[j], HIGH);
            j++;
            timer1 = 0;

          }
          k++;
          elapsedTime = 0;
        }

      }
      // attendo 1s poi vado allo stato 1

      if (elapsedTime >= waiting) {
        state = 1;
        elapsedTime = 0;
      }

      break;

    case 1:

      // led spenti rapidamente in modo scalare

      while (k >= 0) {
        if (timer2 >= t2)
        {
          if (j >= 0)
          {
            digitalWrite(ledArray[j], LOW);
            j--;
            timer2 = 0;
          }
          k--;
          elapsedTime = 0;
        }
      }
      // attendo 0.1s
      if (elapsedTime >= t2) {
        state = 2;

      }
      break;

    case 2:

      // led fade per 3 volte
      if (c <= 3)
      {
        while (a <= 255)
        {
          if (timer3 >= t3) {
            analogWrite(ledArray[3], a);
            timer3 = 0;
            a += 10;

          }

        }
        while (a >= 0)
        {
          if (timer3 >= t3) {
            analogWrite(ledArray[3], a);
            timer3 = 0;
            a -= 10;
          }
        }
        c++;
      }
      else {
        state = 3;
      }

      break;

    case 3:
      
      if (timer4 >= t5) {
        if (j <= 5) {
          digitalWrite(ledArray[j], HIGH);
          j++;
          timer4 = 0;
          if (timer5 >= t4) {
              digitalWrite(ledArray[j], LOW);
              timer5 = 0;
            }
          }
        }
      break;
  }
}

 

22 آذر 00 در 11:17
persp0lisi
3

افزودن دیدگاه

1 پاسخ ثبت شده است
0

سلام

از کتابخانه ElapsedMillis تا حالا استفاده نکرده ام اما با توجه از اطلاعاتی که در کتابخانه آماده است به نظر می آید یک کتابخانه تایمر (ترد) برای برد های AVR می باشد.
به شخصه از لایبراری Timer استفاده میکنم (لینک کتابخانه).

با توجه به عملکردی که کد شما میخواهید داشته باشد این کد را در لایبراری Timer نوشته ام می توانید استفاده کنید.

#include <Arduino.h>

#include "timer.h"

// Config Pin for LEDs
int LEDpin[6] = {7, 8, 9, 10, 11, 12};

// Timer object
Timer timer;

int counter = 0;

void countUp()
{
  switch (counter)
  {
  case 0:
    digitalWrite(LEDpin[0], HIGH);
    digitalWrite(LEDpin[1], HIGH);
    Serial.print("0\t\t");
    Serial.println(millis());
    break;

  case 9:
    digitalWrite(LEDpin[0], LOW);
    digitalWrite(LEDpin[1], LOW);
    Serial.print("9\t\t");
    Serial.println(millis());
    break;

  case 10:
    digitalWrite(LEDpin[2], HIGH);
    digitalWrite(LEDpin[3], HIGH);
    Serial.print("10\t\t");
    Serial.println(millis());
    break;

  case 19:
    digitalWrite(LEDpin[2], LOW);
    digitalWrite(LEDpin[3], LOW);
    Serial.print("19\t\t");
    Serial.println(millis());
    break;

  case 20:
    digitalWrite(LEDpin[4], HIGH);
    digitalWrite(LEDpin[5], HIGH);
    Serial.print("20\t\t");
    Serial.println(millis());
    break;

  case 29:
    digitalWrite(LEDpin[4], LOW);
    digitalWrite(LEDpin[5], LOW);
    Serial.print("29\t\t");
    Serial.println(millis());
    break;


  case 40:
    counter = -1;
  default:
    break;
  }

  counter += 1;
  // Serial.println(counter);
  // Serial.println(millis());
}
void setup()
{
  Serial.begin(9600);

  for (int i = 0; i <= 6; i++)
  {
    pinMode(LEDpin[i], OUTPUT);
    digitalWrite(LEDpin[i], LOW);
  }

  // Set the interval in milliseconds
  timer.setInterval(100);

  // Set our callback function
  timer.setCallback(countUp);

  // Start the timer
  timer.start();
}

void loop()
{
  // Update the timer
  timer.update();
}

البته می توانید تعداد case ها را در این کد نیز بیشتر کنید.

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

امیدوارم به شما کمک کرده باشم.

 
 
 
22 آذر 00 در 12:46
محمد دمیرچی
3670

افزودن دیدگاه


انجمن کافه‌ربات © 1400