سؤال

وأنا بحاجة لمعرفة كيفية تتلاشى داخل وخارج المصابيح متعددة في وظيفة مع اردوينو. لا يمكن استخدام تأخير () لأن أمور أخرى تحتاج إلى تشغيل في حين أن ضوء يتلاشى. وهذا هو ما لديها حتى الآن ولكن لا يعمل.

int value = 0;                            // variable to keep the actual value 
int ledpin = 9;                           // light connected to digital pin 9
int p1 = 0;

void setup() 
{ 
  // nothing for setup 
  Serial.begin(9600);
} 

void loop() 
{ 
  inout(50, 30, 9, 0, 0);
  //inout(20, 20, 10);
} 

void inout(int inDelay, int outDelay, int ledpin, long previousmil, int done)
{

  if(millis() - previousmil>inDelay){
    if (value <=255){
      analogWrite(ledpin, value);          // sets the value (range from 0 to 255)         
      value+=5;
    }
    previousmil=millis();
  }

  if(value = 260)
    done = 1;

  if(millis() - previousmil>outDelay && done == 1){

    if (value >0){
      analogWrite(ledpin, value);          // sets the value (range from 0 to 255)                       

      value-=5;
    }
    previousmil=millis();
  }

}
هل كانت مفيدة؟

المحلول

والشيء الوحيد الواضح هو أن كنت قد حصلت على علم الدولة التي وسيلة لزيادة القيمة، ولكن كنت لا اختباره في أولا إذا. سيكون من الأفضل لهيكلة التعليمات البرمجية الخاصة بك أكثر قليلا. قد تحتاج أيضا لتتبع أكثر من قيمة واحدة إذا كان لديك أكثر من دبوس واحد، إلا إذا ينبغي أن جميع تتلاشى والخروج في نفس الوقت. في هذه الحالة سوف تكون أفضل حالا مع مجموعة من structs مع المعلمات لكل الصنوبر.

واحد طريقة استخدام تأخير مع مهام متعددة هو أن يكون كل عمل مهمة في الوقت الذي انقضى منذ الحلقة الماضية، وضبط تأخير في نهاية الحلقة للمرة المهام تأخذ. إذا حلقة الخاص بك هو شيء من هذا القبيل:

static unsigned long last_time = 0; // set to millis() in setup
static unsigned long refresh_period = 20; // 50Hz

void loop() 
{
    unsigned long time = millis();
    unsigned long delta = time - last_time;

    doTask1( delta );
    doTask2( delta );
    doTask3( delta );
    doTask4( delta );

    // as tasks may have taken some millis, adjust delay 
    unsigned long post_time = millis();

    if ( post_time - last_time < refresh_period )
        delay( refresh_period - ( post_time - last_time ) );

    last_time = time;
} 

وبعد ذلك سيتم تشغيل كل مهمة عن مرة واحدة كل 20ms، وسيتم مرت 20 أو حتى عدد المللي ثانية لتحديث دولته ل. حتى تحصل على بعض التأخير، ولكن كل شيء لديه فرصة للتحديث.

نصائح أخرى

والمضاربة، ولكن هذا يبدو خطأ:

if(value=260)

و( تذكيري خطأ آخر في C العالمين)

إذا كنت تريد رمي الأجهزة في المشكلة، يمكنك ربط المصابيح الخاصة بك إلى رقاقة تحكم خارجي، مثل TI TLC5940. تلك تتيح لك برمجة مستوى السطوع في LED والتعامل مع الانتاج PWM إلى المصابيح بشكل منفصل من وحدة المعالجة المركزية ATMEGA في اردوينو. تحتاج فقط إلى إعادة برمجة الشريحة TLC عندما تريد مستوى السطوع للتغيير. هناك مكتبة TLC المتاحة للتعامل مع التواصل مع رقاقة على مدونة جوجل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top