#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); // 짧은 지연 후 다음 측정
}