메뉴 건너뛰기

JY-SOFT

네오픽셀 제어를 하고싶습니다

nox 2019.10.17 19:17 조회 수 : 19

안녕하세요. 아두이노 초보자입니다. 

 

네오픽셀 세 개를 한 번에 제어하고 싶습니다.

지금 상태에서는 strip1, strip2, strip3이 따로 제어가 됩니다. 시리얼 값으로 1을 받아왔을때 strip1이 밝아졌다 꺼지고, 값이 2일때 strip2이 밝아졌다 꺼지고 값이 3 일때 strip3이 밝아졌다 꺼집니다. 

 

 

하지만, 1이 실행이 되고 2가 실행이 됬을때 strip1은 1대로 밝아졌다 꺼지고, strip 2는 2대로 밝아졌다 꺼지게 하고 싶은데 case1 -> case 2 가 실행이 될 때 strip1 이 밝아졌다 꺼지는게 모두 끝난 후 strip2 가 실행됩니다. 스트립 3개가 서로의 case에 영향을 받지 않고 실행되게 하고 싶은데 실행되는 케이스 순서대로, (먼저 실행되는 case의 스트립 발광이 끝난 후 다음 스트립이 발광되는 방식으로) 스트립이 밝아졌다 꺼지고 있습니다. 

 

즉, strip1이 밝아지고 어두워지는 로직으로 돌아가고 있는 상태에서도 시리얼 값 2가 받아와지면 strip2가 strip1이 끝날때 까지 기다리지 않고 바로 실행되는 코드를 짜고 싶습니다.

아래의 코드가 문제가 발생하는 현 코드입니다.  

 

int i, j;

#include <Adafruit_NeoPixel.h>

char val;

 

Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(24, 9, NEO_GRB + NEO_KHZ800);

Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(24, 10, NEO_GRB + NEO_KHZ800);

Adafruit_NeoPixel strip3 = Adafruit_NeoPixel(24, 11, NEO_GRB + NEO_KHZ800);

 

void setup() {

  Serial.begin(9600);

  strip1.begin();

  strip1.show();

 

  strip2.begin();

  strip2.show();

 

  strip3.begin();

  strip3.show();

 

}

void loop() {

  if (Serial.available()) {

    val = Serial.read();

  }

  if (val == '1' && millis() >= 4000) { //0to1

    brighten1();

    darken1();

    val = '0' ;

  }

  if (val == '2' && millis() >= 4000) { //0to1

    brighten2();

    darken2();

    val = '0' ;

  }

  if (val == '3' && millis() >= 4000) { //0to1

    brighten3();

    darken3();

    val = '0' ;

  }

  if (val == '0') {

    strip1.setPixelColor(24, -1, -1, -1);

  }

  if (val == '0') {

    strip2.setPixelColor(24, -1, -1, -1);

  }

  if (val == '0') {

    strip3.setPixelColor(24, -1, -1, -1);

  }

}

// 밝아짐

void brighten1() {

  //  uint16_t i, j;

  strip1.setPixelColor(24, 255, 255, 255);

  strip1.show();    // 불을 켜라

  delay(10);

  delay(1000); // 다 켜진채로 대기하라

}

//어두워짐

void darken1() {

  Serial.begin(9600);

  //  uint16_t i, j;

  for (j = 255; j >= 0; j--) {

    for (i = 0; i < strip1.numPixels(); i++) {

      strip1.setPixelColor(i, j, j, j);

    }

    strip1.show();

    delay(50);

    Serial.println(j);

  }

  // delay(4000);

}

 

// 밝아짐2

void brighten2() {

  //  uint16_t i, j;

  strip2.setPixelColor(24, 255, 255, 255);

  strip2.show();    // 불을 켜라

  delay(10);

  delay(1000); // 다 켜진채로 대기하라

}

//어두워짐2

void darken2() {

  Serial.begin(9600);

  //  uint16_t i, j;

  for (j = 255; j >= 0; j--) {

    for (i = 0; i < strip1.numPixels(); i++) {

      strip2.setPixelColor(i, j, j, j);

    }

    strip2.show();

    delay(50);

    Serial.println(j);

  }

  // delay(4000);

}

 

// 밝아짐3

void brighten3() {

  //  uint16_t i, j;

  strip3.setPixelColor(24, 255, 255, 255);

  strip3.show();    // 불을 켜

  delay(10);

  delay(1000); // 다 켜진채로 대기

}

//어두워짐3

void darken3() {

  Serial.begin(9600);

  //  uint16_t i, j;

  for (j = 255; j >= 0; j--) {

    for (i = 0; i < strip1.numPixels(); i++) {

      strip3.setPixelColor(i, j, j, j);

    }

    strip3.show();

    delay(50);

    Serial.println(j);

  }

  // delay(4000);

}