Skocz do zawartości

Pomoc ze zmianą funkcji delay na millis


Pomocna odpowiedź

Napisano

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.

 

@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
(edytowany)

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

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".

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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...