Skocz do zawartości

Arduino switch ON/OFF + Rainbow taśma LED


Egzekutor27

Pomocna odpowiedź

Witam. Jest to mój pierwszy post na tym forum więc w razie błędów, proszę o wyrozumiałość.

Zamierzam zrobić sobie oświetlenie LED "rainbow", do półek szklanych w regale składających się z pięciu półeczek. Zdjęcie pokazuje aktualnie jeden kolor, z uwagi iż jest to pasek led składający się tylko z koloru niebieskiego. W miejsce paseczka (-ów) chciałbym zamiast niebieskiego, dać  LED RGB ( zdjęcie ). Jest to najzwyklejszy pasek RGB 12V. przeglądając stronki WWW, znalazłem gotowy kod, który po podłączeniu "na sucho" Arduino UNO ( NANO ) sprawuje się znakomicie. Nie za jasny kolor, ustawienia zmiany przejścia koloru dobrałem w/g własnego czasu. Tylko: Chciałbym abym zestaw włączył lub wyłączył się za pomocą mikroswitcha lub za pomocą Diody IR. W tym przypadku włącznikiem będą dwa klawisze pilota ( PLAY/ STOP )

Kod jest tylko na działanie "tęczy " od razu.

// Rainbow color changing RGB leds example
// I am using common cathode RGB leds
int PIN_RED = 9;
int PIN_GREEN = 10;
int PIN_BLUE = 11;
int counter = 0;

// Number of colors used for animating, higher = smoother and slower animation)
int numColors = 255;

  // The combination of numColors and animationDelay determines the
  // animation speed, I recommend a higher number of colors if you want
  // to slow down the animation. Higher number of colors = smoother color changing.
int animationDelay = 500; // number milliseconds before RGB LED changes to next color

void setup() {
  pinMode(PIN_RED, OUTPUT);
  pinMode(PIN_BLUE, OUTPUT);
  pinMode(PIN_GREEN, OUTPUT);
}
  

void loop() {
  // This part takes care of displaying the
  // color changing in reverse by counting backwards if counter
  // is above the number of available colors  
  float colorNumber = counter > numColors ? counter - numColors: counter;
  
  // Play with the saturation and brightness values
  // to see what they do
  float saturation = 1; // Between 0 and 1 (0 = gray, 1 = full color)
  float brightness = .40; // Between 0 and 1 (0 = dark, 1 is full brightness)
  float hue = (colorNumber / float(numColors)) * 360; // Number between 0 and 360
  long color = HSBtoRGB(hue, saturation, brightness); 
  
  // Get the red, blue and green parts from generated color
  int red = color >> 16 & 255;
  int green = color >> 8 & 255;
  int blue = color & 255;

  setColor(red, green, blue);
  
  // Counter can never be greater then 2 times the number of available colors
  // the colorNumber = line above takes care of counting backwards (nicely looping animation)
  // when counter is larger then the number of available colors
  counter = (counter + 1) % (numColors * 2);
  
  // If you uncomment this line the color changing starts from the
  // beginning when it reaches the end (animation only plays forward)
  // counter = (counter + 1) % (numColors);

  delay(animationDelay);
}

void setColor (unsigned char red, unsigned char green, unsigned char blue) 
{        
    analogWrite(PIN_RED, red);
    analogWrite(PIN_GREEN, green);
    analogWrite(PIN_BLUE, blue);
} 

long HSBtoRGB(float _hue, float _sat, float _brightness) {
    float red = 0.0;
    float green = 0.0;
    float blue = 0.0;
    
    if (_sat == 0.0) {
        red = _brightness;
        green = _brightness;
        blue = _brightness;
    } else {
        if (_hue == 360.0) {
            _hue = 0;
        }

        int slice = _hue / 60.0;
        float hue_frac = (_hue / 60.0) - slice;

        float aa = _brightness * (1.0 - _sat);
        float bb = _brightness * (1.0 - _sat * hue_frac);
        float cc = _brightness * (1.0 - _sat * (1.0 - hue_frac));
        
        switch(slice) {
            case 0:
                red = _brightness;
                green = cc;
                blue = aa;
                break;
            case 1:
                red = bb;
                green = _brightness;
                blue = aa;
                break;
            case 2:
                red = aa;
                green = _brightness;
                blue = cc;
                break;
            case 3:
                red = aa;
                green = bb;
                blue = _brightness;
                break;
            case 4:
                red = cc;
                green = aa;
                blue = _brightness;
                break;
            case 5:
                red = _brightness;
                green = aa;
                blue = bb;
                break;
            default:
                red = 0.0;
                green = 0.0;
                blue = 0.0;
                break;
        }
    }

    long ired = red * 255.0;
    long igreen = green * 255.0;
    long iblue = blue * 255.0;
    
    return long((ired << 16) | (igreen << 8) | (iblue));
}

Nie jestem jeszcze obcykany jeśli chodzi o komendy w programie Arduino.

Za poprawienie kodu i wszelką pomoc, będę bardzo wdzięczny.

1659629565486.jpg

1659630035811.jpg

Link do komentarza
Share on other sites

(edytowany)

Z diodą IR to nie jest problem. Na testy wymontowałem zwykłą z nieużywanego tunera DVB-T (fot1) i się sprawdza. Test robiony na pilocie i przełączało na przemian diody za pomocą klawiszy w pilocie.(fot2) Mam linijkę kodu, którym włączam pasek LED RGB właśnie tą diodą IR i własnym pilotem, zmienia się kolor na inny po X czasie, innym klawiszem mogę wyłączyć ale jak wezmę z powrotem aby włączyło to już tylko świeci się jeden kolor ( zielony ). Zamiast tego powinno włączyć się ponownie "tęcza" , a tak nie jest. Dlatego nie wiem, co jest w tym kodzie nie tak. Rozwiązałoby mi to całą sytuację poprawnego działania zestawu o którym pisze. Dzięki za odpowiedź.

#include <IRremote.h>

int red = 255;
int green = 255;
int blue = 255;
int redPin = 9;
int greenPin = 10;
int bluePin = 11;
int r = 0;
int g = 0;
int b = 0;
int msSpeed = 50; // milli seconds

const int REC_PIN = 7;
IRrecv irrecv(REC_PIN);
decode_results results;
unsigned long key_value = 0;
const int rainbow = 1;
int loopThis = 0;

void setup() {
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  
  irrecv.enableIRIn();
  irrecv.blink13(true);
}

void loop() {
  start:
  if (irrecv.decode(&results)){
        if (results.value == 0XFFFFFFFF)
          results.value = key_value;
        switch(results.value){
          case 0xFD58A7:      // OK on the remote
          if((red == 255) && (green == 255) && (blue == 255)) {
            green = 0;
            blue = 0;
          }
          loopThis = rainbow;
          break;
          case 0xFD20DF:      // STOP on the rmote
          loopThis = 0;
          red = 0;
          green = 0;
          blue = 0;
          RGB(red, green, blue);
          delay(50);
          break;      
        }
        key_value = results.value;
        irrecv.resume(); 
  }
  
  switch(loopThis){
    case rainbow:

    if((red == 255) && (green == 0) && (blue == 0)) {
      b = 0;
      g = 1;
    }
    if((red == 255) && (green == 255) && (blue == 0)) {
      g = 0;
      r = -1;
    }
    if((red == 0) && (green == 255) && (blue == 0)) {
      r = 0;
      b = 1;
    }
    if((red == 0) && (green == 255) && (blue == 255)) {
      b = 0;
      g = -1;
    }
    if((red == 0) && (green == 0) && (blue == 255)) {
      g = 0;
      r = 1;
    }
    if((red == 255) && (green == 0) && (blue == 255)) {
      r = 0;
      b = -1;
    }
    red = red + r;
    green = green + g;
    blue = blue + b;
    RGB(red, green, blue);
    delay(msSpeed);
    
    goto start;
    break;
  }
}

void RGB(int redValue, int greenValue, int blueValue) {
  analogWrite(redPin, redValue);
  analogWrite(greenPin, greenValue);
  analogWrite(bluePin, blueValue);
}

 

1659706789404.jpg

1659706789413.jpg

Edytowano przez Egzekutor27
przez przypadek wstawione zdjęcie między wierszami :)
Link do komentarza
Share on other sites

Po naciśnięciu STOP ustawiasz (red, green, blue) na (0, 0, 0). Jednocześnie cały czas są pamiętane wartości zmiany, czyli r, g, b. Jeżeli zatrzymasz animację krótko po jej wystartowaniu po włączeniu Arduino/wrzuceniu kodu, to jesteś na etapie, że (r, g, b) było (0, 1, 0). Także po ponownym naciśnięciu OK zacznie się rozświetlać zielony. Po pewnym czasie dojdzie do niego niebieski, bo trafi w warunek  if((red == 0) && (green == 255) && (blue == 0)) {. Ale jeżeli zrobisz STOP już w drugiej fazie animacji, to masz (r, g, b) = (-1, 0, 0), a w STOP zresetowałeś kolor na (0, 0, 0). Także po START red zacznie mieć wartości ujemne. Zasadniczo są tu po prostu problemy z logiką tego, co, kiedy, jak.

Jeżeli animacja działa Ci poza tym (nie przyglądałem się dogłębnie), to najprostszym rozwiązaniem jest nie zmieniać wartości red, green, blue po naciśnięciu STOP, a wywołać tam jedynie RGB(0, 0, 0). Wtedy, po OK, zaczniesz gdzie przerwałeś.

PS a z najdziwniejszych rzeczy, to użyłeś goto na początek loop(), gdzie dokładnie byś dotarł również, gdyby żadnego goto nie było.

Edytowano przez trainee
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

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.