• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
LED blink millis
#1
Witam, dopiero co rozpoczynam swoją przygodę z Arduino, a potrzebuję napisać funkcję, która będzie mrugać diodą LED (dwa mignięcia, długa przerwa). 
Problem w tym, że nie mogę zastosować delay (potrzebuję wielowątkowości), próbuję użyć do tego funkcji millis, ale po wgraniu skeczu dioda świeci w sposób ciągły. 
Bardzo bym prosił o waszą pomoc, za którą z góry dziękuję.


Poniżej zamieszczam kod:
Kod:
#define LED_PIN 0
#define LED_ON_1 100
#define LED_OFF_1 500
#define LED_ON_2 700
#define LED_OFF_2 2300

unsigned long ms;
unsigned long msLast;

void setup()
{
 pinMode(LED_PIN, OUTPUT);
}

void loop()
{
 ms = millis();
 blinkLED();
}

void blinkLED()
{
   if (ms - msLast < LED_ON_1 ) {
     digitalWrite(LED_PIN, HIGH);
   }
   if (LED_ON_1 <= ms - msLast < LED_OFF_1 ) {
     digitalWrite(LED_PIN, LOW);
   }
   if (LED_OFF_1 <= ms - msLast < LED_ON_2 ) {
     digitalWrite(LED_PIN, HIGH);
   }
   if (LED_ON_2 <= ms - msLast < LED_OFF_2 ) {
     digitalWrite(LED_PIN, LOW);
   }
   if (ms - msLast == LED_OFF_2) {
     msLast = ms;
   }
}
 
Odpowiedź
#2
Okazało się, że dosyć mocno trzeba było zmodyfikować Twój program aby zaczął działać według wytyczonych przez Ciebie założeń.

Nie będę pisał co było źle bo za dużo pisania Smile

Wolę w tym przypadku podać Ci gotowy działający kod.
Został on napisany na "gołe" Arduino UNO.

Jako dioda testowa to została wykorzystana wiadomo ta co jest na płytce pod pinem 13.
Zmień sobie do własnych potrzeb na inną.

Również troszkę pozmieniałem czasy do testów ale to dla Ciebie nie problem aby wpisać takie jakie potrzebujesz.

Ponadto myslę, że dosyć łatwo będzie Ci program zmodyfikować gdybyś potrzebował dołożyć dodatkowe czasy mrugania diodą.

Poniżej kod:
Kod:
// -------------------------------------------------------------
//                                   LED BLINK MILLIS
// -------------------------------------------------------------

#define LED_PIN 13        // Dioda LED na porcie 13 (Arduino UNO).

#define LED_ON_1 300      // Pierwsza wartość momentu zapalenia diody LED na okres 200ms (500ms - 300ms).
#define LED_OFF_1 500     // Pierwsza wartość momentu zgaszenia diody LED.
#define LED_ON_2 1000     // Druga wartość momentu zapalenia diody LED na okres 500ms (1500ms - 1000ms).
#define LED_OFF_2 1500    // Druga wartość momentu zgaszenie diody LED.
#define LED_PAUSE 3000    // Wartość przerwy.

boolean LED;              // Dodatkowa zmienna określająca stan diody LED.

unsigned long ms;
unsigned long msLast;

void setup()
{
 pinMode(LED_PIN, OUTPUT);
}

void loop()
{
 ms = millis();
 blinkLED();
}

void blinkLED()
{
 if ((ms - msLast > LED_ON_1) & (ms - msLast < LED_OFF_1)) LED = 1;
 if ((ms - msLast > LED_OFF_1) & (ms - msLast < LED_ON_2)) LED = 0;

 if ((ms - msLast > LED_ON_2) & (ms - msLast < LED_OFF_2)) LED = 1;
 if ((ms - msLast > LED_OFF_2) & (ms - msLast < LED_PAUSE)) LED = 0;

 if (ms - msLast > LED_PAUSE) msLast = ms;

 if (LED == 0) digitalWrite(LED_PIN, LOW);
 else digitalWrite(LED_PIN, HIGH);
}

Pozdr.
ANT
Jeżeli pomogłem, to poproszę o punkt reputacji Big Grin
 
Odpowiedź
#3
Dziękuję za pomoc, temat rozwiązany.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości