Skocz do zawartości

Pomoc ze zmianą funkcji delay na millis


Darek97

Pomocna odpowiedź

Witam, na wstępie zaznaczę że nie znam się na kodowaniu arduino do końca dobrze, wręcz jestem zielony w tym temacie  (jestem mechanikiem samochodowym) no i potrzebuję pomocy w ogarnięciu programu do dynamicznych kierunkowskazów tylnych lamp.

Problem jest z światłami awaryjnymi czyli obydwa wyjścia powinny się zapalać w tym samym czasie a u mnie następuje strona po stronie, nie w tym samym czasie. Z tego co już udało mi się ustalić to właśnie funkcja delay jest za to odpowiedzialna, blokuje kod. 

Używam oczywiście biblioteki FastLED i pasków ledowych WS2812B, odczyt stanu czy są uruchomione kierunkowskazy odbywa się za pomocą transportów.

#include <FastLED.h>

#define NUM_LEDS 17
#define DATA_PIN_1 10
#define DATA_PIN_2 11
#define COLOR_ORDER GRB
#define CHIPSET WS2812B
#define BRIGHTNESS 255
#define time_end 10
#define time_start 0
#define BUTTON_PIN_1 9  
#define BUTTON_PIN_2 12  
bool buttonState_1 = false; 
bool buttonState_2 = false; 

CRGB leds_1[NUM_LEDS];
CRGB leds_2[NUM_LEDS]; 

void setup() {
  FastLED.addLeds<CHIPSET, DATA_PIN_1, COLOR_ORDER> (leds_1, NUM_LEDS); 
  FastLED.addLeds<CHIPSET, DATA_PIN_2, COLOR_ORDER> (leds_2, NUM_LEDS); 
  FastLED.setBrightness(BRIGHTNESS);
  FastLED.clear();
  FastLED.show();

  pinMode(BUTTON_PIN_1, INPUT_PULLUP );
  pinMode(BUTTON_PIN_2, INPUT_PULLUP ); 
}

void loop() {
  buttonState_1 = digitalRead(BUTTON_PIN_1); 
  buttonState_2 = digitalRead(BUTTON_PIN_2); 

  if (buttonState_1 == LOW) { 
    for (int i = 0; i < NUM_LEDS; i++) {
      leds_1[i] = CRGB(0, 0, 0);
       FastLED.show();
       delay(time_start);
    }

  } else { 
    for (int i = 0; i < NUM_LEDS; i++) {
      leds_1[i] = CRGB(255, 80, 0);
       FastLED.show();
       delay(time_end);
    }
  }
  
  if (buttonState_2 == LOW) { 
     for (int i = 0; i < NUM_LEDS; i++) {
      leds_2[i] = CRGB(0, 0, 0);
       FastLED.show();
       delay(time_start);
    }
  } else { 
    for (int i = 0; i < NUM_LEDS; i++) {
      leds_2[i] = CRGB(255, 80, 0);
       FastLED.show();
       delay(time_end);
    }
  }
}

Z góry dzięki za zainteresowanie się tematem.

 

Link do komentarza
Share on other sites

@Darek97 witam na forum 🙂 Jak dokładnie ma działać ten program? W tej chwili masz jakieś zmienne określające stan przycisków - jak rozumiem chodzi o włącznik lewego/prawego kierunkowskazu. A jak mają włączać się światła awaryjne? Czy masz do tego jakiś osobny przycisk?

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Ja tam nie chcę gasić zapału, ale jeśli to ma być na pojeździe mechanicznym poruszającym się po drogach publicznych to może być ładnie do czasu kontroli/kolizji a co gorsza wypadku. Oświetlenie zewnętrzne rzuca się w oczy. Jedziesz sobie drogą krajową, chcesz zjechać na parking leśny, dajesz w lewo i ktoś Cię wyprzedza. Puk i jest prawie impas.

Edytowano przez matsobdev
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Ja od razu założyłem, że to jakiś projekt hobbystyczny, rower lub makieta 🙂 Tak czy inaczej w ramach treningu można zdziałać takie projekt, tylko w tym przypadku faktycznie trzeba zmienić trochę więcej. Stąd moje pytanie o sposób sterowania "awaryjnymi".

Link do komentarza
Share on other sites

6 godzin temu, Treker napisał:

@Darek97 witam na forum 🙂 Jak dokładnie ma działać ten program? W tej chwili masz jakieś zmienne określające stan przycisków - jak rozumiem chodzi o włącznik lewego/prawego kierunkowskazu. A jak mają włączać się światła awaryjne? Czy masz do tego jakiś osobny przycisk?

Witam, dziękuje raz jeszcze za zainteresowanie się tematem ogólnie wszystko już rozwiązałem, niepotrzebnie używałem fukcji else, i tak jak ethanak napisał cytując klasyka "nie ale to by nic nie dało i tak, nie nie dałoby bo on był drugi w kulach" po prostu wystarczyło stworzyć wariacje dla każdego stanu logicznego przycisków i mamy to, działa bez zarzutów.

#include <FastLED.h>

#define NUM_LEDS 17
#define DATA_PIN_1 10
#define DATA_PIN_2 11
#define COLOR_ORDER GRB
#define CHIPSET WS2812B
#define BRIGHTNESS 255
#define time_blink 30
#define time_start 10
#define BUTTON_PIN_1 9  
#define BUTTON_PIN_2 12  
bool buttonState_1 = false; 
bool buttonState_2 = false; 

CRGB leds_1[NUM_LEDS];
CRGB leds_2[NUM_LEDS]; 

void setup() {
  FastLED.addLeds<CHIPSET, DATA_PIN_1, COLOR_ORDER> (leds_1, NUM_LEDS); 
  FastLED.addLeds<CHIPSET, DATA_PIN_2, COLOR_ORDER> (leds_2, NUM_LEDS); 
  FastLED.setBrightness(BRIGHTNESS);
  FastLED.clear();
  FastLED.show();

  pinMode(BUTTON_PIN_1, INPUT_PULLUP );
  pinMode(BUTTON_PIN_2, INPUT_PULLUP ); 
}

void loop() {
  buttonState_1 = digitalRead(BUTTON_PIN_1); 
  buttonState_2 = digitalRead(BUTTON_PIN_2); 
      
  if (buttonState_1 == HIGH && buttonState_2 == HIGH) { //awaryjne
    for (int i = 0; i < NUM_LEDS; i++) {
      leds_1[i] = CRGB(255, 80, 0);
      leds_2[i] = CRGB(255, 80, 0);
       FastLED.show();
       delay(time_start);
    }

  } //else { 
    //for (int i = 0; i < NUM_LEDS; i++) {
      //leds_1[i] = CRGB(0, 0, 0);
      //leds_2[i] = CRGB(0, 0, 0);
       //FastLED.show();
    //}
  //}
  
  if (buttonState_1 == HIGH && buttonState_2 ==LOW ) {  //kierunek 1
     for (int i = 0; i < NUM_LEDS; i++) {
      //leds_1[i] = CRGB(0, 0, 0);
      leds_2[i] = CRGB(255, 80, 0);
       FastLED.show();
       delay(time_blink);
    }
  } //else { 
    //for (int i = 0; i < NUM_LEDS; i++) {
      //leds_1[i] = CRGB(0, 0, 0);
      //leds_2[i] = CRGB(0, 0, 0);
       //FastLED.show();
    //}
  //}
  if (buttonState_1 == LOW && buttonState_2 ==HIGH ) {  //kierunek 2
     for (int i = 0; i < NUM_LEDS; i++) {
      leds_1[i] = CRGB(255, 80, 0);
      //leds_2[i] = CRGB(0, 0, 0);
       FastLED.show();
       delay(time_blink);
    }
  } //else { 
    //for (int i = 0; i < NUM_LEDS; i++) {
      //leds_1[i] = CRGB(0, 0, 0);
      //leds_2[i] = CRGB(0, 0, 0);
      // FastLED.show();
    //}
  //}
  if (buttonState_1 == LOW && buttonState_2 ==LOW ) {  //kierunki zgaszone 
     for (int i = 0; i < NUM_LEDS; i++) {
      leds_1[i] = CRGB(0, 0, 0);
      leds_2[i] = CRGB(0, 0, 0);
       FastLED.show();
    }
  }
}

Podrzucam moje wypociny, wirtuozem arduino nie jestem, dałem z siebie całe 30% ale chyba i tak nie jest źle jak na mechanika.

  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.