#include <Adafruit_NeoPixel.h>
#define LED_PIN   6      // WS2812 데이터 핀
#define NUM_LEDS  8      // LED 개수
#define TRIG_PIN  9      // 초음파 센서 트리거 핀
#define ECHO_PIN  10     // 초음파 센서 에코 핀
Adafruit_NeoPixel strip(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
// 녹색을 제외한 7가지 색상 배열
uint32_t randomColors[7] = { 
  strip.Color(255, 0, 0),    // 빨강
  strip.Color(255, 127, 0),  // 주황
  strip.Color(255, 255, 0),  // 노랑
  strip.Color(0, 0, 255),    // 파랑
  strip.Color(75, 0, 130),   // 남색
  strip.Color(148, 0, 211),  // 보라
  strip.Color(0, 255, 255)   // 시안(청록)
};
uint32_t currentColor = strip.Color(0, 255, 0);  // 초기 기본 색상은 초록색
bool colorChanged = false;  // 100cm 초과 시 색상이 업데이트되었는지 추적
void setup() {
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  Serial.begin(9600);
  strip.begin();
  strip.show();  // LED 초기화
  randomSeed(analogRead(0));  // 랜덤 시드 초기화
}
void loop() {
  long duration;
  int distance;
  
  // 초음파 센서 작동: 트리거 펄스 생성
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);
  
  // 반사된 초음파 신호 측정 및 거리 계산 (cm)
  duration = pulseIn(ECHO_PIN, HIGH);
  distance = duration * 0.034 / 2;
  
  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm");
  
  // 거리 100cm보다 초과하면 LED는 모두 꺼짐, 그리고 색상 업데이트는 한 번만 수행
  if (distance > 100) {
    // 100cm를 넘었을 때 처음 한 번만 색상 업데이트
    if (!colorChanged) {
      int index = random(0, 7);  // 0~6 중 랜덤 선택
      currentColor = randomColors[index];
      colorChanged = true;      // 업데이트 완료
    }
    // LED 모두 끄기
    strip.clear();
    strip.show();
    
  } else {
    // 거리가 100cm 이하이면 기본 동작 (물 흐르듯 LED 효과)
    // 100cm 이하 상태에서는 상태 플래그 리셋하여 다음에 다시 >100cm가 되면 색상 변경이 가능하도록 함.
    colorChanged = false;
    
    // 거리 0cm: NUM_LEDS 모두 켜짐, 100cm: 모두 꺼짐
    int numLedsOn = map(distance, 0, 100, NUM_LEDS, 0);
    numLedsOn = constrain(numLedsOn, 0, NUM_LEDS);
    
    // LED 초기화 및 numLedsOn만 currentColor로 켜기
    strip.clear();
    for (int i = 0; i < numLedsOn; i++) {
      strip.setPixelColor(i, currentColor);
    }
    strip.show();
  }
  
  delay(100);  // 짧은 지연 후 다음 측정
}