• 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
Sterowanie dwoma paskami led z poziomu arduino
#1
Witam, zainspirowany filmikiem na yt postanowiłem wykonać podświetlenie monitora oraz biurka ledami adresowalnymi.

Podświetlenie monitora 103 diody ws2818b
Podświetlenie blatu biurka 69 diod ws2818b

Diody z monitora podpięte są pod PIN 6 a z blatu pod pin 8.

Mój problem polega na tym że nie wiem jak odpowiednio zaprogramować arduino aby jednocześnie monitor działał jako "ambilight"
a blat biurka podświetlał się w trybie "rainbow cycle"

Gdy wgram wgram tylko jedna opcję to działa prawidłowo, lecz chcę aby działało to jednocześnie.

Kod

Kod:
#include "FastLED.h"
#define NUM_LEDS_monitor 103
#define DATA_PIN_monitor 6

#define NUM_LEDS_pasek 69
#define DATA_PIN_pasek 8

#define serialRate 115200

uint8_t prefix[] = {'A', 'd', 'a'}, hi, lo, chk, i;

CRGB leds_monitor[NUM_LEDS_monitor];
CRGB leds_pasek[NUM_LEDS_pasek];

void setup() {
  FastLED.addLeds<NEOPIXEL, DATA_PIN_monitor>(leds_monitor, NUM_LEDS_monitor);
  FastLED.addLeds<NEOPIXEL, DATA_PIN_pasek>(leds_pasek, NUM_LEDS_pasek);
 
  // Initial RGB flash
  LEDS.showColor(CRGB(255, 0, 0));
  delay(500);
  LEDS.showColor(CRGB(0, 255, 0));
  delay(500);
  LEDS.showColor(CRGB(0, 0, 255));
  delay(500);
  LEDS.showColor(CRGB(0, 0, 0));
 
  Serial.begin(serialRate);
  Serial.print("Ada\n");
}

void loop() {
  rainbowCycle(20);
  for(i = 0; i < sizeof prefix; ++i) {
    waitLoop: while (!Serial.available()) ;;
    if(prefix[i] == Serial.read()) continue;
    i = 0;
    goto waitLoop;
  }
 
  while (!Serial.available()) ;;
  hi=Serial.read();
  while (!Serial.available()) ;;
  lo=Serial.read();
  while (!Serial.available()) ;;
  chk=Serial.read();
  if (chk != (hi ^ lo ^ 0x55)) {
    i=0;
    goto waitLoop;
  }
 
  memset(leds_monitor, 0, NUM_LEDS_monitor * sizeof(struct CRGB));
  for (uint8_t i = 0; i < NUM_LEDS_monitor; i++) {
    byte r, g, b;   
    while(!Serial.available());
    r = Serial.read();
    while(!Serial.available());
    g = Serial.read();
    while(!Serial.available());
    b = Serial.read();
    leds_monitor[i].r = r;
    leds_monitor[i].g = g;
    leds_monitor[i].b = b;
  }
 
  FastLED.show();
}
void rainbowCycle(int SpeedDelay) {
  byte *c;
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< NUM_LEDS_pasek; i++) {
      c=Wheel(((i * 256 / NUM_LEDS_pasek) + j) & 255);
      setPixel(i, *c, *(c+1), *(c+2));
    }
    showStrip();
    delay(SpeedDelay);
  }
}

byte * Wheel(byte WheelPos) {
  static byte c[3];

  if(WheelPos < 85) {
   c[0]=WheelPos * 3;
   c[1]=255 - WheelPos * 3;
   c[2]=0;
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   c[0]=255 - WheelPos * 3;
   c[1]=0;
   c[2]=WheelPos * 3;
  } else {
   WheelPos -= 170;
   c[0]=0;
   c[1]=WheelPos * 3;
   c[2]=255 - WheelPos * 3;
  }

  return c;
}
void setPixel(int Pixel, byte red, byte green, byte blue) {
   leds_pasek[Pixel].r = red;
   leds_pasek[Pixel].g = green;
   leds_pasek[Pixel].b = blue;
}
void showStrip() {
   FastLED.show();
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości