Arduino Playground is read-only starting December 31st, 2018. For more info please look at this Forum Post

Мигане без Delay: включване и изключване на светодиод без да се използва delay() командата.

Понякога се налага да мигаме със светодиода (или да извършваме друга, повтаряща се през определено време операция) докато трябва и да правим нещо друго (като например да следим дали не е натиснат бутон). В такива случаи не можем да използваме delay() командата защото тя ще спре всичко всички останали функции докато диода мига. Кодът тук показва как може да накараме светодиод да мига без да се използва delay(). Кодът следи кога за последно светодиодът е бил запален или изгасен и при всяко минаване през командите във loop() функцията проверява дали е минал определен интервал и ако е минал запалва светодиода ако той е загасен или го гаси, ако е бил запален.

Снимка

Схема

Код

/* Migane bez Delay()
* ------------
*
* pali i gasi svetodiod svurzan kum pin 13 bez da izpolzva delay() funkciyata
*
* ot David Cuartielles (2005)
*
* podobrena ot Tom Igoe (Juni 2009)
*
* bulgarski prevod ot Simeon Ianchev / Robotev.com (Septemvri 2009)
*/

int ledPin = 13;           // svetodiodut e svurzan kum tsifrov pin 13
int value = LOW;           // promenliva, koyato da sledi predishnoto 
                           //sustoyanie na pina
long previousMillis = 0;   // promenliva sledyashta koga za posledno e promenen  
                           // statusa na svetodioda
long interval = 1000;      // intervala, na koyto da miga pina (v milisekundi)

void setup()
{
  pinMode(ledPin, OUTPUT); // deklarira tsifrovia pin kato izhod
}

void loop()
{
  // v tazi chast ot programata slagame koda, koyto da se izpulnyava postoyanno 

  // proverka dali e vreme da smenim statusa na svetodioda, t.e. dali razlikata
  // mejdu nastoyashtoto pokazanie na chasovnika i posledniya put kogato 
  // svetodioda e promenil statusa si e po-golqm ot  
  // intervala, prez koyto iskame da miga svetodioda 

  if (millis() - previousMillis > interval) {
    previousMillis = millis();   	// zapomnyame koga za posledno e smenen statusa 


    // ako svetodioda e bil zapalen, go zagasyame i obratno

    if (value == LOW)
      value = HIGH;
    else
      value = LOW;

    digitalWrite(ledPin, value);
  }
}